This commit is contained in:
aozhiwei 2024-04-26 10:53:06 +08:00
parent 4b4462b833
commit d8a2bcbafe

View File

@ -45,6 +45,7 @@ struct xtimer_list {
TimerType_e timer_type; TimerType_e timer_type;
long long expires; long long expires;
int expire_time; int expire_time;
int deleting;
struct xtvec_base *base; struct xtvec_base *base;
a8::TimerCb cb; a8::TimerCb cb;
@ -220,6 +221,10 @@ namespace a8
if (!timer) { if (!timer) {
abort(); abort();
} }
if (timer->deleting) {
abort();
}
timer->deleting = 1;
if (base_->running_timer == timer) { if (base_->running_timer == timer) {
base_->running_timer = nullptr; base_->running_timer = nullptr;
} }
@ -227,6 +232,16 @@ namespace a8
if (!list_empty(&timer->attach_entry)) { if (!list_empty(&timer->attach_entry)) {
list_del_init(&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 (is_destory) {
if (timer->cb) { if (timer->cb) {
timer->cb(TIMER_DESTORY_EVENT, nullptr); timer->cb(TIMER_DESTORY_EVENT, nullptr);
@ -237,6 +252,7 @@ namespace a8
} }
} }
timer->cb = nullptr; timer->cb = nullptr;
#if 0
while (!list_empty(&timer->destory_handle_list)) { while (!list_empty(&timer->destory_handle_list)) {
XTimerDestoryHandleNode* node = list_first_entry(&timer->destory_handle_list, XTimerDestoryHandleNode* node = list_first_entry(&timer->destory_handle_list,
XTimerDestoryHandleNode, XTimerDestoryHandleNode,
@ -245,6 +261,7 @@ namespace a8
node->cb(timer); node->cb(timer);
delete node; delete node;
} }
#endif
if (to_free_list) { if (to_free_list) {
AddToFreeList(timer); AddToFreeList(timer);
} else { } else {
@ -404,11 +421,14 @@ namespace a8
void ClearTimer() void ClearTimer()
{ {
auto free_timers = auto free_timers =
[this] (list_head* head) [this] (list_head* head, bool force_no_deleteing = false)
{ {
while (!list_empty(head)) { while (!list_empty(head)) {
struct xtimer_list *timer; struct xtimer_list *timer;
timer = list_first_entry(head, struct xtimer_list,entry); timer = list_first_entry(head, struct xtimer_list,entry);
if (force_no_deleteing) {
timer->deleting = 0;
}
InternalDelete(timer, true, false); InternalDelete(timer, true, false);
} }
}; };
@ -421,7 +441,7 @@ namespace a8
for (int j = 0; j < TVR_SIZE; j++) { for (int j = 0; j < TVR_SIZE; j++) {
free_timers(base_->tv1.vec + j); free_timers(base_->tv1.vec + j);
} }
free_timers(&base_->free_timer); free_timers(&base_->free_timer, true);
} }
void AddTimerDestoryHandle(std::weak_ptr<XTimerPtr>& timer_ptr, void AddTimerDestoryHandle(std::weak_ptr<XTimerPtr>& timer_ptr,
@ -445,6 +465,7 @@ namespace a8
timer->expires = expires; timer->expires = expires;
timer->expire_time = expire_time; timer->expire_time = expire_time;
timer->base = base_; timer->base = base_;
timer->deleting = 0;
timer->cb = std::move(cb); timer->cb = std::move(cb);
} }