Cleaner SIGINT handling

Use a Mutex to wait for the signal handler to fire instead of checking
an atomic boolean over and over again.
This commit is contained in:
2026-01-06 22:26:49 -05:00
parent 3b490fc3c8
commit b6762ccb7c

View File

@@ -1,6 +1,5 @@
const std = @import("std"); const std = @import("std");
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
const AtomicValue = std.atomic.Value;
const DebugAllocator = std.heap.DebugAllocator; const DebugAllocator = std.heap.DebugAllocator;
const Sigaction = std.posix.Sigaction; const Sigaction = std.posix.Sigaction;
@@ -17,24 +16,15 @@ const Server = zits.Server;
const safe_build = builtin.mode == .Debug or builtin.mode == .ReleaseSafe; const safe_build = builtin.mode == .Debug or builtin.mode == .ReleaseSafe;
var keep_running = AtomicValue(bool).init(true); var exit_lock: std.Io.Mutex = .init;
var io: Io = undefined;
fn handleSigInt(sig: std.os.linux.SIG) callconv(.c) void { fn handleSigInt(sig: std.os.linux.SIG) callconv(.c) void {
_ = sig; _ = sig;
keep_running.store(false, .monotonic); exit_lock.unlock(io);
} }
pub fn main(outer_alloc: Allocator, server_config: ServerInfo) !void { pub fn main(outer_alloc: Allocator, server_config: ServerInfo) !void {
// Configure the signal action
const act = Sigaction{
.handler = .{ .handler = handleSigInt },
.mask = std.posix.sigemptyset(),
.flags = 0,
};
// Register the handler for SIGINT (Ctrl+C)
std.posix.sigaction(std.posix.SIG.INT, &act, null);
{ {
var dba: DebugAllocator(.{}) = .init; var dba: DebugAllocator(.{}) = .init;
dba.backing_allocator = outer_alloc; dba.backing_allocator = outer_alloc;
@@ -43,7 +33,19 @@ pub fn main(outer_alloc: Allocator, server_config: ServerInfo) !void {
var threaded: Threaded = .init(alloc, .{}); var threaded: Threaded = .init(alloc, .{});
defer threaded.deinit(); defer threaded.deinit();
const io = threaded.io(); io = threaded.io();
try exit_lock.lock(io);
// Configure the signal action
const act = Sigaction{
.handler = .{ .handler = handleSigInt },
.mask = std.posix.sigemptyset(),
.flags = 0,
};
// Register the handler for SIGINT (Ctrl+C)
std.posix.sigaction(std.posix.SIG.INT, &act, null);
var server: Server = .{ var server: Server = .{
.info = server_config, .info = server_config,
@@ -54,10 +56,7 @@ pub fn main(outer_alloc: Allocator, server_config: ServerInfo) !void {
defer server_task.cancel(io) catch {}; defer server_task.cancel(io) catch {};
// Block until Ctrl+C // Block until Ctrl+C
while (keep_running.load(.monotonic)) { try exit_lock.lock(io);
try io.sleep(.fromMilliseconds(1), .awake);
}
std.debug.print("\n", .{}); std.debug.print("\n", .{});
std.log.info("Shutting down...", .{}); std.log.info("Shutting down...", .{});
server_task.cancel(io) catch {}; server_task.cancel(io) catch {};