added socket polling
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 18 Jan 2022 17:06:07 +0000 (11:06 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 18 Jan 2022 17:06:07 +0000 (11:06 -0600)
core/net/net.onyx
modules/onyx_runtime/onyx_runtime.c

index a214d19b6e8d712518aaf5e9c0a834ea0177856d..76776599b331514ba9a86e56a43dde9ae8c66223 100644 (file)
@@ -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;
index 8ca930f0f5c7fa5551f4f7841444a444d5ca7949..0ddc9934a6164cd95df1051fe7c75b0ae587d098 100644 (file)
@@ -15,6 +15,7 @@
     #include <dirent.h>
     #include <netdb.h>
     #include <netinet/in.h>
+    #include <poll.h>
 #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; i<params->data[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; i<params->data[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
 };