diff options
author | mcorino <mcorino@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2011-12-19 13:38:49 +0000 |
---|---|---|
committer | mcorino <mcorino@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2011-12-19 13:38:49 +0000 |
commit | 114b9575f85b78e54edbf04fcc4191d685877699 (patch) | |
tree | f52ef403e37a2e1303f3e8ae692e099338dfada1 /ACE/ace/Timer_Hash_T.cpp | |
parent | 6f33ac6bb28d3068f7b739c204c0ce1308b1d91b (diff) | |
download | ATCD-114b9575f85b78e54edbf04fcc4191d685877699.tar.gz |
Mon Dec 19 13:28:16 UTC 2011 Martin Corino <mcorino@remedy.nl>
* ace/Abstract_Timer_Queue.h:
* ace/Timer_Hash_T.h:
* ace/Timer_Hash_T.cpp:
* ace/Timer_Heap_T.h:
* ace/Timer_Heap_T.cpp:
* ace/Timer_List_T.h:
* ace/Timer_List_T.cpp:
* ace/Timer_Queue_Adapters.inl:
* ace/Timer_Queue_Adapters.cpp:
* ace/Timer_Wheel_T.h:
* ace/Timer_Wheel_T.cpp:
Added close() method.
* ace/Dev_Poll_Reactor.cpp:
* ace/Proactor.cpp:
* ace/Select_Reactor_T.cpp:
* ace/WFMO_Reactor.cpp:
Implemented support for timer queue close ().
The rationale for these changes is that when using reactors with
user defined timer queues the reactor does not delete the timer queue
when being deleted itself. Without any other cleanup this created the
possibility (as encountered in TAO/tests/Bug_3837_Regression after
introduction of the TIME_POLICY changes) of outstanding timer handlers
in the queue being triggered and attempting to access the reactor after
the reactor has been destroyed.
Calling close () for timer queues the reactor does not delete solves
this potential problem.
Diffstat (limited to 'ACE/ace/Timer_Hash_T.cpp')
-rw-r--r-- | ACE/ace/Timer_Hash_T.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/ACE/ace/Timer_Hash_T.cpp b/ACE/ace/Timer_Hash_T.cpp index 9b9767f13ff..2965ae2dc77 100644 --- a/ACE/ace/Timer_Hash_T.cpp +++ b/ACE/ace/Timer_Hash_T.cpp @@ -349,14 +349,37 @@ ACE_Timer_Hash_T<TYPE, FUNCTOR, ACE_LOCK, BUCKET, TIME_POLICY>::~ACE_Timer_Hash_ delete iterator_; + this->close (); + for (size_t i = 0; i < this->table_size_; ++i) delete this->table_[i]; + delete [] this->table_; } +template <class TYPE, class FUNCTOR, class ACE_LOCK, class BUCKET, typename TIME_POLICY> int +ACE_Timer_Hash_T<TYPE, FUNCTOR, ACE_LOCK, BUCKET, TIME_POLICY>::close (void) +{ + ACE_TRACE ("ACE_Timer_Hash_T::close"); + ACE_MT (ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, -1)); + + // Remove all remaining items from the queue. + while (!this->is_empty()) + { + ACE_Timer_Node_T<TYPE>* n = this->remove_first(); + this->upcall_functor ().deletion (*this, + n->get_type(), + n->get_act()); + this->free_node (n); + } + + // leave the rest to destructor + return 0; +} + // Checks if queue is empty. template <class TYPE, class FUNCTOR, class ACE_LOCK, class BUCKET, typename TIME_POLICY> bool |