From 5bffa5c3e685fa4d48830b8d0c0c323d6ed7c4ef Mon Sep 17 00:00:00 2001 From: Aarnav Tale Date: Mon, 29 Apr 2024 13:53:42 -0400 Subject: [PATCH] tcp: explicitly close the socket with xev --- src/tcp/Server.zig | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/tcp/Server.zig b/src/tcp/Server.zig index 7be88506d..4df05b65c 100644 --- a/src/tcp/Server.zig +++ b/src/tcp/Server.zig @@ -66,7 +66,7 @@ pub fn init( /// Deinitializes the server pub fn deinit(self: *Server) void { - log.info("shutting down server", .{}); + self.close(); self.comp_pool.deinit(); self.sock_pool.deinit(); self.buf_pool.deinit(); @@ -77,6 +77,7 @@ pub fn deinit(self: *Server) void { pub fn start(self: *Server) !void { try self.socket.bind(self.addr); try self.socket.listen(self.max_clients); + try connections.startAccepting(self); log.info("bound server to socket={any}", .{self.socket}); @@ -87,6 +88,27 @@ pub fn start(self: *Server) !void { } } +/// Closes the server socket +pub fn close(self: *Server) void { + log.info("closing server socket", .{}); + var c: xev.Completion = undefined; + self.socket.close(&self.loop, &c, bool, null, (struct { + fn callback( + _: ?*bool, + _: *xev.Loop, + _: *xev.Completion, + _: xev.TCP, + e: xev.TCP.CloseError!void, + ) xev.CallbackAction { + e catch { + log.err("failed to close server socket: {any}", .{e}); + }; + + return .disarm; + } + }).callback); +} + /// Convenience function to destroy a buffer in our pool pub fn destroyBuffer(self: *Server, buf: []const u8) void { self.buf_pool.destroy(@alignCast(