diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-03-16 20:41:46 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-03-18 21:53:26 +0100 |
| commit | f1e25cf43ec60075a4fc6f3eceb5a3af1f9f0712 (patch) | |
| tree | 29533cb639a0c3fff0889f8d1233ef1a5cbafc8c /src/main.zig | |
| parent | 266c81322e4e7b6c0b7f0a7fe9873b092aef7f54 (diff) | |
| download | zig-f1e25cf43ec60075a4fc6f3eceb5a3af1f9f0712.tar.gz zig-f1e25cf43ec60075a4fc6f3eceb5a3af1f9f0712.zip | |
macho: add hot-code swapping poc
Diffstat (limited to 'src/main.zig')
| -rw-r--r-- | src/main.zig | 36 |
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) { |
