server.zig

const num_children = 25;

pub fn main() !void {
    var arena_instance: std.heap.ArenaAllocator = .init(std.heap.page_allocator);
    defer arena_instance.deinit();
    const arena = arena_instance.allocator();

    const cpu_count = try std.Thread.getCpuCount();
    var env = try std.process.getEnvMap(arena);

    var job_server: std.job.Server = try .init(arena, @intCast(cpu_count), &env);
    defer job_server.deinit();

    var children: [num_children]std.process.Child = undefined;
    for (&children, 0..) |*c, child_num| {
        const child_num_str = try std.fmt.allocPrint(arena, "{d}", .{child_num});
        const argv = try arena.dupe([]const u8, &.{ switch (builtin.os.tag) {
            else => "./worker",
            .windows => ".\\worker.exe",
        }, child_num_str });
        c.* = .init(argv, arena);
        c.env_map = &env;
    }

    std.log.info("Spawning {d} workers on {d} CPUs", .{ children.len, cpu_count });
    for (&children) |*c| try c.spawn();
    for (&children) |*c| _ = try c.wait();
    std.log.info("All {d} workers exited", .{children.len});
}

const builtin = @import("builtin");
const std = @import("std");