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("", [](){});