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; }
#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;
#include <dirent.h>
#include <netdb.h>
#include <netinet/in.h>
+ #include <poll.h>
#endif
#include "types.h" // For POINTER_SIZE
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)
ONYX_FUNC(__net_connect)
ONYX_FUNC(__net_send)
ONYX_FUNC(__net_recv)
+ ONYX_FUNC(__net_poll_recv)
NULL
};