diff options
author | Johnny Willemsen <jwillemsen@remedy.nl> | 2008-12-03 07:57:38 +0000 |
---|---|---|
committer | Johnny Willemsen <jwillemsen@remedy.nl> | 2008-12-03 07:57:38 +0000 |
commit | e1eb83702cfe1ebc7f7a5474449b336bc897907f (patch) | |
tree | 57616aae5ae0379bae7d22cc360fcbde9da4972b /ACE/ace/Cleanup.cpp | |
parent | 2930d7f4c50193600731490afcbb004465c26640 (diff) | |
download | ATCD-e1eb83702cfe1ebc7f7a5474449b336bc897907f.tar.gz |
Wed Dec 3 07:55:00 UTC 2008 Johnny Willemsen <jwillemsen@remedy.nl>
Diffstat (limited to 'ACE/ace/Cleanup.cpp')
-rw-r--r-- | ACE/ace/Cleanup.cpp | 149 |
1 files changed, 58 insertions, 91 deletions
diff --git a/ACE/ace/Cleanup.cpp b/ACE/ace/Cleanup.cpp index fdbd765edea..2c8ba21d8f1 100644 --- a/ACE/ace/Cleanup.cpp +++ b/ACE/ace/Cleanup.cpp @@ -34,24 +34,29 @@ ACE_CLEANUP_DESTROYER_NAME (ACE_Cleanup *object, void *param) /*****************************************************************************/ -ACE_Cleanup_Info::ACE_Cleanup_Info (void) +ACE_Cleanup_Info_Node::ACE_Cleanup_Info_Node (void) : object_ (0), cleanup_hook_ (0), param_ (0) { } -ACE_Cleanup_Info::ACE_Cleanup_Info (void *object, - ACE_CLEANUP_FUNC cleanup_hook, - void *param) +ACE_Cleanup_Info_Node::ACE_Cleanup_Info_Node (void *object, + ACE_CLEANUP_FUNC cleanup_hook, + void *param) : object_ (object), cleanup_hook_ (cleanup_hook), param_ (param) { } + +ACE_Cleanup_Info_Node::~ACE_Cleanup_Info_Node (void) +{ +} + bool -ACE_Cleanup_Info::operator== (const ACE_Cleanup_Info &o) const +ACE_Cleanup_Info_Node::operator== (const ACE_Cleanup_Info_Node &o) const { return o.object_ == this->object_ && o.cleanup_hook_ == this->cleanup_hook_ @@ -59,75 +64,20 @@ ACE_Cleanup_Info::operator== (const ACE_Cleanup_Info &o) const } bool -ACE_Cleanup_Info::operator!= (const ACE_Cleanup_Info &o) const +ACE_Cleanup_Info_Node::operator!= (const ACE_Cleanup_Info_Node &o) const { return !(*this == o); } -/*****************************************************************************/ - -/** - * @class ACE_Cleanup_Info_Node - * - * @brief For maintaining a list of ACE_Cleanup_Info items. - * - * For internal use by ACE_Object_Manager. - */ -class ACE_Cleanup_Info_Node -{ -public: - ACE_Cleanup_Info_Node (void); - ACE_Cleanup_Info_Node (const ACE_Cleanup_Info &new_info, - ACE_Cleanup_Info_Node *next); - ~ACE_Cleanup_Info_Node (void); - ACE_Cleanup_Info_Node *insert (const ACE_Cleanup_Info &); -private: - ACE_Cleanup_Info cleanup_info_; - ACE_Cleanup_Info_Node *next_; - - friend class ACE_OS_Exit_Info; -}; - -ACE_Cleanup_Info_Node::ACE_Cleanup_Info_Node (void) - : cleanup_info_ (), - next_ (0) -{ -} - -ACE_Cleanup_Info_Node::ACE_Cleanup_Info_Node (const ACE_Cleanup_Info &new_info, - ACE_Cleanup_Info_Node *next) - : cleanup_info_ (new_info), - next_ (next) -{ -} - -ACE_Cleanup_Info_Node::~ACE_Cleanup_Info_Node (void) -{ - delete next_; -} - -ACE_Cleanup_Info_Node * -ACE_Cleanup_Info_Node::insert (const ACE_Cleanup_Info &new_info) -{ - ACE_Cleanup_Info_Node *new_node = 0; - - ACE_NEW_RETURN (new_node, - ACE_Cleanup_Info_Node (new_info, this), - 0); - - return new_node; -} /*****************************************************************************/ ACE_OS_Exit_Info::ACE_OS_Exit_Info (void) { - ACE_NEW (registered_objects_, ACE_Cleanup_Info_Node); } ACE_OS_Exit_Info::~ACE_OS_Exit_Info (void) { - delete registered_objects_; } int @@ -135,31 +85,27 @@ ACE_OS_Exit_Info::at_exit_i (void *object, ACE_CLEANUP_FUNC cleanup_hook, void *param) { - ACE_Cleanup_Info new_info (object, cleanup_hook, param); - // Return -1 and sets errno if unable to allocate storage. Enqueue // at the head and dequeue from the head to get LIFO ordering. - ACE_Cleanup_Info_Node *new_node = 0; - if ((new_node = registered_objects_->insert (new_info)) == 0) - return -1; - else - { - registered_objects_ = new_node; - return 0; - } + ACE_NEW_RETURN (new_node, + ACE_Cleanup_Info_Node (object, cleanup_hook, param), + -1); + + registered_objects_.push_front (new_node); + + return 0; } bool ACE_OS_Exit_Info::find (void *object) { - // Check for already in queue, and return true if so. - for (ACE_Cleanup_Info_Node *iter = registered_objects_; - iter && iter->next_ != 0; - iter = iter->next_) + for (ACE_Cleanup_Info_Node *iter = registered_objects_.head (); + iter != 0; + iter = iter->next ()) { - if (iter->cleanup_info_.object_ == object) + if (iter->object () == object) { // The object has already been registered. return true; @@ -169,39 +115,60 @@ ACE_OS_Exit_Info::find (void *object) return false; } +bool +ACE_OS_Exit_Info::remove (void *object) +{ + ACE_Cleanup_Info_Node *node = 0; + for (ACE_Cleanup_Info_Node *iter = registered_objects_.head (); + iter != 0; + iter = iter->next ()) + { + if (iter->object () == object) + { + node = iter; + break; + } + } + + if (node) + { + registered_objects_.remove (node); + delete node; + return true; + } + + return false; +} + + void ACE_OS_Exit_Info::call_hooks (void) { // Call all registered cleanup hooks, in reverse order of // registration. - for (ACE_Cleanup_Info_Node *iter = registered_objects_; - iter && iter->next_ != 0; - iter = iter->next_) + for (ACE_Cleanup_Info_Node *iter = registered_objects_.pop_front (); + iter != 0; + iter = registered_objects_.pop_front ()) { - ACE_Cleanup_Info &info = iter->cleanup_info_; - if (info.cleanup_hook_ == reinterpret_cast<ACE_CLEANUP_FUNC> ( + if (iter->cleanup_hook () == reinterpret_cast<ACE_CLEANUP_FUNC> ( ACE_CLEANUP_DESTROYER_NAME)) { // The object is an ACE_Cleanup. ACE_CLEANUP_DESTROYER_NAME ( - reinterpret_cast<ACE_Cleanup *> (info.object_), - info.param_); + reinterpret_cast<ACE_Cleanup *> (iter->object ()), + iter->param ()); } - else if (info.object_ == &ace_exit_hook_marker) + else if (iter->object () == &ace_exit_hook_marker) { // The hook is an ACE_EXIT_HOOK. - (* reinterpret_cast<ACE_EXIT_HOOK> (info.cleanup_hook_)) (); + (* reinterpret_cast<ACE_EXIT_HOOK> (iter->cleanup_hook ())) (); } else { - (*info.cleanup_hook_) (info.object_, info.param_); + (*iter->cleanup_hook ()) (iter->object (), iter->param ()); } + delete iter; } - - // Delete now the list of cleanup hooks, all are called and we don't want - // to call them again - delete registered_objects_; - registered_objects_ = 0; } ACE_END_VERSIONED_NAMESPACE_DECL |