This commit is contained in:
aozhiwei 2022-12-14 10:55:29 +08:00
parent ffcbe9e7bf
commit c75e00fffd
3 changed files with 88 additions and 79 deletions

View File

@ -267,7 +267,7 @@ namespace a8
client->connect_timer_attacher.ClearTimerList(); client->connect_timer_attacher.ClearTimerList();
context->xtimer.SetTimeoutEx context->xtimer.SetTimeoutEx
( (
param.param1, param.param1.GetInt(),
[client] (int event, const a8::Args* args) [client] (int event, const a8::Args* args)
{ {
if (a8::TIMER_EXEC_EVENT == event) { if (a8::TIMER_EXEC_EVENT == event) {

View File

@ -136,7 +136,7 @@ namespace a8
gc_time_ = gc_time; gc_time_ = gc_time;
cache_timer_num_ = cache_timer_num; cache_timer_num_ = cache_timer_num;
base_->timer_tick = get_tick_count_func_(context_); base_->timer_tick = get_tick_count_func_(context_);
SetInterval InternalSetInterval
(gc_time_, (gc_time_,
[this] (int event, const a8::Args* args) [this] (int event, const a8::Args* args)
{ {
@ -152,7 +152,9 @@ namespace a8
++i; ++i;
} }
} }
}); },
nullptr,
nullptr);
} }
void Update() void Update()
@ -162,17 +164,17 @@ namespace a8
} }
} }
void InternalSetTimeout(int time, TimerCb cb, Attacher* attacher, XTimerWp* wp) void InternalSetTimeout(int expire_time, TimerCb cb, Attacher* attacher, XTimerWp* wp)
{ {
xtimer_list *timer = ::NewTimerList(base_); xtimer_list *timer = NewTimerList();
InitTimerList(base_, InitTimerList(base_,
timer, timer,
0, 0,
get_tick_count_func_(context_) + expire_time, get_tick_count_func_(context_) + expire_time,
expire_time, expire_time,
timer_cb cb
); );
ModifyTimerTimer(timer, expire_time); InternalModifyTime(timer, expire_time);
#if 0 #if 0
std::shared_ptr<XTimerPtr> timer_ptr = std::make_shared<XTimerPtr>(); std::shared_ptr<XTimerPtr> timer_ptr = std::make_shared<XTimerPtr>();
@ -188,29 +190,28 @@ namespace a8
#endif #endif
} }
void InternalSetInterval(int time, TimerCb cb, Attacher* attacher, XTimerWp* wp) void InternalSetInterval(int expire_time, TimerCb cb, Attacher* attacher, XTimerWp* wp)
{ {
xtimer_list *timer = ::NewTimerList(base_); xtimer_list *timer = NewTimerList();
InitTimerList(base_, InitTimerList(base_,
timer, timer,
1, 1,
get_tick_count_func_(context_) + expire_time, get_tick_count_func_(context_) + expire_time,
expire_time, expire_time,
timer_cb); cb);
#if 0 InternalModifyTime(timer, expire_time);
ModifyTimer(timer, expire_time);
#endif
if (wp) {
std::shared_ptr<XTimerPtr> timer_ptr = std::make_shared<XTimerPtr>(); std::shared_ptr<XTimerPtr> timer_ptr = std::make_shared<XTimerPtr>();
timer_ptr->timer = timer; timer_ptr->timer = timer;
std::weak_ptr<XTimerPtr> result = timer_ptr; *wp = timer_ptr;
AddTimerDestoryHandle AddTimerDestoryHandle
(result, (*wp,
[timer_ptr] (xtimer_list* timer) [timer_ptr] (xtimer_list* timer)
{ {
timer_ptr->timer = nullptr; timer_ptr->timer = nullptr;
}); });
return result; }
} }
void FireEvent(XTimerWp& timer_wp, a8::Args* args) void FireEvent(XTimerWp& timer_wp, a8::Args* args)
@ -218,28 +219,8 @@ namespace a8
} }
void ModifyTime(XTimerWp& timer_wp, int expire_time) void InternalDelete(xtimer_list* timer)
{ {
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;
}
InternalAddXTimer(base_, timer);
}
void Delete(XTimerWp& timer_wp)
{
xtimer_list* timer = timer_ptr.lock()->timer;
if (!timer) { if (!timer) {
abort(); abort();
} }
@ -261,12 +242,30 @@ namespace a8
node->cb(timer); node->cb(timer);
delete node; delete node;
} }
AddToFreeList(base_, timer); AddToFreeList(timer);
} }
long long GetRemainTime(XTimerWp& timer_wp) void InternalModifyTime(xtimer_list* timer, int expire_time)
{
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;
}
InternalAddXTimer(base_, timer);
}
long long InternalGetRemainTime(xtimer_list* timer)
{ {
xtimer_list* timer = timer_ptr.lock()->timer;
if (!timer) { if (!timer) {
abort(); abort();
} }
@ -309,11 +308,11 @@ namespace a8
node->cb(timer); node->cb(timer);
delete node; delete node;
} }
AddToFreeList(base_, timer); AddToFreeList(timer);
#endif #endif
} }
void XTimer::UpdateTimer() void UpdateTimer()
{ {
struct xtvec_base *base = base_; struct xtvec_base *base = base_;
while (get_tick_count_func_(context_) >= base->timer_tick) { while (get_tick_count_func_(context_) >= base->timer_tick) {
@ -363,7 +362,7 @@ namespace a8
node->cb(timer); node->cb(timer);
delete node; delete node;
} }
AddToFreeList(base_, timer); AddToFreeList(timer);
if (timer->cb) { if (timer->cb) {
timer->cb(TIMER_DELETE_EVENT, nullptr); timer->cb(TIMER_DELETE_EVENT, nullptr);
} }
@ -389,7 +388,7 @@ namespace a8
base_->free_timer_num++; base_->free_timer_num++;
} }
xtimer_list* NewTimerList(xtvec_base* base_) xtimer_list* NewTimerList()
{ {
if (!list_empty(&base_->free_timer)) { if (!list_empty(&base_->free_timer)) {
xtimer_list* timer = list_first_entry(&base_->free_timer, struct xtimer_list,entry); xtimer_list* timer = list_first_entry(&base_->free_timer, struct xtimer_list,entry);
@ -404,7 +403,7 @@ namespace a8
void ClearTimer() void ClearTimer()
{ {
auto free_timers = auto free_timers =
[] (list_head* head) [this] (list_head* head)
{ {
while (!list_empty(head)) { while (!list_empty(head)) {
struct xtimer_list *timer; struct xtimer_list *timer;
@ -507,51 +506,52 @@ namespace a8
impl_->Update(); impl_->Update();
} }
void XTimer::SetTimeout(int time, TimerCb cb) void XTimer::SetTimeout(int expire_time, TimerCb cb)
{ {
impl_->InternalSetTimeout(time, cb, nullptr, nullptr); impl_->InternalSetTimeout(expire_time, cb, nullptr, nullptr);
} }
void XTimer::SetTimeoutEx(int time, TimerCb cb, Attacher* attacher) void XTimer::SetTimeoutEx(int expire_time, TimerCb cb, Attacher* attacher)
{ {
impl_->InternalSetTimeout(time, cb, attacher, nullptr);
impl_->InternalSetTimeout(expire_time, cb, attacher, nullptr);
} }
XTimerWp XTimer::SetTimeoutWp(int time, TimerCb cb) XTimerWp XTimer::SetTimeoutWp(int expire_time, TimerCb cb)
{ {
XTimerWp result; XTimerWp result;
impl_->InternalSetTimeout(time, cb, nullptr, &result); impl_->InternalSetTimeout(expire_time, cb, nullptr, &result);
return result; return result;
} }
XTimerWp XTimer::SetTimeoutWpEx(int time, TimerCb cb, Attacher* attacher) XTimerWp XTimer::SetTimeoutWpEx(int expire_time, TimerCb cb, Attacher* attacher)
{ {
XTimerWp result; XTimerWp result;
impl_->InternalSetTimeout(time, cb, attacherk, &result); impl_->InternalSetTimeout(expire_time, cb, attacher, &result);
return result; return result;
} }
void XTimer::SetInterval(int time, a8::TimerCb cb) void XTimer::SetInterval(int expire_time, a8::TimerCb cb)
{ {
impl_->InternalSetInterval(time, cb, nullptr, nullptr); impl_->InternalSetInterval(expire_time, cb, nullptr, nullptr);
} }
void XTimer::SetIntervalEx(int time, a8::TimerCb cb, Attacher* attacher) void XTimer::SetIntervalEx(int expire_time, a8::TimerCb cb, Attacher* attacher)
{ {
impl_->InternalSetInterval(time, cb, attacker, nullptr); impl_->InternalSetInterval(expire_time, cb, attacher, nullptr);
} }
XTimerWp XTimer::SetIntervalWp(int time, TimerCb cb) XTimerWp XTimer::SetIntervalWp(int expire_time, TimerCb cb)
{ {
XTimerWp result; XTimerWp result;
impl_->InternalSetInterval(time, cb, nullptr, &result); impl_->InternalSetInterval(expire_time, cb, nullptr, &result);
return result; return result;
} }
XTimerWp XTimer::SetIntervalWpEx(int time, TimerCb cb, Attacher* attacher) XTimerWp XTimer::SetIntervalWpEx(int expire_time, TimerCb cb, Attacher* attacher)
{ {
XTimerWp result; XTimerWp result;
impl_->InternalSetInterval(time, cb, attacherk, &result); impl_->InternalSetInterval(expire_time, cb, attacher, &result);
return result; return result;
} }
@ -562,17 +562,26 @@ namespace a8
void XTimer::ModifyTime(XTimerWp& timer_wp, int expire_time) void XTimer::ModifyTime(XTimerWp& timer_wp, int expire_time)
{ {
impl_->ModifyTime(timr_wp, expire_time); if (timer_wp.expired()) {
abort();
}
impl_->InternalModifyTime(timer_wp.lock()->timer, expire_time);
} }
void XTimer::Delete(XTimerWp& timer_wp) void XTimer::Delete(XTimerWp& timer_wp)
{ {
impl_->Delete(timer_wp); if (timer_wp.expired()) {
abort();
}
impl_->InternalDelete(timer_wp.lock()->timer);
} }
long long XTimer::GetRemainTime(XTimerWp& timer_wp) long long XTimer::GetRemainTime(XTimerWp& timer_wp)
{ {
return impl_->GetRemainTime(timer_wp); if (timer_wp.expired()) {
abort();
}
return impl_->InternalGetRemainTime(timer_wp.lock()->timer);
} }
bool XTimer::IsRunning() bool XTimer::IsRunning()

View File

@ -15,15 +15,15 @@ namespace a8
void Init(XGetTickCountFunc func, void* context, int gc_time, int cache_timer_num); void Init(XGetTickCountFunc func, void* context, int gc_time, int cache_timer_num);
void Update(); void Update();
inline void SetTimeout(int time, TimerCb cb); void SetTimeout(int expire_time, TimerCb cb);
inline void SetTimeoutEx(int time, TimerCb cb, Attacher* attacher); void SetTimeoutEx(int expire_time, TimerCb cb, Attacher* attacher);
inline XTimerWp SetTimeoutWp(int time, TimerCb cb); XTimerWp SetTimeoutWp(int expire_time, TimerCb cb);
inline XTimerWp SetTimeoutWpEx(int time, TimerCb cb, Attacher* attacher); XTimerWp SetTimeoutWpEx(int expire_time, TimerCb cb, Attacher* attacher);
inline void SetInterval(int time, a8::TimerCb cb); void SetInterval(int expire_time, a8::TimerCb cb);
inline void SetIntervalEx(int time, a8::TimerCb cb, Attacher* attacher); void SetIntervalEx(int expire_time, a8::TimerCb cb, Attacher* attacher);
inline XTimerWp SetIntervalWp(int time, TimerCb cb); XTimerWp SetIntervalWp(int expire_time, TimerCb cb);
inline XTimerWp SetIntervalWpEx(int time, TimerCb cb, Attacher* attacher); XTimerWp SetIntervalWpEx(int expire_time, TimerCb cb, Attacher* attacher);
void FireEvent(XTimerWp& timer_wp, a8::Args* args); void FireEvent(XTimerWp& timer_wp, a8::Args* args);
void ModifyTime(XTimerWp& timer_wp, int expire_time); void ModifyTime(XTimerWp& timer_wp, int expire_time);