From 5ac8b9be91c0443419fd55da16dc513e2b9c7739 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 14 Dec 2022 11:23:29 +0800 Subject: [PATCH] 1 --- a8/xtimer.cc | 145 ++++++++++++++++++--------------------------------- a8/xtimer.h | 2 +- 2 files changed, 51 insertions(+), 96 deletions(-) diff --git a/a8/xtimer.cc b/a8/xtimer.cc index 9cc73b4..3d8d807 100644 --- a/a8/xtimer.cc +++ b/a8/xtimer.cc @@ -2,6 +2,12 @@ #include +enum TimerType_e +{ + kTimeOutTimer = 0, + kIntervalTimer = 1 +}; + #define CONFIG_BASE_SMALL 0 #define TVN_BITS (CONFIG_BASE_SMALL ? 4 : 6) #define TVR_BITS (CONFIG_BASE_SMALL ? 6 : 8) @@ -35,10 +41,9 @@ struct xtimer_list { struct list_head destory_handle_list; struct list_head entry; struct list_head attach_entry; - int timer_type; // 0:deadline 1: repeattimer 2:fixedtimer outher:deadline + TimerType_e timer_type; long long expires; int expire_time; - int fixed_timer_execute_times; struct xtvec_base *base; a8::TimerCb cb; @@ -123,9 +128,7 @@ namespace a8 ~XTimerImpl() { -#if 0 - Clear(); -#endif + ClearTimer(); A8_SAFE_DELETE(base_); } @@ -167,56 +170,37 @@ namespace a8 void InternalSetTimeout(int expire_time, TimerCb cb, Attacher* attacher, XTimerWp* wp) { xtimer_list *timer = NewTimerList(); - InitTimerList(base_, - timer, - 0, + InitTimerList(timer, + kTimeOutTimer, get_tick_count_func_(context_) + expire_time, expire_time, cb ); InternalModifyTime(timer, expire_time); - - #if 0 - std::shared_ptr timer_ptr = std::make_shared(); - timer_ptr->timer = timer; - std::weak_ptr result = timer_ptr; - AddTimerDestoryHandle - (result, - [timer_ptr] (xtimer_list* timer) - { - timer_ptr->timer = nullptr; - }); - return result; - #endif + if (wp) { + AddTimerWp(timer, *wp); + } } void InternalSetInterval(int expire_time, TimerCb cb, Attacher* attacher, XTimerWp* wp) { xtimer_list *timer = NewTimerList(); - InitTimerList(base_, - timer, - 1, + InitTimerList(timer, + kIntervalTimer, get_tick_count_func_(context_) + expire_time, expire_time, cb); InternalModifyTime(timer, expire_time); - if (wp) { - std::shared_ptr timer_ptr = std::make_shared(); - timer_ptr->timer = timer; - *wp = timer_ptr; - AddTimerDestoryHandle - (*wp, - [timer_ptr] (xtimer_list* timer) - { - timer_ptr->timer = nullptr; - }); + AddTimerWp(timer, *wp); } } - void FireEvent(XTimerWp& timer_wp, a8::Args* args) + void InternalFireEvent(xtimer_list* timer, int event, a8::Args* args) { - + if (timer->cb) { + timer->cb(event, args); + } } void InternalDelete(xtimer_list* timer) @@ -249,26 +233,12 @@ namespace a8 { DetachTimer(timer); timer->expire_time = expire_time; - if (timer->timer_type == 2) { - long long tick = get_tick_count_func_(context_); - long long today_passed_seconds = time(nullptr) - a8::GetDaySeconds(time(nullptr), 0); - timer->expires = (tick - today_passed_seconds * 1000) + expire_time; - if (timer->fixed_timer_execute_times > 0) { - if (timer->expires <= tick) { //已过期 - timer->expires += 1000 * 3600 * 24; - } - } - }else { - timer->expires = get_tick_count_func_(context_) + expire_time; - } + timer->expires = get_tick_count_func_(context_) + expire_time; InternalAddXTimer(base_, timer); } long long InternalGetRemainTime(xtimer_list* timer) { - if (!timer) { - abort(); - } long long remain_time = timer->expires - get_tick_count_func_(context_); return std::max(remain_time, (long long)0); } @@ -285,31 +255,6 @@ namespace a8 void DestoryAttacher(Attacher* attacher) { -#if 0 - xtimer_list* timer = timer_ptr.lock()->timer; - if (!timer) { - abort(); - } - if (base_->running_timer == timer) { - base_->running_timer = nullptr; - } - if (timer->cb) { - timer->cb(TIMER_DESTORY_EVNET, nullptr); - } - 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); -#endif } void UpdateTimer() @@ -337,18 +282,7 @@ namespace a8 } if (base_->running_timer) { switch (timer->timer_type) { - case 1: - case 2: //循环类定时 fixed timer也是循环定时器 - { - if (timer->timer_type == 2) { - timer->fixed_timer_execute_times++; - } -#if 0 - ModifyTimer(timer, timer->expire_time); -#endif - } - break; - default: //deadline timer + case kTimeOutTimer: { DetachTimer(timer); if (!list_empty(&timer->attach_entry)) { @@ -368,6 +302,10 @@ namespace a8 } } break; + default: + { + } + break; } } } @@ -377,7 +315,7 @@ namespace a8 void DeleteCurrentTimer() { - + InternalDelete(base_->running_timer); } private: @@ -388,6 +326,19 @@ namespace a8 base_->free_timer_num++; } + void AddTimerWp(xtimer_list* timer, XTimerWp& wp) + { + std::shared_ptr timer_ptr = std::make_shared(); + timer_ptr->timer = timer; + wp = timer_ptr; + AddTimerDestoryHandle + (wp, + [timer_ptr] (xtimer_list* timer) + { + timer_ptr->timer = nullptr; + }); + } + xtimer_list* NewTimerList() { if (!list_empty(&base_->free_timer)) { @@ -455,8 +406,10 @@ namespace a8 delete node; } - void InitTimerList(xtvec_base* base, xtimer_list* timer, int timer_type, - long long expires, int expire_time, + void InitTimerList(xtimer_list* timer, + TimerType_e timer_type, + long long expires, + int expire_time, a8::TimerCb cb) { INIT_LIST_HEAD(&timer->destory_handle_list); @@ -465,8 +418,7 @@ namespace a8 timer->timer_type = timer_type; timer->expires = expires; timer->expire_time = expire_time; - timer->fixed_timer_execute_times = 0; - timer->base = base; + timer->base = base_; timer->cb = std::move(cb); } @@ -555,9 +507,12 @@ namespace a8 return result; } - void XTimer::FireEvent(XTimerWp& timer_wp, a8::Args* args) + void XTimer::FireEvent(XTimerWp& timer_wp, int event, a8::Args* args) { - impl_->FireEvent(timer_wp, args); + if (timer_wp.expired()) { + abort(); + } + impl_->InternalFireEvent(timer_wp.lock()->timer, event, args); } void XTimer::ModifyTime(XTimerWp& timer_wp, int expire_time) diff --git a/a8/xtimer.h b/a8/xtimer.h index e229a53..4dd9d6b 100644 --- a/a8/xtimer.h +++ b/a8/xtimer.h @@ -25,7 +25,7 @@ namespace a8 XTimerWp SetIntervalWp(int expire_time, TimerCb cb); XTimerWp SetIntervalWpEx(int expire_time, TimerCb cb, Attacher* attacher); - void FireEvent(XTimerWp& timer_wp, a8::Args* args); + void FireEvent(XTimerWp& timer_wp, int event, a8::Args* args); void ModifyTime(XTimerWp& timer_wp, int expire_time); void Delete(XTimerWp& timer_wp); long long GetRemainTime(XTimerWp& timer_wp);