aboutsummaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-03-16 20:41:46 +0100
committerJakub Konka <kubkon@jakubkonka.com>2023-03-18 21:53:26 +0100
commitf1e25cf43ec60075a4fc6f3eceb5a3af1f9f0712 (patch)
tree29533cb639a0c3fff0889f8d1233ef1a5cbafc8c /src/main.zig
parent266c81322e4e7b6c0b7f0a7fe9873b092aef7f54 (diff)
downloadzig-f1e25cf43ec60075a4fc6f3eceb5a3af1f9f0712.tar.gz
zig-f1e25cf43ec60075a4fc6f3eceb5a3af1f9f0712.zip
macho: add hot-code swapping poc
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig36
1 files changed, 30 insertions, 6 deletions
diff --git a/src/main.zig b/src/main.zig
index db28a5b09b..7d46f10a22 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -3851,15 +3851,39 @@ fn runOrTestHotSwap(
if (runtime_args_start) |i| {
try argv.appendSlice(all_args[i..]);
}
- var child = std.ChildProcess.init(argv.items, gpa);
- child.stdin_behavior = .Inherit;
- child.stdout_behavior = .Inherit;
- child.stderr_behavior = .Inherit;
+ switch (builtin.target.os.tag) {
+ .macos, .ios, .tvos, .watchos => {
+ const PosixSpawn = std.os.darwin.PosixSpawn;
+ var attr = try PosixSpawn.Attr.init();
+ defer attr.deinit();
+ const flags: u16 = std.os.darwin.POSIX_SPAWN_SETSIGDEF |
+ std.os.darwin.POSIX_SPAWN_SETSIGMASK |
+ std.os.darwin._POSIX_SPAWN_DISABLE_ASLR;
+ try attr.set(flags);
+
+ var arena_allocator = std.heap.ArenaAllocator.init(gpa);
+ defer arena_allocator.deinit();
+ const arena = arena_allocator.allocator();
+
+ const argv_buf = try arena.allocSentinel(?[*:0]u8, argv.items.len, null);
+ for (argv.items, 0..) |arg, i| argv_buf[i] = (try arena.dupeZ(u8, arg)).ptr;
+
+ const pid = try PosixSpawn.spawn(argv.items[0], null, attr, argv_buf, std.c.environ);
+ return pid;
+ },
+ else => {
+ var child = std.ChildProcess.init(argv.items, gpa);
+
+ child.stdin_behavior = .Inherit;
+ child.stdout_behavior = .Inherit;
+ child.stderr_behavior = .Inherit;
- try child.spawn();
+ try child.spawn();
- return child.id;
+ return child.id;
+ },
+ }
}
const AfterUpdateHook = union(enum) {