1
This commit is contained in:
parent
4b4462b833
commit
d8a2bcbafe
25
a8/xtimer.cc
25
a8/xtimer.cc
@ -45,6 +45,7 @@ struct xtimer_list {
|
|||||||
TimerType_e timer_type;
|
TimerType_e timer_type;
|
||||||
long long expires;
|
long long expires;
|
||||||
int expire_time;
|
int expire_time;
|
||||||
|
int deleting;
|
||||||
struct xtvec_base *base;
|
struct xtvec_base *base;
|
||||||
|
|
||||||
a8::TimerCb cb;
|
a8::TimerCb cb;
|
||||||
@ -220,6 +221,10 @@ namespace a8
|
|||||||
if (!timer) {
|
if (!timer) {
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
if (timer->deleting) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
timer->deleting = 1;
|
||||||
if (base_->running_timer == timer) {
|
if (base_->running_timer == timer) {
|
||||||
base_->running_timer = nullptr;
|
base_->running_timer = nullptr;
|
||||||
}
|
}
|
||||||
@ -227,6 +232,16 @@ namespace a8
|
|||||||
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 1
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (is_destory) {
|
if (is_destory) {
|
||||||
if (timer->cb) {
|
if (timer->cb) {
|
||||||
timer->cb(TIMER_DESTORY_EVENT, nullptr);
|
timer->cb(TIMER_DESTORY_EVENT, nullptr);
|
||||||
@ -237,6 +252,7 @@ namespace a8
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
timer->cb = nullptr;
|
timer->cb = nullptr;
|
||||||
|
#if 0
|
||||||
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,
|
||||||
@ -245,6 +261,7 @@ namespace a8
|
|||||||
node->cb(timer);
|
node->cb(timer);
|
||||||
delete node;
|
delete node;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (to_free_list) {
|
if (to_free_list) {
|
||||||
AddToFreeList(timer);
|
AddToFreeList(timer);
|
||||||
} else {
|
} else {
|
||||||
@ -404,11 +421,14 @@ namespace a8
|
|||||||
void ClearTimer()
|
void ClearTimer()
|
||||||
{
|
{
|
||||||
auto free_timers =
|
auto free_timers =
|
||||||
[this] (list_head* head)
|
[this] (list_head* head, bool force_no_deleteing = false)
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
if (force_no_deleteing) {
|
||||||
|
timer->deleting = 0;
|
||||||
|
}
|
||||||
InternalDelete(timer, true, false);
|
InternalDelete(timer, true, false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -421,7 +441,7 @@ namespace a8
|
|||||||
for (int j = 0; j < TVR_SIZE; j++) {
|
for (int j = 0; j < TVR_SIZE; j++) {
|
||||||
free_timers(base_->tv1.vec + j);
|
free_timers(base_->tv1.vec + j);
|
||||||
}
|
}
|
||||||
free_timers(&base_->free_timer);
|
free_timers(&base_->free_timer, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddTimerDestoryHandle(std::weak_ptr<XTimerPtr>& timer_ptr,
|
void AddTimerDestoryHandle(std::weak_ptr<XTimerPtr>& timer_ptr,
|
||||||
@ -445,6 +465,7 @@ namespace a8
|
|||||||
timer->expires = expires;
|
timer->expires = expires;
|
||||||
timer->expire_time = expire_time;
|
timer->expire_time = expire_time;
|
||||||
timer->base = base_;
|
timer->base = base_;
|
||||||
|
timer->deleting = 0;
|
||||||
timer->cb = std::move(cb);
|
timer->cb = std::move(cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user