From d8a2bcbafed7b2a6941cb13131bfea1ef143066b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 26 Apr 2024 10:53:06 +0800 Subject: [PATCH] 1 --- a8/xtimer.cc | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/a8/xtimer.cc b/a8/xtimer.cc index 3fbc526..da4a7f1 100644 --- a/a8/xtimer.cc +++ b/a8/xtimer.cc @@ -45,6 +45,7 @@ struct xtimer_list { TimerType_e timer_type; long long expires; int expire_time; + int deleting; struct xtvec_base *base; a8::TimerCb cb; @@ -220,6 +221,10 @@ namespace a8 if (!timer) { abort(); } + if (timer->deleting) { + abort(); + } + timer->deleting = 1; if (base_->running_timer == timer) { base_->running_timer = nullptr; } @@ -227,6 +232,16 @@ namespace a8 if (!list_empty(&timer->attach_entry)) { list_del_init(&timer->attach_entry); } +#if 1 + while (!list_empty(&timer->destory_handle_list)) { + XTimerDestoryHandleNode* node = list_first_entry(&timer->destory_handle_list, + XTimerDestoryHandleNode, + entry); + list_del_init(&node->entry); + node->cb(timer); + delete node; + } +#endif if (is_destory) { if (timer->cb) { timer->cb(TIMER_DESTORY_EVENT, nullptr); @@ -237,6 +252,7 @@ namespace a8 } } timer->cb = nullptr; +#if 0 while (!list_empty(&timer->destory_handle_list)) { XTimerDestoryHandleNode* node = list_first_entry(&timer->destory_handle_list, XTimerDestoryHandleNode, @@ -245,6 +261,7 @@ namespace a8 node->cb(timer); delete node; } +#endif if (to_free_list) { AddToFreeList(timer); } else { @@ -404,11 +421,14 @@ namespace a8 void ClearTimer() { auto free_timers = - [this] (list_head* head) + [this] (list_head* head, bool force_no_deleteing = false) { while (!list_empty(head)) { struct xtimer_list *timer; timer = list_first_entry(head, struct xtimer_list,entry); + if (force_no_deleteing) { + timer->deleting = 0; + } InternalDelete(timer, true, false); } }; @@ -421,7 +441,7 @@ namespace a8 for (int j = 0; j < TVR_SIZE; j++) { free_timers(base_->tv1.vec + j); } - free_timers(&base_->free_timer); + free_timers(&base_->free_timer, true); } void AddTimerDestoryHandle(std::weak_ptr& timer_ptr, @@ -445,6 +465,7 @@ namespace a8 timer->expires = expires; timer->expire_time = expire_time; timer->base = base_; + timer->deleting = 0; timer->cb = std::move(cb); }