summaryrefslogtreecommitdiff
path: root/ace
diff options
context:
space:
mode:
authordoccvs <doccvs@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-10-13 21:01:51 +0000
committerdoccvs <doccvs@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-10-13 21:01:51 +0000
commit390bcb75694ef602cd923bfc2a39b31d209e68f1 (patch)
treec0a793c2719b9003a7d4940dc9b62d5b3afcc745 /ace
parent94a2900998612344bbbb5325d5700a50f6e13e54 (diff)
downloadATCD-390bcb75694ef602cd923bfc2a39b31d209e68f1.tar.gz
ChangeLogTag: Fri Oct 13 13:57:40 2000 Priyanka Gontla <pgontla@ece.uci.edu>
Diffstat (limited to 'ace')
-rw-r--r--ace/Process_Manager.cpp43
-rw-r--r--ace/Process_Manager.h4
-rw-r--r--ace/Service_Config.cpp5
3 files changed, 47 insertions, 5 deletions
diff --git a/ace/Process_Manager.cpp b/ace/Process_Manager.cpp
index afde854da19..cce3aa3f349 100644
--- a/ace/Process_Manager.cpp
+++ b/ace/Process_Manager.cpp
@@ -14,6 +14,20 @@
ACE_RCSID(ace, Process_Manager, "$Id$")
+#if defined (ACE_HAS_SIG_C_FUNC)
+extern "C" void
+ACE_Process_Manager_cleanup (void *instance, void *arg)
+{
+ ACE_Process_Manager::cleanup (instance, arg);
+}
+#endif
+
+void
+ACE_Process_Manager::cleanup (void *, void *)
+{
+ ACE_Process_Manager::close_singleton ();
+}
+
class ACE_Managed_Process : public ACE_Process
{
// = TITLE
@@ -114,6 +128,21 @@ ACE_Process_Manager::instance (void)
ACE_Process_Manager,
0);
ACE_Process_Manager::delete_instance_ = 1;
+
+ // Register with the Object_Manager so that the wrapper to
+ // delete the proactor will be called when Object_Manager is
+ // being terminated.
+
+#if defined ACE_HAS_SIG_C_FUNC
+ ACE_Object_Manager::at_exit (ACE_Process_Manager::instance_,
+ ACE_Process_Manager_cleanup,
+ 0);
+#else
+ ACE_Object_Manager::at_exit (ACE_Process_Manager::instance_,
+ ACE_Process_Manager::cleanup,
+ 0);
+#endif /* ACE_HAS_SIG_C_FUNC */
+
}
}
@@ -131,6 +160,20 @@ ACE_Process_Manager::instance (ACE_Process_Manager *tm)
// We can't safely delete it since we don't know who created it!
ACE_Process_Manager::delete_instance_ = 0;
+ // Register with the Object_Manager so that the wrapper to
+ // delete the proactor will be called when Object_Manager is
+ // being terminated.
+
+#if defined ACE_HAS_SIG_C_FUNC
+ ACE_Object_Manager::at_exit (ACE_Process_Manager::instance_,
+ ACE_Process_Manager_cleanup,
+ 0);
+#else
+ ACE_Object_Manager::at_exit (ACE_Process_Manager::instance_,
+ ACE_Process_Manager::cleanup,
+ 0);
+#endif /* ACE_HAS_SIG_C_FUNC */
+
ACE_Process_Manager::instance_ = tm;
return t;
}
diff --git a/ace/Process_Manager.h b/ace/Process_Manager.h
index 2246f987fac..c5257f00911 100644
--- a/ace/Process_Manager.h
+++ b/ace/Process_Manager.h
@@ -174,6 +174,10 @@ public:
static void close_singleton (void);
// Delete the dynamically allocated singleton.
+ static void cleanup (void *instance, void *arg);
+ // Cleanup method, used by the <ACE_Object_Manager> to destroy the
+ // singleton.
+
// = Process creation methods.
pid_t spawn (ACE_Process *proc,
diff --git a/ace/Service_Config.cpp b/ace/Service_Config.cpp
index bfb393e538d..df2979c9c50 100644
--- a/ace/Service_Config.cpp
+++ b/ace/Service_Config.cpp
@@ -11,7 +11,6 @@
#include "ace/Auto_Ptr.h"
#include "ace/Reactor.h"
#include "ace/Thread_Manager.h"
-#include "ace/Process_Manager.h"
#include "ace/Service_Config.h"
@@ -822,10 +821,6 @@ ACE_Service_Config::close_singletons (void)
{
ACE_TRACE ("ACE_Service_Config::close_singletons");
- ACE_Process_Manager::close_singleton ();
- // The Process Manager may be registered with the Reactor singleton
- // so we need to close it down first.
-
ACE_Reactor::close_singleton ();
#if ! defined (ACE_THREAD_MANAGER_LACKS_STATICS)