@@ -458,19 +458,42 @@ static void posix_thread_recycle_work_handler(struct k_work *work)
458
458
}
459
459
static K_WORK_DELAYABLE_DEFINE (posix_thread_recycle_work , posix_thread_recycle_work_handler ) ;
460
460
461
+ extern struct sys_sem pthread_key_lock ;
462
+
461
463
static void posix_thread_finalize (struct posix_thread * t , void * retval )
462
464
{
463
- sys_snode_t * node_l ;
465
+ sys_snode_t * node_l , * node_s ;
464
466
pthread_key_obj * key_obj ;
465
467
pthread_thread_data * thread_spec_data ;
468
+ sys_snode_t * node_key_data , * node_key_data_s , * node_key_data_prev = NULL ;
469
+ struct pthread_key_data * key_data ;
466
470
467
- SYS_SLIST_FOR_EACH_NODE (& t -> key_list , node_l ) {
471
+ SYS_SLIST_FOR_EACH_NODE_SAFE (& t -> key_list , node_l , node_s ) {
468
472
thread_spec_data = (pthread_thread_data * )node_l ;
469
473
if (thread_spec_data != NULL ) {
470
474
key_obj = thread_spec_data -> key ;
471
475
if (key_obj -> destructor != NULL ) {
472
476
(key_obj -> destructor )(thread_spec_data -> spec_data );
473
477
}
478
+
479
+ SYS_SEM_LOCK (& pthread_key_lock ) {
480
+ SYS_SLIST_FOR_EACH_NODE_SAFE (
481
+ & key_obj -> key_data_l ,
482
+ node_key_data ,
483
+ node_key_data_s ) {
484
+ key_data = (struct pthread_key_data * )node_key_data ;
485
+ if (& key_data -> thread_data == thread_spec_data ) {
486
+ sys_slist_remove (
487
+ & key_obj -> key_data_l ,
488
+ node_key_data_prev ,
489
+ node_key_data
490
+ );
491
+ k_free (key_data );
492
+ break ;
493
+ }
494
+ node_key_data_prev = node_key_data ;
495
+ }
496
+ }
474
497
}
475
498
}
476
499
0 commit comments