From 96942960a9208777255d727f3a8d54b2e5f59795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Sat, 28 Feb 2026 22:38:16 +0900 Subject: [PATCH] mcp: reuse arena allocator for message processing --- src/mcp/router.zig | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/mcp/router.zig b/src/mcp/router.zig index 8966b922..3c5c4389 100644 --- a/src/mcp/router.zig +++ b/src/mcp/router.zig @@ -15,6 +15,9 @@ pub fn processRequests(server: *Server) !void { server.is_running.store(true, .seq_cst); + var arena: std.heap.ArenaAllocator = .init(server.allocator); + defer arena.deinit(); + while (server.is_running.load(.seq_cst)) { const msg = stdin.interface.adaptToOldInterface().readUntilDelimiterAlloc(server.allocator, '\n', 1024 * 1024 * 10) catch |err| { if (err == error.EndOfStream) break; @@ -24,13 +27,13 @@ pub fn processRequests(server: *Server) !void { if (msg.len == 0) continue; - var arena: std.heap.ArenaAllocator = .init(server.allocator); - defer arena.deinit(); - handleMessage(server, arena.allocator(), msg) catch |err| { log.warn(.mcp, "Error processing message", .{ .err = err }); // We should ideally send a parse error response back, but it's hard to extract the ID if parsing failed entirely. }; + + // 32KB: avoid reallocations while keeping memory footprint low. + _ = arena.reset(.{ .retain_with_limit = 32 * 1024 }); } }