summaryrefslogtreecommitdiff
path: root/ACE/ace/Singleton.cpp
diff options
context:
space:
mode:
authorAdam Mitz <mitza@ociweb.com>2017-12-21 10:18:10 -0600
committerAdam Mitz <mitza@ociweb.com>2017-12-21 10:18:10 -0600
commit5bbbaacd283951886642a5113300f0c0543e51c0 (patch)
tree35df250886496051ad069e9725602b583017d6f8 /ACE/ace/Singleton.cpp
parenta68721afec17c9ac51077591bf12159645ef0756 (diff)
downloadATCD-5bbbaacd283951886642a5113300f0c0543e51c0.tar.gz
fixed issue #554 ACE_Singleton use after ACE::fini, ACE::init
Diffstat (limited to 'ACE/ace/Singleton.cpp')
-rw-r--r--ACE/ace/Singleton.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/ACE/ace/Singleton.cpp b/ACE/ace/Singleton.cpp
index d6a7a23a3a2..52ca2b53d36 100644
--- a/ACE/ace/Singleton.cpp
+++ b/ACE/ace/Singleton.cpp
@@ -101,8 +101,11 @@ ACE_Singleton<TYPE, ACE_LOCK>::instance (void)
ACE_NEW_RETURN (singleton, (ACE_Singleton<TYPE, ACE_LOCK>), 0);
// Register for destruction with ACE_Object_Manager.
+#if !defined (ACE_MT_SAFE) || (ACE_MT_SAFE == 0)
ACE_Object_Manager::at_exit (singleton, 0, typeid (TYPE).name ());
-#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+#else
+ ACE_Object_Manager::at_exit (singleton, &lock,
+ typeid (TYPE).name ());
}
#endif /* ACE_MT_SAFE */
}
@@ -112,11 +115,21 @@ ACE_Singleton<TYPE, ACE_LOCK>::instance (void)
}
template <class TYPE, class ACE_LOCK> void
-ACE_Singleton<TYPE, ACE_LOCK>::cleanup (void *)
+ACE_Singleton<TYPE, ACE_LOCK>::cleanup (void *param)
{
ACE_Object_Manager::remove_at_exit (this);
delete this;
ACE_Singleton<TYPE, ACE_LOCK>::instance_i () = 0;
+
+#if !defined ACE_MT_SAFE || ACE_MT_SAFE == 0 || defined ACE_FACE_SAFETY_BASE
+ ACE_UNUSED_ARG (param);
+#else
+ if (param)
+ {
+ ACE_LOCK **lock = static_cast<ACE_LOCK **> (param);
+ *lock = 0;
+ }
+#endif
}
template <class TYPE, class ACE_LOCK> void