@@ -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+
35623575static JSClassDef js_worker_class = {
35633576 "Worker" ,
35643577 .finalizer = js_worker_finalizer ,
3578+ .gc_mark = js_worker_mark ,
35653579};
35663580
35673581static 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