Fix ThreadSanitizer warning in quickjs-libc (#562)

A global function pointer was getting accessed from multiple threads.
Replace it with an atomic integer and an immediate function call.
This commit is contained in:
Ben Noordhuis 2024-09-28 22:27:18 +02:00 committed by GitHub
parent 6d63b36c0a
commit 0bf36b98b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -87,11 +87,11 @@ extern char **environ;
#ifdef USE_WORKER #ifdef USE_WORKER
#include <pthread.h> #include <pthread.h>
#include "quickjs-c-atomics.h"
#endif #endif
#include "cutils.h" #include "cutils.h"
#include "list.h" #include "list.h"
#include "quickjs-c-atomics.h"
#include "quickjs-libc.h" #include "quickjs-libc.h"
#define MAX_SAFE_INTEGER (((int64_t) 1 << 53) - 1) #define MAX_SAFE_INTEGER (((int64_t) 1 << 53) - 1)
@ -167,7 +167,7 @@ typedef struct JSThreadState {
} JSThreadState; } JSThreadState;
static uint64_t os_pending_signals; static uint64_t os_pending_signals;
static int (*os_poll_func)(JSContext *ctx); static _Atomic int can_js_os_poll;
static void js_std_dbuf_init(JSContext *ctx, DynBuf *s) static void js_std_dbuf_init(JSContext *ctx, DynBuf *s)
{ {
@ -3827,7 +3827,7 @@ static const JSCFunctionListEntry js_os_funcs[] = {
static int js_os_init(JSContext *ctx, JSModuleDef *m) static int js_os_init(JSContext *ctx, JSModuleDef *m)
{ {
os_poll_func = js_os_poll; atomic_store(&can_js_os_poll, TRUE);
#ifdef USE_WORKER #ifdef USE_WORKER
{ {
@ -4058,7 +4058,7 @@ JSValue js_std_loop(JSContext *ctx)
} }
} }
if (!os_poll_func || os_poll_func(ctx)) if (!atomic_load(&can_js_os_poll) || js_os_poll(ctx))
break; break;
} }
done: done:
@ -4090,8 +4090,8 @@ JSValue js_std_await(JSContext *ctx, JSValue obj)
if (err < 0) { if (err < 0) {
js_std_dump_error(ctx1); js_std_dump_error(ctx1);
} }
if (os_poll_func) if (atomic_load(&can_js_os_poll))
os_poll_func(ctx); js_os_poll(ctx);
} else { } else {
/* not a promise */ /* not a promise */
ret = obj; ret = obj;