Go to the documentation of this file.00001
00002
00003 #include "ace/Cleanup.h"
00004
00005 ACE_RCSID (ace,
00006 Cleanup,
00007 "$Id: Cleanup.cpp 84201 2009-01-20 06:26:02Z johnnyw $")
00008
00009 #if !defined (ACE_HAS_INLINED_OSCALLS)
00010 # include "ace/Cleanup.inl"
00011 #endif
00012
00013 #include "ace/OS_Memory.h"
00014 #include "ace/OS_NS_string.h"
00015 #include "ace/os_include/os_typeinfo.h"
00016
00017 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00018
00019 void
00020 ACE_Cleanup::cleanup (void *)
00021 {
00022 delete this;
00023 }
00024
00025 ACE_Cleanup::~ACE_Cleanup (void)
00026 {
00027 }
00028
00029
00030
00031 extern "C" void
00032 ACE_CLEANUP_DESTROYER_NAME (ACE_Cleanup *object, void *param)
00033 {
00034 object->cleanup (param);
00035 }
00036
00037
00038
00039 ACE_Cleanup_Info_Node::ACE_Cleanup_Info_Node (void)
00040 : object_ (0),
00041 cleanup_hook_ (0),
00042 param_ (0),
00043 name_ (0)
00044 {
00045 }
00046
00047 ACE_Cleanup_Info_Node::ACE_Cleanup_Info_Node (void *object,
00048 ACE_CLEANUP_FUNC cleanup_hook,
00049 void *param,
00050 const char *name)
00051 : object_ (object),
00052 cleanup_hook_ (cleanup_hook),
00053 param_ (param),
00054 name_ (name ? ACE_OS::strdup (name) : 0)
00055 {
00056 }
00057
00058 ACE_Cleanup_Info_Node::~ACE_Cleanup_Info_Node (void)
00059 {
00060 if (this->name_)
00061 ACE_OS::free ((void *) name_);
00062 }
00063
00064 bool
00065 ACE_Cleanup_Info_Node::operator== (const ACE_Cleanup_Info_Node &o) const
00066 {
00067 return o.object_ == this->object_
00068 && o.cleanup_hook_ == this->cleanup_hook_
00069 && o.param_ == this->param_;
00070 }
00071
00072 bool
00073 ACE_Cleanup_Info_Node::operator!= (const ACE_Cleanup_Info_Node &o) const
00074 {
00075 return !(*this == o);
00076 }
00077
00078
00079
00080
00081 ACE_OS_Exit_Info::ACE_OS_Exit_Info (void)
00082 {
00083 }
00084
00085 ACE_OS_Exit_Info::~ACE_OS_Exit_Info (void)
00086 {
00087 }
00088
00089 int
00090 ACE_OS_Exit_Info::at_exit_i (void *object,
00091 ACE_CLEANUP_FUNC cleanup_hook,
00092 void *param,
00093 const char* name)
00094 {
00095
00096
00097 ACE_Cleanup_Info_Node *new_node = 0;
00098
00099 ACE_NEW_RETURN (new_node,
00100 ACE_Cleanup_Info_Node (object, cleanup_hook, param, name),
00101 -1);
00102
00103 registered_objects_.push_front (new_node);
00104
00105 return 0;
00106 }
00107
00108 bool
00109 ACE_OS_Exit_Info::find (void *object)
00110 {
00111 for (ACE_Cleanup_Info_Node *iter = registered_objects_.head ();
00112 iter != 0;
00113 iter = iter->next ())
00114 {
00115 if (iter->object () == object)
00116 {
00117
00118 return true;
00119 }
00120 }
00121
00122 return false;
00123 }
00124
00125 bool
00126 ACE_OS_Exit_Info::remove (void *object)
00127 {
00128 ACE_Cleanup_Info_Node *node = 0;
00129 for (ACE_Cleanup_Info_Node *iter = registered_objects_.head ();
00130 iter != 0;
00131 iter = iter->next ())
00132 {
00133 if (iter->object () == object)
00134 {
00135 node = iter;
00136 break;
00137 }
00138 }
00139
00140 if (node)
00141 {
00142 registered_objects_.remove (node);
00143 delete node;
00144 return true;
00145 }
00146
00147 return false;
00148 }
00149
00150
00151 void
00152 ACE_OS_Exit_Info::call_hooks (void)
00153 {
00154
00155
00156 for (ACE_Cleanup_Info_Node *iter = registered_objects_.pop_front ();
00157 iter != 0;
00158 iter = registered_objects_.pop_front ())
00159 {
00160 if (iter->cleanup_hook () == reinterpret_cast<ACE_CLEANUP_FUNC> (
00161 ACE_CLEANUP_DESTROYER_NAME))
00162 {
00163
00164 ACE_CLEANUP_DESTROYER_NAME (
00165 reinterpret_cast<ACE_Cleanup *> (iter->object ()),
00166 iter->param ());
00167 }
00168 else if (iter->object () == &ace_exit_hook_marker)
00169 {
00170
00171 (* reinterpret_cast<ACE_EXIT_HOOK> (iter->cleanup_hook ())) ();
00172 }
00173 else
00174 {
00175 (*iter->cleanup_hook ()) (iter->object (), iter->param ());
00176 }
00177 delete iter;
00178 }
00179 }
00180
00181 ACE_END_VERSIONED_NAMESPACE_DECL