Fix some issues with asset unloading

This commit is contained in:
duck
2025-09-20 23:22:30 +05:00
parent fc6ebb73b8
commit 640e7bed86

View File

@@ -176,6 +176,7 @@ pub fn deinit() void {
if (worker.thread == null) continue; if (worker.thread == null) continue;
worker.thread.?.join(); worker.thread.?.join();
} }
updateFree();
var iter = Assets.asset_map.valueIterator(); var iter = Assets.asset_map.valueIterator();
while (iter.next()) |asset| { while (iter.next()) |asset| {
std.debug.assert(asset.*.counter == 0); std.debug.assert(asset.*.counter == 0);
@@ -204,22 +205,28 @@ pub fn update() void {
Assets.next_worker_update = 0; Assets.next_worker_update = 0;
} }
Assets.free_board_mutex.lock(); updateFree();
defer Assets.free_board_mutex.unlock(); }
if (Assets.free_board.items.len == 0) return;
fn updateFree() void {
// TODO: Delegate freeing to worker threads? // TODO: Delegate freeing to worker threads?
Assets.asset_map_mutex.lock(); Assets.asset_map_mutex.lock();
defer Assets.asset_map_mutex.unlock(); defer Assets.asset_map_mutex.unlock();
Assets.free_board_mutex.lock();
while (Assets.free_board.pop()) |request| { while (Assets.free_board.pop()) |request| {
if (@atomicLoad(usize, &request.counter, .monotonic) == 0) { if (@atomicLoad(usize, &request.counter, .monotonic) == 0) {
if (!Assets.asset_map.remove(.{ .type = request.type, .path = request.path })) continue; if (!Assets.asset_map.remove(.{ .type = request.type, .path = request.path })) continue;
if (request.state == .loaded) if (request.state == .loaded) {
Assets.free_board_mutex.unlock();
request.unload(Game.alloc); request.unload(Game.alloc);
Assets.free_board_mutex.lock();
}
Game.alloc.free(request.path); Game.alloc.free(request.path);
Game.alloc.destroy(request); Game.alloc.destroy(request);
} }
} }
Assets.free_board_mutex.unlock();
} }
pub fn load(comptime asset_type: AssetType, path: []const u8) AssetContainer(asset_type.getType()) { pub fn load(comptime asset_type: AssetType, path: []const u8) AssetContainer(asset_type.getType()) {