]> git.kaiwu.me - quickjs.git/commitdiff
fixed Worker freeing logic (#462)
authorFabrice Bellard <fabrice@bellard.org>
Sat, 22 Nov 2025 10:03:45 +0000 (11:03 +0100)
committerFabrice Bellard <fabrice@bellard.org>
Sat, 22 Nov 2025 10:03:45 +0000 (11:03 +0100)
quickjs-libc.c

index 54a7a15bd5ba56d593d81f7e3e974fbbded7acd0..c24b6d53ec6d8fdda92b0cef36e0830a7b7e642a 100644 (file)
@@ -3543,7 +3543,8 @@ static void js_free_port(JSRuntime *rt, JSWorkerMessageHandler *port)
     if (port) {
         js_free_message_pipe(port->recv_pipe);
         JS_FreeValueRT(rt, port->on_message_func);
-        list_del(&port->link);
+        if (port->link.prev)
+            list_del(&port->link);
         js_free_rt(rt, port);
     }
 }
@@ -3559,9 +3560,22 @@ static void js_worker_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
+static void js_worker_mark(JSRuntime *rt, JSValueConst val,
+                           JS_MarkFunc *mark_func)
+{
+    JSWorkerData *worker = JS_GetOpaque(val, js_worker_class_id);
+    if (worker) {
+        JSWorkerMessageHandler *port = worker->msg_handler;
+        if (port) {
+            JS_MarkValue(rt, port->on_message_func, mark_func);
+        }
+    }
+}
+
 static JSClassDef js_worker_class = {
     "Worker",
     .finalizer = js_worker_finalizer,
+    .gc_mark = js_worker_mark,
 };
 
 static void *worker_func(void *opaque)
@@ -4139,9 +4153,15 @@ void js_std_free_handlers(JSRuntime *rt)
     }
 
 #ifdef USE_WORKER
-    /* XXX: free port_list ? */
     js_free_message_pipe(ts->recv_pipe);
     js_free_message_pipe(ts->send_pipe);
+
+    list_for_each_safe(el, el1, &ts->port_list) {
+        JSWorkerMessageHandler *port = list_entry(el, JSWorkerMessageHandler, link);
+        /* unlink the message ports. They are freed by the Worker object */
+        port->link.prev = NULL;
+        port->link.next = NULL;
+    }
 #endif
 
     free(ts);