Fix some issues with asset unloading
This commit is contained in:
@@ -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()) {
|
||||||
|
Reference in New Issue
Block a user