summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlevine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1997-12-02 12:45:11 +0000
committerlevine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1997-12-02 12:45:11 +0000
commit91ddfbcb15dde0accf0fe699cc6a8a60030b5e37 (patch)
treed978d8a5dbe517b75741026cccc132c91ebc16e7
parent823d3a8d6c34ca52f1a19b7255d6d463f19a307a (diff)
downloadATCD-91ddfbcb15dde0accf0fe699cc6a8a60030b5e37.tar.gz
(~ACE_Object_Manager_Destroyer): don't delete the ACE_Object_Manager if not destroyed by the main thread
-rw-r--r--ace/Object_Manager.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/ace/Object_Manager.cpp b/ace/Object_Manager.cpp
index 8e6dabec4d1..d73f443bb51 100644
--- a/ace/Object_Manager.cpp
+++ b/ace/Object_Manager.cpp
@@ -740,22 +740,32 @@ class ACE_Export ACE_Object_Manager_Destroyer
public:
ACE_Object_Manager_Destroyer (void);
~ACE_Object_Manager_Destroyer (void);
+
+private:
+ ACE_Thread_ID _saved_main_thread_id = ACE_OS::thr_self();
+ // Save the main thread ID, so that destruction can be suppressed.
};
ACE_Object_Manager_Destroyer::ACE_Object_Manager_Destroyer (void)
+ : _saved_main_thread_id (ACE_OS::thr_self())
{
// Ensure that the Object_Manager gets initialized before any
// application threads have been spawned. Because this will be called
// during construction of static objects, that should always be the
// case.
- ACE_Object_Manager &object_manager = *ACE_Object_Manager::instance ();
- ACE_UNUSED_ARG (object_manager);
+ (void) ACE_Object_Manager::instance ();
}
ACE_Object_Manager_Destroyer::~ACE_Object_Manager_Destroyer (void)
{
- delete ACE_Object_Manager::instance_;
- ACE_Object_Manager::instance_ = 0;
+ if (ACE_OS::thr_self() == _saved_main_thread_id)
+ {
+ delete ACE_Object_Manager::instance_;
+ ACE_Object_Manager::instance_ = 0;
+ }
+ // else if this destructor is not called by the main thread, then
+ // do not delete the ACE_Object_Manager. That causes problems, on
+ // WIN32 at least.
}
static ACE_Object_Manager_Destroyer ACE_Object_Manager_Destroyer_internal;