diff --git a/src/factory/WFTaskFactory.cc b/src/factory/WFTaskFactory.cc index cd896030..8793747a 100644 --- a/src/factory/WFTaskFactory.cc +++ b/src/factory/WFTaskFactory.cc @@ -79,6 +79,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(); @@ -107,6 +108,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_); @@ -262,6 +269,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)