diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/macos.zig | 14 | ||||
| -rw-r--r-- | src/main.zig | 5 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/macos.zig b/src/macos.zig index 3ff8bdfa..b19c5996 100644 --- a/src/macos.zig +++ b/src/macos.zig @@ -692,8 +692,15 @@ export fn pardes_init(runtime: ?*const Runtime, cols_arg: u16, rows_arg: u16) c_ return 0; } +/// The shell's gpa in a Debug build, as std.start's is for the others. +var debug_gpa: std.heap.DebugAllocator(.{}) = .init; + fn initCore(runtime: ?*const Runtime, cols_arg: u16, rows_arg: u16) !void { - const gpa = std.heap.smp_allocator; + // The allocator every other shell gets from std.start: a DebugAllocator + // in Debug, libc's malloc otherwise. libc's measured at least as fast as + // std.heap.smp_allocator everywhere and faster on MuPDF's page-sized + // rasters, so this shell no longer differs. + const gpa = if (builtin.mode == .Debug) debug_gpa.allocator() else std.heap.c_allocator; const allocs = pardes.memory.init(gpa); errdefer pardes.memory.deinit(); @@ -824,6 +831,11 @@ export fn pardes_deinit() void { st.threaded.deinit(); st.gpa.destroy(st.threaded); pardes.memory.deinit(); + // Leaks are logged and do not fail, as std.start treats the others'. + if (builtin.mode == .Debug) { + _ = debug_gpa.deinit(); + debug_gpa = .init; + } state = null; } diff --git a/src/main.zig b/src/main.zig index 050cee60..86c302fe 100644 --- a/src/main.zig +++ b/src/main.zig @@ -138,6 +138,11 @@ fn webMain() !void { try @import("gui/gui.zig").run(.{}, .{}, null); } +// init.gpa, what the tty, gui and detached shells allocate from, is +// std.start's: a DebugAllocator in Debug and, since we link libc, libc's +// malloc otherwise. Kept on purpose: glibc's malloc was measured at least as +// fast as std.heap.smp_allocator on every scenario and faster on MuPDF's +// page-sized rasters. macos.zig makes the same choice for itself. fn nativeMain(init: std.process.Init) !void { var stderr_probe: [64]u8 = undefined; _ = std.debug.lockStderr(&stderr_probe); |
