Make JS_NewClassID thread aware

It's as thread-safe as JSRuntime, which isn't thread-safe, but multiple
threads can now allocate them on different runtimes without a problem.
This commit is contained in:
Saúl Ibarra Corretgé 2023-11-20 12:16:46 +01:00
parent b56a82d19f
commit 5ce2957e23
4 changed files with 18 additions and 16 deletions

View file

@ -123,10 +123,11 @@ static const JSCFunctionListEntry js_point_proto_funcs[] = {
static int js_point_init(JSContext *ctx, JSModuleDef *m)
{
JSValue point_proto, point_class;
JSRuntime *rt = JS_GetRuntime(ctx);
/* create the Point class */
JS_NewClassID(&js_point_class_id);
JS_NewClass(JS_GetRuntime(ctx), js_point_class_id, &js_point_class);
JS_NewClassID(rt, &js_point_class_id);
JS_NewClass(rt, js_point_class_id, &js_point_class);
point_proto = JS_NewObject(ctx);
JS_SetPropertyFunctionList(ctx, point_proto, js_point_proto_funcs, countof(js_point_proto_funcs));

View file

@ -1516,12 +1516,13 @@ static const JSCFunctionListEntry js_std_file_proto_funcs[] = {
static int js_std_init(JSContext *ctx, JSModuleDef *m)
{
JSValue proto;
JSRuntime *rt = JS_GetRuntime(ctx);
/* FILE class */
/* the class ID is created once */
JS_NewClassID(&js_std_file_class_id);
JS_NewClassID(rt, &js_std_file_class_id);
/* the class is created once per runtime */
JS_NewClass(JS_GetRuntime(ctx), js_std_file_class_id, &js_std_file_class);
JS_NewClass(rt, js_std_file_class_id, &js_std_file_class);
proto = JS_NewObject(ctx);
JS_SetPropertyFunctionList(ctx, proto, js_std_file_proto_funcs,
countof(js_std_file_proto_funcs));
@ -3658,20 +3659,20 @@ static const JSCFunctionListEntry js_os_funcs[] = {
static int js_os_init(JSContext *ctx, JSModuleDef *m)
{
JSRuntime *rt = JS_GetRuntime(ctx);
os_poll_func = js_os_poll;
/* OSTimer class */
JS_NewClassID(&js_os_timer_class_id);
JS_NewClass(JS_GetRuntime(ctx), js_os_timer_class_id, &js_os_timer_class);
JS_NewClassID(rt, &js_os_timer_class_id);
JS_NewClass(rt, js_os_timer_class_id, &js_os_timer_class);
#ifdef USE_WORKER
{
JSRuntime *rt = JS_GetRuntime(ctx);
JSThreadState *ts = JS_GetRuntimeOpaque(rt);
JSValue proto, obj;
/* Worker class */
JS_NewClassID(&js_worker_class_id);
JS_NewClass(JS_GetRuntime(ctx), js_worker_class_id, &js_worker_class);
JS_NewClassID(rt, &js_worker_class_id);
JS_NewClass(rt, js_worker_class_id, &js_worker_class);
proto = JS_NewObject(ctx);
JS_SetPropertyFunctionList(ctx, proto, js_worker_proto_funcs, countof(js_worker_proto_funcs));

View file

@ -228,6 +228,7 @@ struct JSRuntime {
JSAtomStruct **atom_array;
int atom_free_index; /* 0 = none */
JSClassID js_class_id_alloc; /* counter for user defined classes */
int class_count; /* size of class_array */
JSClass *class_array;
@ -1149,7 +1150,6 @@ static const JSClassExoticMethods js_arguments_exotic_methods;
static const JSClassExoticMethods js_string_exotic_methods;
static const JSClassExoticMethods js_proxy_exotic_methods;
static const JSClassExoticMethods js_module_ns_exotic_methods;
static JSClassID js_class_id_alloc = JS_CLASS_INIT_COUNT;
static int compare_u32(uint32_t a, uint32_t b)
{
@ -1483,6 +1483,8 @@ JSRuntime *JS_NewRuntime2(const JSMallocFunctions *mf, void *opaque)
if (init_shape_hash(rt))
goto fail;
rt->js_class_id_alloc = JS_CLASS_INIT_COUNT;
rt->stack_size = JS_DEFAULT_STACK_SIZE;
JS_UpdateStackTop(rt);
@ -3181,13 +3183,11 @@ static inline BOOL JS_IsEmptyString(JSValueConst v)
/* JSClass support */
/* a new class ID is allocated if *pclass_id != 0 */
JSClassID JS_NewClassID(JSClassID *pclass_id)
JSClassID JS_NewClassID(JSRuntime *rt, JSClassID *pclass_id)
{
JSClassID class_id;
/* XXX: make it thread safe */
class_id = *pclass_id;
JSClassID class_id = *pclass_id;
if (class_id == 0) {
class_id = js_class_id_alloc++;
class_id = rt->js_class_id_alloc++;
*pclass_id = class_id;
}
return class_id;

View file

@ -484,7 +484,7 @@ typedef struct JSClassDef {
JSClassExoticMethods *exotic;
} JSClassDef;
JSClassID JS_NewClassID(JSClassID *pclass_id);
JSClassID JS_NewClassID(JSRuntime *rt, JSClassID *pclass_id);
int JS_NewClass(JSRuntime *rt, JSClassID class_id, const JSClassDef *class_def);
int JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id);