| ... | @@ -5,11 +5,12 @@ const mem = std.mem; | ... | @@ -5,11 +5,12 @@ const mem = std.mem; |
| 5 | const posix = std.os.posix; | 5 | const posix = std.os.posix; |
| 6 | | 6 | |
| 7 | pub const TcpServer = struct { | 7 | pub const TcpServer = struct { |
| 8 | handleRequestFn: async(&mem.Allocator) fn (&TcpServer, &const std.net.Address, &const std.os.File) void, | 8 | handleRequestFn: async<&mem.Allocator> fn (&TcpServer, &const std.net.Address, &const std.os.File) void, |
| 9 | | 9 | |
| 10 | loop: &Loop, | 10 | loop: &Loop, |
| 11 | sockfd: i32, | 11 | sockfd: i32, |
| 12 | accept_coro: ?promise, | 12 | accept_coro: ?promise, |
| | 13 | listen_address: std.net.Address, |
| 13 | | 14 | |
| 14 | waiting_for_emfile_node: PromiseNode, | 15 | waiting_for_emfile_node: PromiseNode, |
| 15 | | 16 | |
| ... | @@ -28,18 +29,20 @@ pub const TcpServer = struct { | ... | @@ -28,18 +29,20 @@ pub const TcpServer = struct { |
| 28 | .accept_coro = null, | 29 | .accept_coro = null, |
| 29 | .handleRequestFn = undefined, | 30 | .handleRequestFn = undefined, |
| 30 | .waiting_for_emfile_node = undefined, | 31 | .waiting_for_emfile_node = undefined, |
| | 32 | .listen_address = undefined, |
| 31 | }; | 33 | }; |
| 32 | } | 34 | } |
| 33 | | 35 | |
| 34 | pub fn listen(self: &TcpServer, address: &const std.net.Address, | 36 | pub fn listen(self: &TcpServer, address: &const std.net.Address, |
| 35 | handleRequestFn: async(&mem.Allocator) fn (&TcpServer, &const std.net.Address, &const std.os.File)void) !void | 37 | handleRequestFn: async<&mem.Allocator> fn (&TcpServer, &const std.net.Address, &const std.os.File)void) !void |
| 36 | { | 38 | { |
| 37 | self.handleRequestFn = handleRequestFn; | 39 | self.handleRequestFn = handleRequestFn; |
| 38 | | 40 | |
| 39 | try std.os.posixBind(self.sockfd, &address.sockaddr); | 41 | try std.os.posixBind(self.sockfd, &address.sockaddr); |
| 40 | try std.os.posixListen(self.sockfd, posix.SOMAXCONN); | 42 | try std.os.posixListen(self.sockfd, posix.SOMAXCONN); |
| | 43 | self.listen_address = std.net.Address.initPosix(try std.os.posixGetSockName(self.sockfd)); |
| 41 | | 44 | |
| 42 | self.accept_coro = try async(self.loop.allocator) (TcpServer.handler)(self); // TODO #817 | 45 | self.accept_coro = try async<self.loop.allocator> TcpServer.handler(self); |
| 43 | errdefer cancel ??self.accept_coro; | 46 | errdefer cancel ??self.accept_coro; |
| 44 | | 47 | |
| 45 | try self.loop.addFd(self.sockfd, ??self.accept_coro); | 48 | try self.loop.addFd(self.sockfd, ??self.accept_coro); |
| ... | @@ -60,10 +63,7 @@ pub const TcpServer = struct { | ... | @@ -60,10 +63,7 @@ pub const TcpServer = struct { |
| 60 | posix.SOCK_NONBLOCK | posix.SOCK_CLOEXEC)) |accepted_fd| | 63 | posix.SOCK_NONBLOCK | posix.SOCK_CLOEXEC)) |accepted_fd| |
| 61 | { | 64 | { |
| 62 | var socket = std.os.File.openHandle(accepted_fd); | 65 | var socket = std.os.File.openHandle(accepted_fd); |
| 63 | // TODO #817 | 66 | _ = async<self.loop.allocator> self.handleRequestFn(self, accepted_addr, socket) catch |err| switch (err) { |
| 64 | _ = async(self.loop.allocator) (self.handleRequestFn)(self, accepted_addr, | | |
| 65 | socket) catch |err| switch (err) | | |
| 66 | { | | |
| 67 | error.OutOfMemory => { | 67 | error.OutOfMemory => { |
| 68 | socket.close(); | 68 | socket.close(); |
| 69 | continue; | 69 | continue; |
| ... | @@ -161,7 +161,7 @@ test "listen on a port, send bytes, receive bytes" { | ... | @@ -161,7 +161,7 @@ test "listen on a port, send bytes, receive bytes" { |
| 161 | | 161 | |
| 162 | const Self = this; | 162 | const Self = this; |
| 163 | | 163 | |
| 164 | async(&mem.Allocator) fn handler(tcp_server: &TcpServer, _addr: &const std.net.Address, | 164 | async<&mem.Allocator> fn handler(tcp_server: &TcpServer, _addr: &const std.net.Address, |
| 165 | _socket: &const std.os.File) void | 165 | _socket: &const std.os.File) void |
| 166 | { | 166 | { |
| 167 | const self = @fieldParentPtr(Self, "tcp_server", tcp_server); | 167 | const self = @fieldParentPtr(Self, "tcp_server", tcp_server); |
| ... | @@ -198,5 +198,11 @@ test "listen on a port, send bytes, receive bytes" { | ... | @@ -198,5 +198,11 @@ test "listen on a port, send bytes, receive bytes" { |
| 198 | defer server.tcp_server.deinit(); | 198 | defer server.tcp_server.deinit(); |
| 199 | try server.tcp_server.listen(addr, MyServer.handler); | 199 | try server.tcp_server.listen(addr, MyServer.handler); |
| 200 | | 200 | |
| | 201 | var stderr_file = try std.io.getStdErr(); |
| | 202 | var stderr_stream = &std.io.FileOutStream.init(&stderr_file).stream; |
| | 203 | try stderr_stream.print("\nlistening at "); |
| | 204 | try server.tcp_server.listen_address.format(stderr_stream); |
| | 205 | try stderr_stream.print("\n"); |
| | 206 | |
| 201 | loop.run(); | 207 | loop.run(); |
| 202 | } | 208 | } |