Skip to content

Commit 728ed94

Browse files
author
Fabrice Bellard
committed
fixed Worker freeing logic (#462)
1 parent 9f11034 commit 728ed94

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

‎quickjs-libc.c‎

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3543,7 +3543,8 @@ static void js_free_port(JSRuntime *rt, JSWorkerMessageHandler *port)
35433543
if (port) {
35443544
js_free_message_pipe(port->recv_pipe);
35453545
JS_FreeValueRT(rt, port->on_message_func);
3546-
list_del(&port->link);
3546+
if (port->link.prev)
3547+
list_del(&port->link);
35473548
js_free_rt(rt, port);
35483549
}
35493550
}
@@ -3559,9 +3560,22 @@ static void js_worker_finalizer(JSRuntime *rt, JSValue val)
35593560
}
35603561
}
35613562

3563+
static void js_worker_mark(JSRuntime *rt, JSValueConst val,
3564+
JS_MarkFunc *mark_func)
3565+
{
3566+
JSWorkerData *worker = JS_GetOpaque(val, js_worker_class_id);
3567+
if (worker) {
3568+
JSWorkerMessageHandler *port = worker->msg_handler;
3569+
if (port) {
3570+
JS_MarkValue(rt, port->on_message_func, mark_func);
3571+
}
3572+
}
3573+
}
3574+
35623575
static JSClassDef js_worker_class = {
35633576
"Worker",
35643577
.finalizer = js_worker_finalizer,
3578+
.gc_mark = js_worker_mark,
35653579
};
35663580

35673581
static void *worker_func(void *opaque)
@@ -4139,9 +4153,15 @@ void js_std_free_handlers(JSRuntime *rt)
41394153
}
41404154

41414155
#ifdef USE_WORKER
4142-
/* XXX: free port_list ? */
41434156
js_free_message_pipe(ts->recv_pipe);
41444157
js_free_message_pipe(ts->send_pipe);
4158+
4159+
list_for_each_safe(el, el1, &ts->port_list) {
4160+
JSWorkerMessageHandler *port = list_entry(el, JSWorkerMessageHandler, link);
4161+
/* unlink the message ports. They are freed by the Worker object */
4162+
port->link.prev = NULL;
4163+
port->link.next = NULL;
4164+
}
41454165
#endif
41464166

41474167
free(ts);

0 commit comments

Comments
 (0)