summaryrefslogtreecommitdiff
path: root/ace
diff options
context:
space:
mode:
authorlevine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1997-09-09 20:47:17 +0000
committerlevine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1997-09-09 20:47:17 +0000
commitf9ff29686ecda4e110c4affb8377d9c5697c38b1 (patch)
tree69f04dabd18069b6df3e41b1b609cc932b113dfa /ace
parent7aae22eb77e41a1c46431af11956bf4ec99c08bb (diff)
downloadATCD-f9ff29686ecda4e110c4affb8377d9c5697c38b1.tar.gz
preallocate locks for CORBA_Handler and Dump in ACE_Object_Manager
Diffstat (limited to 'ace')
-rw-r--r--ace/CORBA_Handler.cpp29
-rw-r--r--ace/CORBA_Handler.h4
-rw-r--r--ace/Dump.cpp10
-rw-r--r--ace/Dump.h4
-rw-r--r--ace/Object_Manager.cpp47
-rw-r--r--ace/Object_Manager.h20
6 files changed, 87 insertions, 27 deletions
diff --git a/ace/CORBA_Handler.cpp b/ace/CORBA_Handler.cpp
index fd6760ea551..4a859d0a657 100644
--- a/ace/CORBA_Handler.cpp
+++ b/ace/CORBA_Handler.cpp
@@ -4,6 +4,10 @@
#define ACE_BUILD_DLL
#include "ace/CORBA_Handler.h"
+#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+# include "ace/Object_Manager.h"
+#endif /* ACE_MT_SAFE */
+
#if !defined (__ACE_INLINE__)
#include "ace/CORBA_Handler.i"
#endif /* __ACE_INLINE__ */
@@ -345,7 +349,8 @@ ACE_ALLOC_HOOK_DEFINE(ACE_MT_CORBA_Handler)
#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
// Synchronize output operations.
-ACE_Thread_Mutex ACE_MT_CORBA_Handler::ace_mt_corba_handler_lock_;
+u_int ACE_MT_CORBA_Handler::ace_mt_corba_handler_lock_ =
+ ACE_Object_Manager::ACE_MT_CORBA_HANDLER_LOCK;
#endif /* ACE_MT_SAFE */
void
@@ -359,7 +364,9 @@ ACE_MT_CORBA_Handler::dump (void) const
this->pipe_.dump ();
#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
// Double-Check lock.
- ace_mt_corba_handler_lock_.dump ();
+ ACE_Thread_Mutex *lock = ACE_Managed_Object<ACE_Thread_Mutex>::get_object
+ (ace_mt_corba_handler_lock_);
+ if (lock != 0) lock->dump ();
#endif /* ACE_MT_SAFE */
ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
}
@@ -376,7 +383,12 @@ ACE_MT_CORBA_Handler::instance (void)
if (ACE_MT_CORBA_Handler::instance_ == 0)
{
- ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, ACE_MT_CORBA_Handler::ace_mt_corba_handler_lock_, 0);
+#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+ ACE_Thread_Mutex *lock = ACE_Managed_Object<ACE_Thread_Mutex>::get_object
+ (ace_mt_corba_handler_lock_);
+ if (lock == 0) return 0;
+ ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, *lock, 0);
+#endif /* ACE_MT_SAFE */
if (ACE_MT_CORBA_Handler::instance_ == 0)
ACE_NEW_RETURN (ACE_MT_CORBA_Handler::instance_,
@@ -447,10 +459,13 @@ ACE_MT_CORBA_Handler::process_events (void *)
// the instance must exist.
if (ACE_MT_CORBA_Handler::instance_ == 0)
{
- ACE_GUARD_RETURN (ACE_Thread_Mutex,
- ace_mon,
- ace_mt_corba_handler_lock_,
- 0);
+#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+ ACE_Thread_Mutex *lock = ACE_Managed_Object<ACE_Thread_Mutex>::get_object
+ (ace_mt_corba_handler_lock_);
+ if (lock == 0) return 0;
+ ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, lock, 0);
+#endif /* ACE_MT_SAFE */
+
ACE_ASSERT (ACE_MT_CORBA_Handler::instance_ != 0);
}
diff --git a/ace/CORBA_Handler.h b/ace/CORBA_Handler.h
index 4c95a6a78f7..7b280759308 100644
--- a/ace/CORBA_Handler.h
+++ b/ace/CORBA_Handler.h
@@ -229,8 +229,8 @@ protected:
// Used to send CORBA::Requests through the server
#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
- static ACE_Thread_Mutex ace_mt_corba_handler_lock_;
- // Double-Check lock.
+ static u_int ace_mt_corba_handler_lock_;
+ // Double-Check lock identifier.
#endif /* ACE_MT_SAFE */
};
#endif /* ACE_HAS_MT_ORBIX */
diff --git a/ace/Dump.cpp b/ace/Dump.cpp
index 57e8aae7ac6..26e404195ec 100644
--- a/ace/Dump.cpp
+++ b/ace/Dump.cpp
@@ -4,10 +4,11 @@
#define ACE_BUILD_DLL
#include "ace/Synch_T.h"
#include "ace/Dump.h"
+#include "ace/Object_Manager.h"
#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
// Synchronize output operations.
-ACE_Thread_Mutex ACE_ODB::ace_dump_lock_;
+u_int ACE_ODB::ace_dump_lock_ = ACE_Object_Manager::ACE_DUMP_LOCK;
#endif /* ACE_MT_SAFE */
// Implementations (very simple for now...)
@@ -59,7 +60,12 @@ ACE_ODB::instance (void)
if (ACE_ODB::instance_ == 0)
{
- ACE_MT (ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, ACE_ODB::ace_dump_lock_, 0));
+#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+ ACE_Thread_Mutex *lock = ACE_Managed_Object<ACE_Thread_Mutex>::get_object
+ (ACE_ODB::ace_dump_lock_);
+ if (lock == 0) return 0;
+ ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, *lock, 0);
+#endif /* ACE_MT_SAFE */
if (ACE_ODB::instance_ == 0)
ACE_NEW_RETURN (ACE_ODB::instance_, ACE_ODB, 0);
diff --git a/ace/Dump.h b/ace/Dump.h
index fb03a6adffb..ab1f2053a95 100644
--- a/ace/Dump.h
+++ b/ace/Dump.h
@@ -144,8 +144,8 @@ private:
// Current size of <object_table_>.
#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
- static ACE_Thread_Mutex ace_dump_lock_;
- // Double-Check lock.
+ static u_int ace_dump_lock_;
+ // Double-Check lock identifier.
#endif /* ACE_MT_SAFE */
};
diff --git a/ace/Object_Manager.cpp b/ace/Object_Manager.cpp
index 3fd2e4a28cc..f60c5261fe4 100644
--- a/ace/Object_Manager.cpp
+++ b/ace/Object_Manager.cpp
@@ -15,6 +15,28 @@
// Singleton pointer.
ACE_Object_Manager *ACE_Object_Manager::instance_ = 0;
+void *ACE_Object_Manager::managed_object[ACE_MAX_MANAGED_OBJECTS] = { 0 };
+
+u_int ACE_Object_Manager::next_managed_object = 0;
+
+template <class TYPE>
+class ACE_Managed_Cleanup : public ACE_Cleanup
+{
+public:
+ ACE_Managed_Cleanup (TYPE *object) : object_ (object) {}
+ virtual ~ACE_Managed_Cleanup ();
+private:
+ TYPE *object_;
+};
+
+
+template <class TYPE>
+ACE_Managed_Cleanup<TYPE>::~ACE_Managed_Cleanup ()
+{
+ delete (TYPE *) object_;
+}
+
+
ACE_Object_Manager::ACE_Object_Manager (void)
: shutting_down_(0)
{
@@ -28,6 +50,25 @@ ACE_Object_Manager::ACE_Object_Manager (void)
instance_ = this;
#endif /* ACE_HAS_NONSTATIC_OBJECT_MANAGER */
+ // Allocate the preallocated (hard-coded) object instances, and
+ // register them for destruction.
+# if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+ ACE_Thread_Mutex *mutex;
+ ACE_Managed_Cleanup<ACE_Thread_Mutex> *object;
+
+ ACE_NEW (mutex, ACE_Thread_Mutex);
+ ACE_NEW (object, ACE_Managed_Cleanup<ACE_Thread_Mutex> (mutex));
+ managed_object[ACE_MT_CORBA_HANDLER_LOCK] = object;
+ at_exit (object);
+
+ ACE_NEW (mutex, ACE_Thread_Mutex);
+ ACE_NEW (object, ACE_Managed_Cleanup<ACE_Thread_Mutex> (mutex));
+ managed_object[ACE_DUMP_LOCK] = object;
+ at_exit (object);
+# endif /* ACE_MT_SAFE */
+
+ next_managed_object = ACE_END_OF_PREALLOCATED_OBJECTS;
+
#if defined (ACE_HAS_TSS_EMULATION)
// Initialize the main thread's TS storage.
ACE_TSS_Emulation::tss_open (ts_storage_);
@@ -140,10 +181,6 @@ ACE_Object_Manager::at_exit_i (void *object,
return registered_objects_->enqueue_head (new_info);
}
-void *ACE_Object_Manager::managed_object[ACE_MAX_MANAGED_OBJECTS] = { 0 };
-
-u_int ACE_Object_Manager::next_managed_object = 0;
-
template <class TYPE>
int
ACE_Managed_Object<TYPE>::get_object (u_int &id, TYPE *&object)
@@ -218,6 +255,7 @@ ACE_Managed_Object<TYPE>::get_object (u_int &id)
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
# if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
template class ACE_Managed_Object <ACE_Thread_Mutex>;
+ template class ACE_Managed_Cleanup<ACE_Thread_Mutex>;
# endif /* ACE_MT_SAFE */
template class ACE_Unbounded_Queue<ACE_Cleanup_Info>;
template class ACE_Unbounded_Queue_Iterator<ACE_Cleanup_Info>;
@@ -225,6 +263,7 @@ template class ACE_Node<ACE_Cleanup_Info>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
# if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
# pragma instantiate ACE_Managed_Object <ACE_Thread_Mutex>
+# pragma instantiate ACE_Managed_Cleanup<ACE_Thread_Mutex>
# endif /* ACE_MT_SAFE */
#pragma instantiate ACE_Unbounded_Queue<ACE_Cleanup_Info>
#pragma instantiate ACE_Unbounded_Queue_Iterator<ACE_Cleanup_Info>
diff --git a/ace/Object_Manager.h b/ace/Object_Manager.h
index 957f67843eb..8b77018a28c 100644
--- a/ace/Object_Manager.h
+++ b/ace/Object_Manager.h
@@ -92,6 +92,16 @@ public:
// when the current thread exits instead of when the program terminates.
#endif /* 0 */
+ enum Preallocated_Objects
+ {
+#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+ ACE_MT_CORBA_HANDLER_LOCK,
+ ACE_DUMP_LOCK,
+#endif /* ACE_MT_SAFE */
+
+ ACE_END_OF_PREALLOCATED_OBJECTS // This enum value must be last!
+ };
+
private:
static ACE_Object_Manager *instance_;
// Singleton pointer.
@@ -190,16 +200,6 @@ public:
// ENOSPC if no more table slots are available: see the
// ACE_MAX_MANAGED_OBJECTS config variable.
- enum Preallocated_Objects
- {
-#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
- ACE_MT_CORBA_HANDLER_LOCK,
- ACE_DUMP_LOCK,
-#endif /* ACE_MT_SAFE */
-
- ACE_END_OF_PREALLOCATED_OBJECTS // This enum value must be last!
- };
-
static TYPE *get_object (u_int &id);
// Get the object identified by "id". Returns a pointer to the
// object, or 0 if any error was encountered. Because no other