diff --git a/src/gui/windows/invite.zig b/src/gui/windows/invite.zig index 47487cfa..008ba618 100644 --- a/src/gui/windows/invite.zig +++ b/src/gui/windows/invite.zig @@ -35,9 +35,8 @@ fn discoverIpAddress() void { } fn discoverIpAddressFromNewThread() void { - var sta = main.heap.StackAllocator.init(main.globalAllocator, 1 << 23); - defer sta.deinit(); - main.stackAllocator = sta.allocator(); + main.initThreadLocals(); + defer main.deinitThreadLocals(); discoverIpAddress(); } diff --git a/src/gui/windows/multiplayer.zig b/src/gui/windows/multiplayer.zig index cc0fe2d0..155ebff2 100644 --- a/src/gui/windows/multiplayer.zig +++ b/src/gui/windows/multiplayer.zig @@ -39,9 +39,8 @@ fn discoverIpAddress() void { } fn discoverIpAddressFromNewThread() void { - var sta = main.heap.StackAllocator.init(main.globalAllocator, 1 << 23); - defer sta.deinit(); - main.stackAllocator = sta.allocator(); + main.initThreadLocals(); + defer main.deinitThreadLocals(); discoverIpAddress(); } diff --git a/src/main.zig b/src/main.zig index 436dbe63..7818ca8b 100644 --- a/src/main.zig +++ b/src/main.zig @@ -42,11 +42,22 @@ const Vec3d = vec.Vec3d; pub threadlocal var stackAllocator: heap.NeverFailingAllocator = undefined; pub threadlocal var seed: u64 = undefined; +threadlocal var stackAllocatorBase: heap.StackAllocator = undefined; var global_gpa = std.heap.GeneralPurposeAllocator(.{.thread_safe = true}){}; var handled_gpa = heap.ErrorHandlingAllocator.init(global_gpa.allocator()); pub const globalAllocator: heap.NeverFailingAllocator = handled_gpa.allocator(); pub var threadPool: *utils.ThreadPool = undefined; +pub fn initThreadLocals() void { + seed = @bitCast(@as(i64, @truncate(std.time.nanoTimestamp()))); + stackAllocatorBase = heap.StackAllocator.init(globalAllocator, 1 << 23); + stackAllocator = stackAllocatorBase.allocator(); +} + +pub fn deinitThreadLocals() void { + stackAllocatorBase.deinit(); +} + fn cacheStringImpl(comptime len: usize, comptime str: [len]u8) []const u8 { return str[0..len]; } @@ -522,13 +533,11 @@ pub fn convertJsonToZon(jsonPath: []const u8) void { // TODO: Remove after #480 } pub fn main() void { // MARK: main() - seed = @bitCast(std.time.milliTimestamp()); defer if(global_gpa.deinit() == .leak) { std.log.err("Memory leak", .{}); }; - var sta = heap.StackAllocator.init(globalAllocator, 1 << 23); - defer sta.deinit(); - stackAllocator = sta.allocator(); + initThreadLocals(); + defer deinitThreadLocals(); initLogging(); defer deinitLogging(); diff --git a/src/network.zig b/src/network.zig index 94375bc6..6500eb41 100644 --- a/src/network.zig +++ b/src/network.zig @@ -559,9 +559,8 @@ pub const ConnectionManager = struct { // MARK: ConnectionManager pub fn run(self: *ConnectionManager) void { self.threadId = std.Thread.getCurrentId(); - var sta = main.heap.StackAllocator.init(main.globalAllocator, 1 << 23); - defer sta.deinit(); - main.stackAllocator = sta.allocator(); + main.initThreadLocals(); + defer main.deinitThreadLocals(); var lastTime: i64 = @truncate(std.time.nanoTimestamp()); while(self.running.load(.monotonic)) { diff --git a/src/server/server.zig b/src/server/server.zig index 03964c0c..fdc6dac5 100644 --- a/src/server/server.zig +++ b/src/server/server.zig @@ -432,9 +432,8 @@ fn update() void { // MARK: update() } pub fn start(name: []const u8, port: ?u16) void { - var sta = main.heap.StackAllocator.init(main.globalAllocator, 1 << 23); - defer sta.deinit(); - main.stackAllocator = sta.allocator(); + main.initThreadLocals(); + defer main.deinitThreadLocals(); std.debug.assert(!running.load(.monotonic)); // There can only be one server. init(name, port); defer deinit(); diff --git a/src/utils.zig b/src/utils.zig index 933b00e5..b72cb9c3 100644 --- a/src/utils.zig +++ b/src/utils.zig @@ -716,10 +716,8 @@ pub const ThreadPool = struct { // MARK: ThreadPool } fn run(self: *ThreadPool, id: usize) void { - // In case any of the tasks wants to allocate memory: - var sta = main.heap.StackAllocator.init(main.globalAllocator, 1 << 23); - defer sta.deinit(); - main.stackAllocator = sta.allocator(); + main.initThreadLocals(); + defer main.deinitThreadLocals(); var lastUpdate = std.time.milliTimestamp(); while(true) {