From 7eb035dc947ca85b10225b2004b3971b56052488 Mon Sep 17 00:00:00 2001 From: Hanchin Hsieh Date: Thu, 16 Oct 2025 10:13:04 +0800 Subject: [PATCH] feat(sockevent): support emscripten --- src/sockevent.h | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/sockevent.h b/src/sockevent.h index 2ae589a..baf85c8 100644 --- a/src/sockevent.h +++ b/src/sockevent.h @@ -3,6 +3,13 @@ #include +#if defined(__EMSCRIPTEN__) +#include +#include +#include +#include +#endif + #if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) #include @@ -57,11 +64,18 @@ sockevent_init(struct sockevent *e) { e->pipe[0] = socket_invalid; e->pipe[1] = socket_invalid; +#if defined(__EMSCRIPTEN__) + atomic_init(&e->e, 0); +#else atomic_int_init(&e->e, 0); +#endif } static inline void sockevent_close(struct sockevent *e) { +#if defined(__EMSCRIPTEN__) + atomic_store_explicit(&e->e, 0, memory_order_relaxed); +#else if (e->pipe[0] != socket_invalid) { closesocket(e->pipe[0]); e->pipe[0] = socket_invalid; @@ -70,10 +84,15 @@ sockevent_close(struct sockevent *e) { closesocket(e->pipe[1]); e->pipe[1] = socket_invalid; } +#endif } static inline int sockevent_open(struct sockevent *e) { +#if defined(__EMSCRIPTEN__) + atomic_store_explicit(&e->e, 0, memory_order_relaxed); + return 0; +#else if (e->pipe[0] != socket_invalid) return 0; socket_t fd = socket(AF_INET6, SOCK_STREAM, 0); @@ -131,10 +150,16 @@ sockevent_open(struct sockevent *e) { closesocket(fd); sockevent_close(e); return -1; +#endif } static inline void sockevent_trigger(struct sockevent *e) { +#if defined(__EMSCRIPTEN__) + if (atomic_exchange_explicit(&e->e, 1, memory_order_release) == 0) { + emscripten_futex_wake((volatile void *)&e->e, 1); + } +#else if (e->pipe[0] == socket_invalid) return; if (atomic_int_load(&e->e)) @@ -147,14 +172,26 @@ sockevent_trigger(struct sockevent *e) { #endif char tmp[1] = { 0 }; send(e->pipe[1], tmp, sizeof(tmp), flags); +#endif } static inline int sockevent_wait(struct sockevent *e) { +#if defined(__EMSCRIPTEN__) + for (;;) { + if (atomic_exchange_explicit(&e->e, 0, memory_order_acquire) != 0) { + return 1; + } + int rc = emscripten_futex_wait((volatile void *)&e->e, 0, INFINITY); + if (rc != 0 && rc != -EWOULDBLOCK) + return rc; + } +#else char tmp[128]; int r = recv(e->pipe[0], tmp, sizeof(tmp), 0); atomic_int_store(&e->e, 0); return r; +#endif } static inline socket_t