diff options
author | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-09-09 20:47:17 +0000 |
---|---|---|
committer | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-09-09 20:47:17 +0000 |
commit | f9ff29686ecda4e110c4affb8377d9c5697c38b1 (patch) | |
tree | 69f04dabd18069b6df3e41b1b609cc932b113dfa /ace | |
parent | 7aae22eb77e41a1c46431af11956bf4ec99c08bb (diff) | |
download | ATCD-f9ff29686ecda4e110c4affb8377d9c5697c38b1.tar.gz |
preallocate locks for CORBA_Handler and Dump in ACE_Object_Manager
Diffstat (limited to 'ace')
-rw-r--r-- | ace/CORBA_Handler.cpp | 29 | ||||
-rw-r--r-- | ace/CORBA_Handler.h | 4 | ||||
-rw-r--r-- | ace/Dump.cpp | 10 | ||||
-rw-r--r-- | ace/Dump.h | 4 | ||||
-rw-r--r-- | ace/Object_Manager.cpp | 47 | ||||
-rw-r--r-- | ace/Object_Manager.h | 20 |
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 |