summaryrefslogtreecommitdiff
path: root/ACE/ace/Cleanup.cpp
diff options
context:
space:
mode:
authorJohnny Willemsen <jwillemsen@remedy.nl>2008-12-03 07:57:38 +0000
committerJohnny Willemsen <jwillemsen@remedy.nl>2008-12-03 07:57:38 +0000
commite1eb83702cfe1ebc7f7a5474449b336bc897907f (patch)
tree57616aae5ae0379bae7d22cc360fcbde9da4972b /ACE/ace/Cleanup.cpp
parent2930d7f4c50193600731490afcbb004465c26640 (diff)
downloadATCD-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.cpp149
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