diff --git a/src/oar.zig b/src/oar.zig index 1a1cb77..743057a 100644 --- a/src/oar.zig +++ b/src/oar.zig @@ -3,7 +3,7 @@ const sys = @import("./sys.zig"); const table = @import("./table.zig"); /// -/// +/// Thin file-wrapper and in-memory layout cache of an OAR archive file. /// pub const Archive = struct { file_access: sys.FileAccess, @@ -17,15 +17,28 @@ pub const Archive = struct { }; /// - /// + /// See [std.mem.Allocator.Error]. /// pub const InitError = std.mem.Allocator.Error; /// + /// In-memory archive layout cache. /// + /// As the archive is queried via [find], the cache is lazily assembled with the absolute + /// offsets of each queried file. /// const IndexCache = table.Hashed([]const u8, u64, table.string_context); + /// + /// Deinitializes the index cache of `archive`, freeing all associated memory. + /// + /// **Note** that this does nothing to the [FileAccess] value that was provided as part of + /// [init]. + /// + pub fn deint(archive: *Archive) void { + archive.index_cache.deinit(); + } + /// /// Finds an entry matching `entry_path` in `archive`. /// @@ -90,11 +103,17 @@ pub const Archive = struct { } /// + /// Attempts to initialize a new [Archive] with `cache_allocator` as the allocator for managing + /// the in-memory archive layout caches and `archive_file_access` as the currently open archive + /// file. /// + /// **Note** that `archive_file_access` does nothing to manage the lifetime of the open file. /// - pub fn init(allocator: std.mem.Allocator, archive_file_access: sys.FileAccess) InitError!Archive { + pub fn init(cache_allocator: std.mem.Allocator, + archive_file_access: sys.FileAccess) InitError!Archive { + return Archive{ - .index_cache = try IndexCache.init(allocator), + .index_cache = try IndexCache.init(cache_allocator), .file_access = archive_file_access, }; } diff --git a/src/sys.zig b/src/sys.zig index d0a4aee..cdda969 100644 --- a/src/sys.zig +++ b/src/sys.zig @@ -102,9 +102,10 @@ pub const AppContext = opaque { } } + implementation.data_file_system.archive.instance.deint(); + ext.SDL_free(implementation.user_path_prefix); ext.SDL_DestroyMutex(implementation.message_mutex); ext.SDL_DestroySemaphore(implementation.message_semaphore); - ext.SDL_free(implementation.user_path_prefix); } ///