From ca4c1e4259318faee1b3d239dcc5eef08cdeea08 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 20 Aug 2023 08:49:49 -0500 Subject: [PATCH] Try to use atomics inside signal handler for ref count. --- src/core/ev.c | 12 ++++++++++-- src/core/state.h | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) 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;