xtimer add destory handle

This commit is contained in:
aozhiwei 2021-08-19 02:57:12 +00:00
parent 8932713766
commit 5e0a939a89
2 changed files with 58 additions and 1 deletions

View File

@ -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<void(xtimer_list*)> 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<void(xtimer_list*)> 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;
}
}

View File

@ -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<void(xtimer_list*)> cb);
//移除定时器销毁事件
void RemoveTimerDestoryHandle(XTimerDestoryHandle* handle);
private:
void UpdateTimer();