This commit is contained in:
aozhiwei 2022-12-14 11:35:48 +08:00
parent 5ac8b9be91
commit 1c1903fab1
2 changed files with 21 additions and 38 deletions

View File

@ -22,7 +22,7 @@ namespace a8
const int TIMER_EXEC_EVENT = 1; const int TIMER_EXEC_EVENT = 1;
const int TIMER_DELETE_EVENT = 2; const int TIMER_DELETE_EVENT = 2;
const int TIMER_DESTORY_EVNET = 3; const int TIMER_DESTORY_EVENT = 3;
const int TIMER_USER_EVNET = 66; const int TIMER_USER_EVENT = 66;
}; };

View File

@ -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) { if (!timer) {
abort(); abort();
@ -211,13 +211,19 @@ namespace a8
if (base_->running_timer == timer) { if (base_->running_timer == timer) {
base_->running_timer = nullptr; base_->running_timer = nullptr;
} }
if (timer->cb) {
timer->cb(TIMER_DELETE_EVENT, nullptr);
}
DetachTimer(timer); DetachTimer(timer);
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 (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)) { 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,
@ -226,7 +232,11 @@ namespace a8
node->cb(timer); node->cb(timer);
delete node; delete node;
} }
AddToFreeList(timer); if (to_free_list) {
AddToFreeList(timer);
} else {
delete timer;
}
} }
void InternalModifyTime(xtimer_list* timer, int expire_time) void InternalModifyTime(xtimer_list* timer, int expire_time)
@ -284,22 +294,7 @@ namespace a8
switch (timer->timer_type) { switch (timer->timer_type) {
case kTimeOutTimer: case kTimeOutTimer:
{ {
DetachTimer(timer); InternalDelete(timer, false, true);
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);
}
} }
break; break;
default: default:
@ -315,7 +310,7 @@ namespace a8
void DeleteCurrentTimer() void DeleteCurrentTimer()
{ {
InternalDelete(base_->running_timer); InternalDelete(base_->running_timer, false, true);
} }
private: private:
@ -359,19 +354,7 @@ namespace a8
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);
DetachTimer(timer); InternalDelete(timer, true, false);
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;
} }
}; };
for (int j = 0; j < TVN_SIZE; j++) { for (int j = 0; j < TVN_SIZE; j++) {
@ -528,7 +511,7 @@ namespace a8
if (timer_wp.expired()) { if (timer_wp.expired()) {
abort(); abort();
} }
impl_->InternalDelete(timer_wp.lock()->timer); impl_->InternalDelete(timer_wp.lock()->timer, false, true);
} }
long long XTimer::GetRemainTime(XTimerWp& timer_wp) long long XTimer::GetRemainTime(XTimerWp& timer_wp)