diff options
author | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-12-02 12:45:11 +0000 |
---|---|---|
committer | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-12-02 12:45:11 +0000 |
commit | 91ddfbcb15dde0accf0fe699cc6a8a60030b5e37 (patch) | |
tree | d978d8a5dbe517b75741026cccc132c91ebc16e7 | |
parent | 823d3a8d6c34ca52f1a19b7255d6d463f19a307a (diff) | |
download | ATCD-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.cpp | 18 |
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; |