From 4591cf42f3e71b84229ac4c4668e63b3a751fa88 Mon Sep 17 00:00:00 2001 From: XieHan Date: Tue, 2 Feb 2021 19:15:20 +0800 Subject: [PATCH] fix named counter dismiss bug --- src/factory/WFTaskFactory.cc | 21 +++++++++++++++++++++ test/memory_unittest.cc | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/factory/WFTaskFactory.cc b/src/factory/WFTaskFactory.cc index dc826cc9..5ee626e4 100644 --- a/src/factory/WFTaskFactory.cc +++ b/src/factory/WFTaskFactory.cc @@ -76,6 +76,7 @@ public: void count_n(const std::string& name, unsigned int n); void count(struct __CounterList *counters, struct __counter_node *node); + void remove(struct __CounterList *counters, struct __counter_node *node); virtual ~__CounterMap(); @@ -104,6 +105,12 @@ public: counters_->push_back(&node_); } + virtual ~__WFCounterTask() + { + if (this->value != 0) + __CounterMap::get_instance()->remove(counters_, &node_); + } + virtual void count() { __CounterMap::get_instance()->count(counters_, &node_); @@ -259,6 +266,20 @@ void __CounterMap::count(struct __CounterList *counters, task->WFCounterTask::count(); } +void __CounterMap::remove(struct __CounterList *counters, + struct __counter_node *node) +{ + mutex_.lock(); + counters->del(node); + if (counters->empty()) + { + rb_erase(&counters->rb, &counters_map_); + delete counters; + } + + mutex_.unlock(); +} + WFCounterTask *WFTaskFactory::create_counter_task(const std::string& counter_name, unsigned int target_value, counter_callback_t callback) diff --git a/test/memory_unittest.cc b/test/memory_unittest.cc index 9bf42d7d..23a07bdf 100644 --- a/test/memory_unittest.cc +++ b/test/memory_unittest.cc @@ -36,7 +36,7 @@ TEST(memory_unittest, dismiss) auto *timer_task = WFTaskFactory::create_timer_task(0, nullptr); tasks.push_back(timer_task); - auto *counter_task = WFTaskFactory::create_counter_task("", 0, nullptr); + auto *counter_task = WFTaskFactory::create_counter_task("", 1, nullptr); tasks.push_back(counter_task); auto *go_task = WFTaskFactory::create_go_task("", [](){});