fix: make sure project state is freed with the correct allocator

This commit is contained in:
CJ van den Berg 2025-11-26 15:55:47 +01:00
parent 20129ea773
commit c8840f0756
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9
2 changed files with 7 additions and 4 deletions

View file

@ -75,17 +75,18 @@ pub fn open(rel_project_directory: []const u8) (ProjectManagerError || FileSyste
const project_state_allocator = std.heap.c_allocator; const project_state_allocator = std.heap.c_allocator;
var project_state_mutex: std.Thread.Mutex = .{}; var project_state_mutex: std.Thread.Mutex = .{};
var project_state: ProjectStateMap = .empty; var project_state: ProjectStateMap = .empty;
const ProjectStateMap = std.StringHashMapUnmanaged([]const u8); const ProjectStateMap = std.StringHashMapUnmanaged(std.array_list.Managed(u8));
fn get_project_state(project_directory: []const u8) ?[]const u8 { fn get_project_state(project_directory: []const u8) ?[]const u8 {
project_state_mutex.lock(); project_state_mutex.lock();
defer project_state_mutex.unlock(); defer project_state_mutex.unlock();
return project_state.get(project_directory); return if (project_state.get(project_directory)) |state| state.items else null;
} }
pub fn store_state(project_directory: []const u8, state: []const u8) error{OutOfMemory}!void { pub fn store_state(project_directory: []const u8, state: std.array_list.Managed(u8)) error{OutOfMemory}!void {
project_state_mutex.lock(); project_state_mutex.lock();
defer project_state_mutex.unlock(); defer project_state_mutex.unlock();
if (project_state.fetchRemove(project_directory)) |old_state| old_state.value.deinit();
try project_state.put(project_state_allocator, try project_state_allocator.dupe(u8, project_directory), state); try project_state.put(project_state_allocator, try project_state_allocator.dupe(u8, project_directory), state);
} }

View file

@ -403,7 +403,9 @@ const cmds = struct {
try self.write_state(&state_writer.writer); try self.write_state(&state_writer.writer);
try state_writer.writer.flush(); try state_writer.writer.flush();
const old_project = tp.env.get().str("project"); const old_project = tp.env.get().str("project");
try project_manager.store_state(old_project, try state_writer.toOwnedSlice()); var state_al = state_writer.toArrayList();
const state = state_al.toManaged(self.allocator);
try project_manager.store_state(old_project, state);
} }
const project_state = try project_manager.open(project_dir); const project_state = try project_manager.open(project_dir);