diff --git a/a8/types.h b/a8/types.h index 00c10a8..4b03168 100644 --- a/a8/types.h +++ b/a8/types.h @@ -22,7 +22,7 @@ namespace a8 const int TIMER_EXEC_EVENT = 1; const int TIMER_DELETE_EVENT = 2; - const int TIMER_DESTORY_EVNET = 3; - const int TIMER_USER_EVNET = 66; + const int TIMER_DESTORY_EVENT = 3; + const int TIMER_USER_EVENT = 66; }; diff --git a/a8/xtimer.cc b/a8/xtimer.cc index 3d8d807..62b95cc 100644 --- a/a8/xtimer.cc +++ b/a8/xtimer.cc @@ -203,7 +203,7 @@ namespace a8 } } - void InternalDelete(xtimer_list* timer) + void InternalDelete(xtimer_list* timer, bool is_destory, bool to_free_list) { if (!timer) { abort(); @@ -211,13 +211,19 @@ namespace a8 if (base_->running_timer == timer) { base_->running_timer = nullptr; } - if (timer->cb) { - timer->cb(TIMER_DELETE_EVENT, nullptr); - } DetachTimer(timer); if (!list_empty(&timer->attach_entry)) { list_del_init(&timer->attach_entry); } + if (is_destory) { + if (timer->cb) { + timer->cb(TIMER_DESTORY_EVENT, nullptr); + } + } else { + if (timer->cb) { + timer->cb(TIMER_DELETE_EVENT, nullptr); + } + } while (!list_empty(&timer->destory_handle_list)) { XTimerDestoryHandleNode* node = list_first_entry(&timer->destory_handle_list, XTimerDestoryHandleNode, @@ -226,7 +232,11 @@ namespace a8 node->cb(timer); delete node; } - AddToFreeList(timer); + if (to_free_list) { + AddToFreeList(timer); + } else { + delete timer; + } } void InternalModifyTime(xtimer_list* timer, int expire_time) @@ -284,22 +294,7 @@ namespace a8 switch (timer->timer_type) { case kTimeOutTimer: { - DetachTimer(timer); - if (!list_empty(&timer->attach_entry)) { - list_del_init(&timer->attach_entry); - } - 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; - } - AddToFreeList(timer); - if (timer->cb) { - timer->cb(TIMER_DELETE_EVENT, nullptr); - } + InternalDelete(timer, false, true); } break; default: @@ -315,7 +310,7 @@ namespace a8 void DeleteCurrentTimer() { - InternalDelete(base_->running_timer); + InternalDelete(base_->running_timer, false, true); } private: @@ -359,19 +354,7 @@ namespace a8 while (!list_empty(head)) { struct xtimer_list *timer; timer = list_first_entry(head, struct xtimer_list,entry); - DetachTimer(timer); - if (!list_empty(&timer->attach_entry)) { - list_del_init(&timer->attach_entry); - } - 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; - } - delete timer; + InternalDelete(timer, true, false); } }; for (int j = 0; j < TVN_SIZE; j++) { @@ -528,7 +511,7 @@ namespace a8 if (timer_wp.expired()) { abort(); } - impl_->InternalDelete(timer_wp.lock()->timer); + impl_->InternalDelete(timer_wp.lock()->timer, false, true); } long long XTimer::GetRemainTime(XTimerWp& timer_wp)