From 5e0a939a89ba97edd371695432ef029eae2c55d5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 19 Aug 2021 02:57:12 +0000 Subject: [PATCH] xtimer add destory handle --- a8/xtimer.cc | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ a8/xtimer.h | 7 ++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/a8/xtimer.cc b/a8/xtimer.cc index aaca573..ebe4599 100644 --- a/a8/xtimer.cc +++ b/a8/xtimer.cc @@ -32,6 +32,7 @@ struct xtvec_base { }; 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 @@ -45,6 +46,12 @@ struct xtimer_list { a8::XParams param; }; +struct XTimerDestoryHandleNode +{ + struct list_head entry; + std::function cb; +}; + static void InternalAddXTimer(struct xtvec_base *base, struct xtimer_list *timer) { long long expires = timer->expires; @@ -100,6 +107,7 @@ static inline void InitTimerList(xtvec_base* base, xtimer_list* timer, int timer long long expires, int expire_time, a8::XParams& param, a8::XTimerFunc timer_func, a8::XTimerAfterFunc timer_after_func) { + INIT_LIST_HEAD(&timer->destory_handle_list); INIT_LIST_HEAD(&timer->entry); INIT_LIST_HEAD(&timer->attach_entry); timer->timer_type = timer_type; @@ -243,6 +251,14 @@ namespace a8 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); } @@ -318,6 +334,14 @@ namespace a8 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->timer_after_func) { timer->timer_after_func(timer->param); @@ -361,6 +385,14 @@ namespace a8 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; } }; @@ -391,4 +423,24 @@ namespace a8 } } + XTimerDestoryHandle* XTimer::AddTimerDestoryHandle(xtimer_list* timer, + std::function cb) + { + XTimerDestoryHandleNode* node = new XTimerDestoryHandleNode; + node->cb = cb; + list_add_tail(&node->entry, &timer->destory_handle_list); + return &node->entry; + } + + void XTimer::RemoveTimerDestoryHandle(XTimerDestoryHandle* handle) + { + if (!handle || list_empty(handle)) { + abort(); + } + + XTimerDestoryHandleNode* node = list_entry(handle, XTimerDestoryHandleNode, entry); + list_del_init(&node->entry); + delete node; + } + } diff --git a/a8/xtimer.h b/a8/xtimer.h index c07f380..7371e38 100644 --- a/a8/xtimer.h +++ b/a8/xtimer.h @@ -6,12 +6,12 @@ struct xtimer_list; struct xtvec_base; - namespace a8 { typedef void (*XTimerFunc)(const a8::XParams& param); typedef void (*XTimerAfterFunc)(const a8::XParams& param); typedef long long (*XGetTickCountFunc)(void*); + typedef struct list_head XTimerDestoryHandle; class XTimer { @@ -48,6 +48,11 @@ namespace a8 long long GetRemainTime(xtimer_list* timer); //获取当前正在运行的定时器 xtimer_list* GetRunningTimer(); + //添加定时器销毁事件 + XTimerDestoryHandle* AddTimerDestoryHandle(xtimer_list* timer, + std::function cb); + //移除定时器销毁事件 + void RemoveTimerDestoryHandle(XTimerDestoryHandle* handle); private: void UpdateTimer();