From 756373e0ba4664c2b07b510912fd567deb5ff9fd Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Thu, 26 Mar 2026 15:54:49 -0700 Subject: [PATCH] use arena_pool for cache get --- src/App.zig | 2 +- src/browser/HttpClient.zig | 10 ++++++---- src/network/Runtime.zig | 5 ++++- src/network/cache/Cache.zig | 17 ++--------------- 4 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/App.zig b/src/App.zig index d3ba2fec..d1579a36 100644 --- a/src/App.zig +++ b/src/App.zig @@ -55,7 +55,7 @@ pub fn init(allocator: Allocator, config: *const Config) !*App { .arena_pool = undefined, }; - app.network = try Network.init(allocator, config); + app.network = try Network.init(allocator, app, config); errdefer app.network.deinit(); app.platform = try Platform.init(); diff --git a/src/browser/HttpClient.zig b/src/browser/HttpClient.zig index d3ce01aa..3e4bcff7 100644 --- a/src/browser/HttpClient.zig +++ b/src/browser/HttpClient.zig @@ -293,9 +293,8 @@ pub fn request(self: *Client, req: Request) !void { return self.fetchRobotsThenProcessRequest(robots_url, req); } -fn serveFromCache(allocator: std.mem.Allocator, req: Request, cached: *const CachedResponse) !void { +fn serveFromCache(req: Request, cached: *const CachedResponse) !void { const response = Response.fromCached(req.ctx, cached); - defer cached.metadata.deinit(allocator); if (req.start_callback) |cb| { try cb(response); @@ -334,7 +333,10 @@ fn serveFromCache(allocator: std.mem.Allocator, req: Request, cached: *const Cac fn processRequest(self: *Client, req: Request) !void { if (self.network.cache) |*cache| { if (req.method == .GET) { - if (cache.get(self.allocator, req.url)) |cached| { + const arena = try self.network.app.arena_pool.acquire(); + defer self.network.app.arena_pool.release(arena); + + if (cache.get(arena, req.url)) |cached| { log.debug(.browser, "http.cache.get", .{ .url = req.url, .found = true, @@ -342,7 +344,7 @@ fn processRequest(self: *Client, req: Request) !void { }); defer req.headers.deinit(); - return serveFromCache(self.allocator, req, &cached); + return serveFromCache(req, &cached); } else { log.debug(.browser, "http.cache.get", .{ .url = req.url, .found = false }); } diff --git a/src/network/Runtime.zig b/src/network/Runtime.zig index fd4cefda..38c45fd7 100644 --- a/src/network/Runtime.zig +++ b/src/network/Runtime.zig @@ -31,6 +31,7 @@ const RobotStore = @import("Robots.zig").RobotStore; const WebBotAuth = @import("WebBotAuth.zig"); const Cache = @import("cache/Cache.zig"); +const App = @import("../App.zig"); const Runtime = @This(); const Listener = struct { @@ -46,6 +47,7 @@ const MAX_TICK_CALLBACKS = 16; allocator: Allocator, +app: *App, config: *const Config, ca_blob: ?net_http.Blob, robot_store: RobotStore, @@ -202,7 +204,7 @@ fn globalDeinit() void { libcurl.curl_global_cleanup(); } -pub fn init(allocator: Allocator, config: *const Config) !Runtime { +pub fn init(allocator: Allocator, app: *App, config: *const Config) !Runtime { globalInit(allocator); errdefer globalDeinit(); @@ -251,6 +253,7 @@ pub fn init(allocator: Allocator, config: *const Config) !Runtime { .available = available, .connections = connections, + .app = app, .robot_store = RobotStore.init(allocator), .web_bot_auth = web_bot_auth, .cache = cache, diff --git a/src/network/cache/Cache.zig b/src/network/cache/Cache.zig index cd176b91..17cf199c 100644 --- a/src/network/cache/Cache.zig +++ b/src/network/cache/Cache.zig @@ -28,9 +28,9 @@ kind: union(enum) { fs: FsCache, }, -pub fn get(self: *Cache, allocator: std.mem.Allocator, key: []const u8) ?CachedResponse { +pub fn get(self: *Cache, arena: std.mem.Allocator, key: []const u8) ?CachedResponse { return switch (self.kind) { - inline else => |*c| c.get(allocator, key), + inline else => |*c| c.get(arena, key), }; } @@ -187,19 +187,6 @@ pub const CachedMetadata = struct { .headers = headers, }; } - - pub fn deinit(self: CachedMetadata, allocator: std.mem.Allocator) void { - allocator.free(self.url); - allocator.free(self.content_type); - for (self.headers) |header| { - allocator.free(header.name); - allocator.free(header.value); - } - allocator.free(self.headers); - if (self.vary) |v| v.deinit(allocator); - if (self.etag) |e| allocator.free(e); - if (self.last_modified) |lm| allocator.free(lm); - } }; pub const CachedData = union(enum) {