diff --git a/src/core/ev.c b/src/core/ev.c index 2917039e..5f999764 100644 --- a/src/core/ev.c +++ b/src/core/ev.c @@ -603,11 +603,19 @@ void janet_addtimeout(double sec) { } void janet_ev_inc_refcount(void) { - janet_vm.extra_listeners++; +#ifdef JANET_WINDOWS + InterlockedIncrement(&janet_vm.extra_listeners); +#else + __atomic_add_fetch(&janet_vm.extra_listeners, 1, __ATOMIC_RELAXED); +#endif } void janet_ev_dec_refcount(void) { - janet_vm.extra_listeners--; +#ifdef JANET_WINDOWS + InterlockedDecrement(&janet_vm.extra_listeners); +#else + __atomic_add_fetch(&janet_vm.extra_listeners, -1, __ATOMIC_RELAXED); +#endif } /* Channels */ diff --git a/src/core/state.h b/src/core/state.h index b5c270e9..c7b3534b 100644 --- a/src/core/state.h +++ b/src/core/state.h @@ -157,7 +157,7 @@ struct JanetVM { JanetListenerState **listeners; size_t listener_count; size_t listener_cap; - size_t extra_listeners; + volatile size_t extra_listeners; /* used in signal handler, must be volatile */ JanetTable threaded_abstracts; /* All abstract types that can be shared between threads (used in this thread) */ JanetTable active_tasks; /* All possibly live task fibers - used just for tracking */ JanetTable signal_handlers;