From f8b7555495d1aac9b5c28f7b8a807dc9e18d6416 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 18 Jan 2022 11:06:07 -0600 Subject: [PATCH] added socket polling --- core/net/net.onyx | 24 ++++++++++++++++++++++ modules/onyx_runtime/onyx_runtime.c | 31 +++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/core/net/net.onyx b/core/net/net.onyx index a214d19b..76776599 100644 --- a/core/net/net.onyx +++ b/core/net/net.onyx @@ -89,6 +89,29 @@ socket_accept :: (s: ^Socket) -> Socket { return new_socket; } +socket_poll_all :: (changed: ^[] ^Socket, timeout: i32, sockets: [] ^Socket) { + assert(changed.count >= sockets.count, "Not enough space."); + + handles := (cast(^Socket.Handle) alloc.from_stack(sockets.count * sizeof Socket.Handle))[0 .. sockets.count]; + for i: sockets.count { + handles[i] = sockets[i].handle; + } + + handles_changed := cast(^Socket.Handle) alloc.from_stack(sockets.count * sizeof Socket.Handle); + num_changed := __net_poll_recv(handles, timeout, handles_changed); + + changed.count = 0; + for i: num_changed { + for sockets { + if handles_changed[i] == it.handle { + changed.data[changed.count] = it; + changed.count += 1; + continue continue; + } + } + } +} + socket_send :: (s: ^Socket, data: [] u8) -> i32 { sent := __net_send(s.handle, data); if sent < 0 { s.vtable = null; } @@ -155,6 +178,7 @@ socket_recv_into :: (s: ^Socket, buffer: [] u8) -> i32 { #package __net_connect :: (handle: Socket.Handle, host: str, port: u16) -> SocketError --- #package __net_send :: (handle: Socket.Handle, data: [] u8) -> i32 --- #package __net_recv :: (handle: Socket.Handle, data: [] u8) -> i32 --- + #package __net_poll_recv :: (handle: [] Socket.Handle, timeout: i32, out_recv: ^Socket.Handle) -> i32 --- } #operator >= macro (a, b: Socket.Handle) => cast(u32) a >= cast(u32) b; diff --git a/modules/onyx_runtime/onyx_runtime.c b/modules/onyx_runtime/onyx_runtime.c index 8ca930f0..0ddc9934 100644 --- a/modules/onyx_runtime/onyx_runtime.c +++ b/modules/onyx_runtime/onyx_runtime.c @@ -15,6 +15,7 @@ #include #include #include + #include #endif #include "types.h" // For POINTER_SIZE @@ -945,6 +946,35 @@ ONYX_DEF(__net_recv, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { return NULL; } +ONYX_DEF(__net_poll_recv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { + #ifdef _BH_LINUX + int i, res, cursor; + struct pollfd* fds; + + fds = alloca(params->data[1].of.i32 * 8); // Guessed size of pollfd + + for (i=0; idata[1].of.i32; i++) { + fds[i].fd = *(i32 *) ONYX_PTR(params->data[0].of.i32 + 4 * i); + fds[i].events = POLLIN; + fds[i].revents = 0; + } + + res = poll(fds, params->data[1].of.i32, params->data[2].of.i32); + + cursor = 0; + for (i=0; idata[1].of.i32; i++) { + if (fds[i].revents & POLLIN) { + *(i32 *) ONYX_PTR(params->data[3].of.i32 + 4 * cursor) = fds[i].fd; + cursor++; + } + } + + results->data[0] = WASM_I32_VAL(cursor); + #endif + + return NULL; +} + ONYX_LIBRARY { ONYX_FUNC(__file_open_impl) @@ -986,6 +1016,7 @@ ONYX_LIBRARY { ONYX_FUNC(__net_connect) ONYX_FUNC(__net_send) ONYX_FUNC(__net_recv) + ONYX_FUNC(__net_poll_recv) NULL }; -- 2.25.1