| 543 | } |
| 544 | |
| 545 | void rt_thread_free_sig(rt_thread_t tid) |
| 546 | { |
| 547 | rt_base_t level; |
| 548 | struct siginfo_node *si_node; |
| 549 | rt_sighandler_t *sig_vectors; |
| 550 | |
| 551 | level = rt_spin_lock_irqsave(&_thread_signal_lock); |
| 552 | si_node = (struct siginfo_node *)tid->si_list; |
| 553 | tid->si_list = RT_NULL; |
| 554 | |
| 555 | sig_vectors = tid->sig_vectors; |
| 556 | tid->sig_vectors = RT_NULL; |
| 557 | rt_spin_unlock_irqrestore(&_thread_signal_lock, level); |
| 558 | |
| 559 | if (si_node) |
| 560 | { |
| 561 | struct rt_slist_node *node; |
| 562 | struct rt_slist_node *node_to_free; |
| 563 | |
| 564 | LOG_D("free signal info list"); |
| 565 | node = &(si_node->list); |
| 566 | do |
| 567 | { |
| 568 | node_to_free = node; |
| 569 | node = node->next; |
| 570 | si_node = rt_slist_entry(node_to_free, struct siginfo_node, list); |
| 571 | rt_mp_free(si_node); |
| 572 | } while (node); |
| 573 | } |
| 574 | |
| 575 | if (sig_vectors) |
| 576 | { |
| 577 | RT_KERNEL_FREE(sig_vectors); |
| 578 | } |
| 579 | } |
| 580 | |
| 581 | /** |
| 582 | * @ingroup group_thread_management |
no test coverage detected