From 80816ae37629dd0d6d69c0f6476a29dc42e3cf7c Mon Sep 17 00:00:00 2001 From: june Date: Sun, 16 Aug 2026 11:36:54 +0200 Subject: [PATCH] main: optimize memory management --- src/main.zig | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/main.zig b/src/main.zig index 1c73b8b..92fbfc1 100644 --- a/src/main.zig +++ b/src/main.zig @@ -26,7 +26,7 @@ pub fn main(init: std.process.Init) !void { const config: maivi.Config = try .init(init.io, init.arena, init.environ_map); if (!maivi.dev) - maivi.rev = try rev_str(init, config.root); + maivi.rev = init.environ_map.get("MAIVI_REV") orelse try rev_str(init.io, init.gpa, config.root); defer if (maivi.rev) |rev| init.gpa.free(rev); try maivi.init(init.io, init.gpa, &config); @@ -44,40 +44,36 @@ pub fn main(init: std.process.Init) !void { try maivi.listen(); } -fn rev_str(init: std.process.Init, root: []const u8) ![]const u8 { - if (init.environ_map.get("MAIVI_REV")) |env_rev| return init.gpa.dupe(u8, env_rev); - +fn rev_str(io: std.Io, gpa: std.mem.Allocator, root: []const u8) ![]const u8 { if (!std.process.can_spawn) { std.log.err("error: version info cannot be retrieved from git. version must be provided using MAIVI_REV\n", .{}); return error.NoChildProcess; } - const git_rev_untrimmed = try spawn(init, &[_][]const u8{ + const rev = try spawn(io, gpa, &[_][]const u8{ "git", "-C", root, // affects the --git-dir argument "--git-dir", ".git", // affected by the -C argument "rev-parse", "HEAD", }); - defer init.gpa.free(git_rev_untrimmed); - const git_rev = try init.gpa.dupe(u8, std.mem.trim(u8, git_rev_untrimmed, " \n\r")); - return git_rev; + return std.mem.trim(u8, rev, std.ascii.whitespace[0..]); } -fn spawn(init: std.process.Init, argv: []const []const u8) ![]const u8 { - var child = try std.process.spawn(init.io, .{ +fn spawn(io: std.Io, gpa: std.mem.Allocator, argv: []const []const u8) ![]const u8 { + var child = try std.process.spawn(io, .{ .argv = argv, - .environ_map = init.environ_map, .stdin = .ignore, .stdout = .pipe, .stderr = .ignore, }); + errdefer child.kill(io); - var stdout_reader = child.stdout.?.readerStreaming(init.io, &.{}); - const stdout = stdout_reader.interface.allocRemaining(init.gpa, .limited(0x100)) catch return error.ReadFailure; - errdefer init.gpa.free(stdout); + var stdout_reader = child.stdout.?.readerStreaming(io, &.{}); + const stdout = stdout_reader.interface.allocRemaining(gpa, .limited(0x80)) catch return error.ReadFailure; + errdefer gpa.free(stdout); - const term = try child.wait(init.io); + const term = try child.wait(io); switch (term) { .exited => |code| { if (code != 0) { -- 2.51.2