diff options
Diffstat (limited to 'ace/Synch.h')
-rw-r--r-- | ace/Synch.h | 1019 |
1 files changed, 1019 insertions, 0 deletions
diff --git a/ace/Synch.h b/ace/Synch.h new file mode 100644 index 00000000000..01f33cd8748 --- /dev/null +++ b/ace/Synch.h @@ -0,0 +1,1019 @@ +/* -*- C++ -*- */ +// $Id$ + + +// ============================================================================ +// +// = LIBRARY +// ace +// +// = FILENAME +// Synch.h +// +// = DESCRIPTION +// Wrappers for various synchronization routines. +// +// = AUTHOR +// Doug Schmidt +// +// ============================================================================ + +#if !defined (ACE_SYNCH_H) +#define ACE_SYNCH_H + +#include "ace/ACE.h" +#include "ace/SV_Semaphore_Complex.h" + +// Forward declarations. +class ACE_Time_Value; +// template <class ACE_COND_MUTEX> class ACE_Condition; + +class ACE_Export ACE_File_Lock + // = TITLE + // A wrapper around the UNIX file locking mechanism. + // + // = DESCRIPTION + // Allows us to "adapt" the UNIX file locking mechanisms to work + // with all of our Guard stuff... +{ +public: + ACE_File_Lock (ACE_HANDLE handle = ACE_INVALID_HANDLE); + // Set the <handle_> of the File_Lock to <handle>. Note that this + // constructor assumes ownership of the <handle> and will close it + // down in <remove>. If you want the <handle> stays open when + // <remove> is called make sure to call <dup> on the <handle> before + // closing it. + + ACE_File_Lock (const char *filename, int flags, mode_t mode = 0); + // Open the <filename> with <flags> and <mode> and set the result to + // <handle_>. + + ~ACE_File_Lock (void); + // Remove a File lock by releasing it and closing down the <handle_>. + + int remove (void); + // Remove a File lock by releasing it and closing down the <handle_>. + + int acquire (short whence = 0, off_t start = 0, off_t len = 1); + // Note, for interface uniformity with other synchronization + // wrappers we include the <acquire> method. This is implemented as + // a write-lock to be on the safe-side... + + int tryacquire (short whence = 0, off_t start = 0, off_t len = 1); + // Note, for interface uniformity with other synchronization + // wrappers we include the <tryacquire> method. This is implemented + // as a write-lock to be on the safe-side... + + int release (short whence = 0, off_t start = 0, off_t len = 1); + // Unlock a readers/writer lock. + + int acquire_write (short whence = 0, off_t start = 0, off_t len = 1); + // Acquire a write lock, but block if any readers or a + // writer hold the lock. + + int tryacquire_write (short whence = 0, off_t start = 0, off_t len = 1); + // Conditionally acquire a write lock (i.e., won't block). + + int acquire_read (short whence = 0, off_t start = 0, off_t len = 1); + // Acquire a read lock, but block if a writer hold the lock. + + int tryacquire_read (short whence = 0, off_t start = 0, off_t len = 1); + // Conditionally acquire a read lock (i.e., won't block). + + ACE_HANDLE get_handle (void); + // Get underlying <ACE_HANDLE>. + + void set_handle (ACE_HANDLE); + // Set underlying <ACE_HANDLE>. Note that this method assumes + // ownership of the <handle> and will close it down in <remove>. If + // you want the <handle> stays open when <remove> is called make + // sure to call <dup> on the <handle> before closing it. + + void dump (void) const; + // Dump state of the object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +protected: + ACE_OS::flock_t lock_; + // Locking structure for OS record locks. + + // = Prevent assignment and initialization. + void operator= (const ACE_File_Lock &) {} + ACE_File_Lock (const ACE_File_Lock &) {} +}; + +#if defined (ACE_HAS_THREADS) // ACE platform supports some form of threading. + +class ACE_Export ACE_Event + // = TITLE + // A wrapper around the Win32 event locking mechanism. + // + // = DESCRIPTION + // Portable implementation of an Event mechanism, which is + // native to Win32, but must be emulated on UNIX. +{ +public: + ACE_Event (int manual_reset = 0, + int initial_state = 0, + int type = USYNC_THREAD, + LPCTSTR name = 0, + void *arg = 0); + // Constructor which will create event. + + ~ACE_Event (void); + // Implicitly destroy the event variable. + + int remove (void); + // Explicitly destroy the event variable. + + ACE_event_t handle (void) const; + // Underlying handle to event. + + int wait (void); + // if MANUAL reset + // sleep till the event becomes signaled + // event remains signaled after wait() completes. + // else AUTO reset + // sleep till the event becomes signaled + // event resets wait() completes. + + int wait (const ACE_Time_Value *abstime); + // Same as wait() above, but this one can be timed + // <abstime> is absolute time-of-day. + + int signal (void); + // if MANUAL reset + // wake up all waiting threads + // set to signaled state + // else AUTO reset + // if no thread is waiting, set to signaled state + // if thread(s) are waiting, wake up one waiting thread and + // reset event + + int pulse (void); + // if MANUAL reset + // wakeup all waiting threads and + // reset event + // else AUTO reset + // wakeup one waiting thread (if present) and + // reset event + + int reset (void); + // Set to nonsignaled state. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks + +private: + + // prevent copy constructors + ACE_Event (const ACE_Event& event); + + // prevent assignment operators + const ACE_Event &operator= (const ACE_Event &rhs); + + ACE_event_t handle_; +}; + +class ACE_Export ACE_Manual_Event : public ACE_Event + // = TITLE + // Manual Events. + // + // = DESCRIPTION + // Specialization of Event mechanism which + // wakes up all on signal() +{ +public: + ACE_Manual_Event (int initial_state = 0, + int type = USYNC_THREAD, + LPCTSTR name = 0, + void *arg = 0); + // constructor which will create manual event + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks +}; + +class ACE_Export ACE_Auto_Event : public ACE_Event + // = TITLE + // Auto Events. + // + // = DESCRIPTION + // Specialization of Event mechanism which + // wakes up all on signal() +{ +public: + ACE_Auto_Event (int initial_state = 0, + int type = USYNC_THREAD, + LPCTSTR name = 0, + void *arg = 0); + // constructor which will create auto event + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks +}; + +class ACE_Export ACE_Mutex + // = TITLE + // ACE_Mutex wrapper (valid in same process or across processes + // (depending on TYPE flag)) +{ +public: + ACE_Mutex (int type = USYNC_THREAD, + LPCTSTR name = 0, + void *arg = 0); + // Initialize the mutex. + + ~ACE_Mutex (void); + // Implicitly destroy the mutex. + + int remove (void); + // Explicitly destroy the mutex. + + int acquire (void); + // Acquire lock ownership (wait on priority queue if necessary). + + int tryacquire (void); + // Conditionally acquire lock (i.e., don't wait on queue). + + int release (void); + // Release lock and unblock a thread at head of priority queue. + + int acquire_read (void); + // Acquire lock ownership (wait on priority queue if necessary). + + int acquire_write (void); + // Acquire lock ownership (wait on priority queue if necessary). + + int tryacquire_read (void); + // Conditionally acquire a lock (i.e., won't block). + + int tryacquire_write (void); + // Conditionally acquire a lock (i.e., won't block). + + const ACE_mutex_t &lock (void) const; + // Return the underlying mutex. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +//private: + ACE_mutex_t lock_; + // Mutex type supported by the OS. + +private: + // = Prevent assignment and initialization. + void operator= (const ACE_Mutex &) {} + ACE_Mutex (const ACE_Mutex &) {} +}; + +class ACE_Export ACE_Thread_Mutex + // = TITLE + // ACE_Thread_Mutex wrapper (only valid for threads in the same + // process). + // + // = DESCRIPTION + // This implementation is optimized for locking threads that are + // in the same process. It maps to <CRITICAL_SECTION>s on NT + // and <ACE_mutex_t> with <type> set to <USYNC_THREAD> on UNIX. +{ +public: + ACE_Thread_Mutex (LPCTSTR name = 0, void *arg = 0); + + ~ACE_Thread_Mutex (void); + // Implicitly destroy the mutex. + + int remove (void); + // Explicitly destroy the mutex. + + int acquire (void); + // Acquire lock ownership (wait on priority queue if necessary). + + int tryacquire (void); + // Conditionally acquire lock (i.e., don't wait on queue). + + int release (void); + // Release lock and unblock a thread at head of priority queue. + + int acquire_read (void); + // Acquire lock ownership (wait on priority queue if necessary). + + int acquire_write (void); + // Acquire lock ownership (wait on priority queue if necessary). + + int tryacquire_read (void); + // Conditionally acquire a lock (i.e., won't block). + + int tryacquire_write (void); + // Conditionally acquire a lock (i.e., won't block). + + const ACE_thread_mutex_t &lock (void) const; + // Return the underlying mutex. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +//private: + ACE_thread_mutex_t lock_; + // Mutex type that supports single-process locking efficiently. + +private: + // = Prevent assignment and initialization. + void operator= (const ACE_Thread_Mutex &) {} + ACE_Thread_Mutex (const ACE_Thread_Mutex &) {} +}; + +class ACE_Export ACE_Thread_Mutex_Guard + // = TITLE + // This data structure is meant to be used within a method or + // function... It performs automatic aquisition and release of + // an ACE_Mutex. + // + // = DESCRIPTION + // This should be a specialization of ACE_Guard, but compiler + // bugs in older C++ compilers preclude this... +{ +public: + ACE_Thread_Mutex_Guard (ACE_Thread_Mutex &m, int block = 1); + // Implicitly and automatically acquire the lock. + + ~ACE_Thread_Mutex_Guard (void); + // Implicitly release the lock. + + int locked (void); + // 1 if locked, 0 if couldn't acquire the lock (errno will contain + // the reason for this). + + int remove (void); + // Explicitly release the lock. + + int acquire (void); + // Explicitly acquire the lock. + + int tryacquire (void); + // Conditionally acquire the lock (i.e., won't block). + + int release (void); + // Explicitly release the lock. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +protected: + ACE_Thread_Mutex &lock_; + // Reference to the mutex. + + int owner_; + // Keeps track of whether we acquired the lock or failed. + + // = Prevent assignment and initialization. + void operator= (const ACE_Thread_Mutex_Guard &) {} + ACE_Thread_Mutex_Guard (const ACE_Thread_Mutex_Guard &g): lock_ (g.lock_) {} +}; + +class ACE_Export ACE_Condition_Thread_Mutex + // = TITLE + // ACE_Condition variable wrapper written using ACE_Mutexes This + // allows threads to block until shared data changes state. + // + // = DESCRIPTION + // This should be an instantiation of ACE_Condition but problems + // with compilers precludes this... +{ +public: + ACE_Condition_Thread_Mutex (const ACE_Thread_Mutex &m, + LPCTSTR name = 0, + void *arg = 0); + // Initialize the condition variable. + + ~ACE_Condition_Thread_Mutex (void); + // Implicitly destroy the condition variable. + + int remove (void); + // Explicitly destroy the condition variable. + + int wait (const ACE_Time_Value *abstime); + // Block on condition, or until absolute time-of-day has passed. If + // abstime == 0 use "blocking" <wait> semantics. Else, if <abstime> + // != 0 and the call times out before the condition is signaled + // <wait> returns -1 and sets errno to ETIME. + + int wait (void); + // Block on condition. + + int wait (ACE_Thread_Mutex &mutex, const ACE_Time_Value *abstime = 0); + // Block on condition or until absolute time-of-day has passed. If + // abstime == 0 use "blocking" wait() semantics on the <mutex> + // passed as a parameter (this is useful if you need to store the + // <Condition> in shared memory). Else, if <abstime> != 0 and the + // call times out before the condition is signaled <wait> returns -1 + // and sets errno to ETIME. + + int signal (void); + // Signal one waiting thread. + + int broadcast (void); + // Signal *all* waiting threads. + + ACE_Thread_Mutex &mutex (void); + // Returns a reference to the underlying mutex_; + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +private: + ACE_cond_t cond_; + // Condition variable. + + ACE_Thread_Mutex &mutex_; + // Reference to mutex lock. + + // = Prevent assignment and initialization. + void operator= (const ACE_Condition_Thread_Mutex &) {} + ACE_Condition_Thread_Mutex (const ACE_Condition_Thread_Mutex &c): mutex_ (c.mutex_) {} +}; + +class ACE_Export ACE_Recursive_Thread_Mutex + // = TITLE + // Implement a C++ wrapper that allows calls to class + // <ACE_Thread_Mutex> to be nested for a nested acquire() that + // occurs in the same thread. + // + // = DESCRIPTION + // This class should be a specialization of the + // ACE_Recursive_Lock template class, but problems with some C++ + // compilers preclude this... +{ + // friend class ACE_Condition<class ACE_COND_MUTEX>; +public: + ACE_Recursive_Thread_Mutex (LPCTSTR name = 0, + void *arg = 0); + // Initialize a recursive mutex. + + ~ACE_Recursive_Thread_Mutex (void); + // Implicitly release a recursive mutex. + + int remove (void); + // Implicitly release a recursive mutex. + + int acquire (void); + // Acquire a recursive mutex (will increment the nesting level and + // not deadmutex if the owner of the mutex calls this method more + // than once). + + int tryacquire (void); + // Conditionally acquire a recursive mutex (i.e., won't block). + + int release (void); + // Releases a recursive mutex (will not release mutex until all the + // nesting level drops to 0, which means the mutex is no longer + // held). + + ACE_thread_t get_thread_id (void); + // Return the id of the thread that currently owns the mutex. + + int get_nesting_level (void); + // Return the nesting level of the recursion. When a thread has + // acquired the mutex for the first time, the nesting level == 1. + // The nesting level is incremented every time the thread acquires + // the mutex recursively. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +private: + // These methods should *not* be public (they hold no locks...) + void set_nesting_level (int d); + void set_thread_id (ACE_thread_t t); + + ACE_Thread_Mutex nesting_mutex_; + // Guards the state of the nesting level and thread id. + + ACE_Condition_Thread_Mutex lock_available_; + // This is the condition variable that actually suspends other + // waiting threads until the mutex is available. + + int nesting_level_; + // Current nesting level of the recursion. + + ACE_thread_t owner_id_; + // Current owner of the lock. + + // = Prevent assignment and initialization. + void operator= (const ACE_Recursive_Thread_Mutex &) {} + ACE_Recursive_Thread_Mutex (const ACE_Recursive_Thread_Mutex &); +}; + +class ACE_Export ACE_RW_Mutex + // = TITLE + // Wrapper for readers/writer locks. + // + // = DESCRIPTION + // These are most useful for applications that have many more + // parallel readers than writers... +{ +public: + ACE_RW_Mutex (int type = USYNC_THREAD, + LPCTSTR name = 0, + void *arg = 0); + // Initialize a readers/writer lock. + + ~ACE_RW_Mutex (void); + // Implicitly destroy a readers/writer lock + + int remove (void); + // Explicitly destroy a readers/writer lock. + + int acquire_read (void); + // Acquire a read lock, but block if a writer hold the lock. + + int acquire_write (void); + // Acquire a write lock, but block if any readers or a + // writer hold the lock. + + int tryacquire_read (void); + // Conditionally acquire a read lock (i.e., won't block). + + int tryacquire_write (void); + // Conditionally acquire a write lock (i.e., won't block). + + int acquire (void); + // Note, for interface uniformity with other synchronization + // wrappers we include the <acquire> method. This is implemented as + // a write-lock to be on the safe-side... + + int tryacquire (void); + // Note, for interface uniformity with other synchronization + // wrappers we include the <tryacquire> method. This is implemented + // as a write-lock to be on the safe-side... + + int release (void); + // Unlock a readers/writer lock. + + const ACE_rwlock_t &lock (void) const; + // Return the underlying lock. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +private: + ACE_rwlock_t lock_; + // Readers/writer lock. + + // = Prevent assignment and initialization. + void operator= (const ACE_RW_Mutex &) {} + ACE_RW_Mutex (const ACE_RW_Mutex &) {} +}; + +class ACE_Export ACE_RW_Thread_Mutex : public ACE_RW_Mutex + // = TITLE + // Wrapper for readers/writer locks that exist within a process. +{ +public: + ACE_RW_Thread_Mutex (LPCTSTR name = 0, + void *arg = 0); + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. +}; + +class ACE_Export ACE_Semaphore + // = TITLE + // Wrapper for Dijkstra style general semaphores. +{ +public: + // = Initialization and termination. + ACE_Semaphore (u_int count, + int type = USYNC_THREAD, + LPCTSTR name = 0, + void * = 0, + int max = 0x7fffffff); + // Initialize the semaphore, with default value of "count". + + ~ACE_Semaphore (void); + // Implicitly destroy the semaphore. + + int remove (void); + // Explicitly destroy the semaphore. + + int acquire (void); + // Block the thread until the semaphore count becomes + // greater than 0, then decrement it. + + int tryacquire (void); + // Conditionally decrement the semaphore if count is greater + // than 0 (i.e., won't block). + + int release (void); + // Increment the semaphore, potentially unblocking + // a waiting thread. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + + const ACE_sema_t &lock (void) const; + // Return the underlying lock. + +private: + ACE_sema_t semaphore_; + + // = Prevent assignment and initialization. + void operator= (const ACE_Semaphore &) {} + ACE_Semaphore (const ACE_Semaphore &) {} +}; + +class ACE_Export ACE_Thread_Semaphore : public ACE_Semaphore + // = TITLE + // Wrapper for Dijkstra style general semaphores that work + // only within on process. +{ +public: + ACE_Thread_Semaphore (u_int count, LPCTSTR name = 0, + void * = 0, int max = 0x7FFFFFFF); + // Initialize the semaphore, with an initial value of <count> and a + // maximum value of <max>. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. +}; + +class ACE_Export ACE_Process_Semaphore + // = TITLE + // Wrapper for Dijkstra style general semaphores that work + // across processes. +{ +public: + ACE_Process_Semaphore (u_int count, LPCTSTR name = 0, + void * = 0, int max = 0x7FFFFFFF); + // Initialize the semaphore, with an initial value of <count> and a + // maximum value of <max>. + + ~ACE_Process_Semaphore (void); + // Implicitly destroy the semaphore. + + int remove (void); + // Explicitly destroy the semaphore. + + int acquire (void); + // Block the thread until the semaphore count becomes + // greater than 0, then decrement it. + + int tryacquire (void); + // Conditionally decrement the semaphore if count is greater + // than 0 (i.e., won't block). + + int release (void); + // Increment the semaphore, potentially unblocking + // a waiting thread. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +private: +#if defined (ACE_WIN32) || defined (ACE_HAS_POSIX_SEM) + ACE_Semaphore lock_; +#else + ACE_SV_Semaphore_Complex lock_; + // We need this to get the right semantics... +#endif /* ACE_WIN32 */ +}; + +struct ACE_Export ACE_Sub_Barrier +{ + // = Initialization. + ACE_Sub_Barrier (u_int count, + ACE_Thread_Mutex &lock, + LPCTSTR name = 0, + void *arg = 0); + + ACE_Condition_Thread_Mutex barrier_finished_; + // True if this generation of the barrier is done. + + int running_threads_; + // Number of threads that are still running. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. +}; + +class ACE_Export ACE_Barrier + // = TITLE + // Implements "barrier synchronization". + // + // = DESCRIPTION + // This class allows <count> number of threads to synchronize + // their completion (so-called "barrier synchronization"). The + // implementation uses a "sub-barrier generation numbering" + // scheme to avoid overhead and to ensure that all threads exit + // the barrier correct. This code is based on an article from + // SunOpsis Vol. 4, No. 1 by Richard Marejka + // (Richard.Marejka@canada.sun.com). +{ +public: + ACE_Barrier (u_int count, + LPCTSTR name = 0, + void *arg = 0); + // Initialize the barrier to synchronize <count> threads. + + int wait (void); + // Block the caller until all <count> threads have called <wait> and + // then allow all the caller threads to continue in parallel. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +private: + ACE_Thread_Mutex lock_; + // Serialize access to the barrier state. + + int current_generation_; + // Either 0 or 1, depending on whether we are the first generation + // of waiters or the next generation of waiters. + + int count_; + // Total number of threads that can be waiting at any one time. + + ACE_Sub_Barrier sub_barrier_1_; + ACE_Sub_Barrier sub_barrier_2_; + ACE_Sub_Barrier *sub_barrier_[2]; + // We keep two <sub_barriers>, one for the first "generation" of + // waiters, and one for the next "generation" of waiters. This + // efficiently solves the problem of what to do if all the first + // generation waiters don't leave the barrier before one of the + // threads calls wait() again (i.e., starts up the next generation + // barrier). + + // = Prevent assignment and initialization. + void operator= (const ACE_Barrier &) {} + ACE_Barrier (const ACE_Barrier &): sub_barrier_1_ (0, lock_), sub_barrier_2_ (0, lock_) {} +}; + +#if 0 +class ACE_Export ACE_Process_Barrier : public ACE_Barrier + // = TITLE + // Implements "barrier synchronization" using ACE_Process_Mutexes! + // + // = DESCRIPTION + // This class is just a simple wrapper for ACE_Barrier that + // selects the USYNC_PROCESS variant for the locks. +{ +public: + ACE_Process_Barrier (u_int count, LPCTSTR name = 0); + // Create a Process_Barrier, passing in the optional <name>. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. +}; +#endif /* 0 */ + +class ACE_Export ACE_Thread_Barrier : public ACE_Barrier + // = TITLE + // Implements "barrier synchronization" using ACE_Thread_Mutexes! + // + // = DESCRIPTION + // This class is just a simple wrapper for ACE_Barrier that + // selects the USYNC_THREAD variant for the locks. +{ +public: + ACE_Thread_Barrier (u_int count, LPCTSTR name = 0); + // Create a Process_Barrier, passing in the optional <name>. + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. +}; + +#endif /* ACE_HAS_THREADS */ + +class ACE_Export ACE_Process_Mutex + // = TITLE + // ACE_Mutex wrapper (valid in same process, as well as across + // processes). +{ +public: + ACE_Process_Mutex (LPCTSTR name = ACE_DEFAULT_MUTEX, void *arg = 0); + // Create a Process_Mutex, passing in the optional <name>. + + ~ACE_Process_Mutex (void); + + int remove (void); + // Explicitly destroy the mutex. + + int acquire (void); + // Acquire lock ownership (wait on priority queue if necessary). + + int tryacquire (void); + // Conditionally acquire lock (i.e., don't wait on queue). + + int release (void); + // Release lock and unblock a thread at head of priority queue. + + int acquire_read (void); + // Acquire lock ownership (wait on priority queue if necessary). + + int acquire_write (void); + // Acquire lock ownership (wait on priority queue if necessary). + + int tryacquire_read (void); + // Conditionally acquire a lock (i.e., won't block). + + int tryacquire_write (void); + // Conditionally acquire a lock (i.e., won't block). + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +#if defined (ACE_WIN32) || defined (ACE_HAS_POSIX_SEM) + ACE_Mutex lock_; +#else + ACE_SV_Semaphore_Complex lock_; + // We need this to get the right semantics... +#endif /* ACE_WIN32 */ +}; + +class ACE_Export ACE_RW_Process_Mutex : public ACE_Process_Mutex + // = TITLE + // Wrapper for readers/writer locks that exist across processes. +{ +public: + ACE_RW_Process_Mutex (LPCTSTR name = ACE_DEFAULT_MUTEX, + void *arg = 0); + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. +}; + +class ACE_Null_Barrier + // = TITLE + // Implements "NULL barrier synchronization". +{ +public: + ACE_Null_Barrier (u_int, + const char * = 0, + void * = 0) {} + // Initialize the barrier to synchronize <count> threads. + + int wait (void) { return 0; } + // Block the caller until all <count> threads have called <wait> and + // then allow all the caller threads to continue in parallel. + + void dump (void) const {} + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +private: + + // = Prevent assignment and initialization. + void operator= (const ACE_Null_Barrier &) {} + ACE_Null_Barrier (const ACE_Null_Barrier &) {} +}; + +class ACE_Export ACE_Null_Mutex + // = TITLE + // Implement a do nothing <ACE_Mutex>, i.e., all the methods are + // no ops. +{ +public: + ACE_Null_Mutex (LPCTSTR = 0) {} + ~ACE_Null_Mutex (void) {} + int remove (void) { return 0; } + + int acquire (void) { return 0; } + int tryacquire (void) { return 0; } + int release (void) { return 0; } + int acquire_write (void) { return 0; } + int tryacquire_write (void) { return 0; } + int acquire_read (void) { return 0; } + int tryacquire_read (void) { return 0; } + + void dump (void) const { } + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. +}; + +class ACE_Export ACE_Null_Condition_Mutex + // = TITLE + // Implement a do nothing <ACE_Condition> variable wrapper, i.e., + // all methods are no ops. This class is necessary since some + // C++ compilers are *very* lame... +{ +public: + ACE_Null_Condition_Mutex (ACE_Null_Mutex &m, int = 0, + LPCTSTR = 0, void * = 0): mutex_ (m) {} + ~ACE_Null_Condition_Mutex (void) {} + int remove (void) { return 0; } + int wait (ACE_Time_Value * = 0) { return 0; } + int signal (void) { return 0; } + int broadcast (void) { return 0; } + ACE_Null_Mutex &mutex (void) { return this->mutex_; } + + void dump (void) const {} + // Dump the state of an object. + + // ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +private: + ACE_Null_Mutex &mutex_; // Reference to mutex lock. + + // = Prevent assignment and initialization. + void operator= (const ACE_Null_Condition_Mutex &) {} + ACE_Null_Condition_Mutex (const ACE_Null_Condition_Mutex &c): mutex_ (c.mutex_) {} +}; + +class ACE_Export ACE_Null_Mutex_Guard + // = TITLE + // This data structure is meant to be used within a method or + // function... It performs automatic aquisition and release of + // an ACE_Null_Mutex. + // + // = DESCRIPTION + // This should be a specialization of ACE_Guard, but compiler + // bugs preclude this... +{ +public: + ACE_Null_Mutex_Guard (ACE_Null_Mutex &) {} + ~ACE_Null_Mutex_Guard (void) {} + int remove (void) { return 0; } + int locked (void) { return 1; } + int acquire (void) { return 0; } + int tryacquire (void) { return 0; } + int release (void) { return 0; } + void dump (void) const { } + +protected: + // = Prevent assignment and initialization. + void operator= (const ACE_Null_Mutex_Guard &) {} + ACE_Null_Mutex_Guard (const ACE_Null_Mutex_Guard &) {} +}; + +#if defined (__ACE_INLINE__) +#include "ace/Synch.i" +#endif /* __ACE_INLINE__ */ + +// Include the templates here. +#include "ace/Synch_T.h" + +#endif /* ACE_SYNCH_H */ |