/* -*- C++ -*- */ // $Id$ // Synch_T.i #include "ace/Thread.h" #if defined (ACE_LACKS_METHOD_DEFINITIONS_IN_CLASS_TEMPLATE) template ACE_INLINE ACE_Guard::ACE_Guard (ACE_LOCK &l) : lock_ (&l) { this->acquire (); } template ACE_INLINE ACE_Guard::ACE_Guard (ACE_LOCK &l, int block) : lock_ (&l) { if (block) this->acquire (); else this->tryacquire (); } // Implicitly and automatically acquire (or try to acquire) the // lock. template ACE_INLINE ACE_Guard::~ACE_Guard (void) { this->release (); } // Implicitly release the lock. template ACE_INLINE int ACE_Guard::acquire (void) { return this->owner_ = this->lock_->acquire (); } // Explicitly acquire the lock. template ACE_INLINE int ACE_Guard::tryacquire (void) { return this->owner_ = this->lock_->tryacquire (); } // Conditionally acquire the lock (i.e., won't block). template ACE_INLINE int ACE_Guard::release (void) { if (this->owner_ != -1) { this->owner_ = -1; return this->lock_->release (); } else return 0; } // Explicitly release the lock, but only if it is held! template ACE_INLINE int ACE_Guard::locked (void) { return this->owner_ != -1; } // 1 if locked, 0 if couldn't acquire the lock // (errno will contain the reason for this). template ACE_INLINE int ACE_Guard::remove (void) { return this->lock_->remove (); } // Explicitly remove the lock. #endif /* defined (ACE_LACKS_METHOD_DEFINITIONS_IN_CLASS_TEMPLATE) */ template ACE_INLINE ACE_Lock_Adapter::ACE_Lock_Adapter (ACE_LOCKING_MECHANISM &lock) : lock_ (&lock), delete_lock_ (0) { } template ACE_INLINE ACE_Lock_Adapter::ACE_Lock_Adapter (void) : lock_ (0), delete_lock_ (1) { ACE_NEW (this->lock_, ACE_LOCKING_MECHANISM); } template ACE_INLINE ACE_Lock_Adapter::~ACE_Lock_Adapter (void) { if (this->delete_lock_) delete this->lock_; } // Explicitly destroy the lock. template ACE_INLINE int ACE_Lock_Adapter::remove (void) { return this->lock_->remove (); } // Block the thread until the lock is acquired. template ACE_INLINE int ACE_Lock_Adapter::acquire (void) { return this->lock_->acquire (); } // Conditionally acquire the lock (i.e., won't block). template ACE_INLINE int ACE_Lock_Adapter::tryacquire (void) { return this->lock_->tryacquire (); } // Release the lock. template ACE_INLINE int ACE_Lock_Adapter::release (void) { return this->lock_->release (); } // Block until the thread acquires a read lock. If the locking // mechanism doesn't support read locks then this just calls // . template ACE_INLINE int ACE_Lock_Adapter::acquire_read (void) { return this->lock_->acquire_read (); } // Block until the thread acquires a write lock. If the locking // mechanism doesn't support read locks then this just calls // . template ACE_INLINE int ACE_Lock_Adapter::acquire_write (void) { return this->lock_->acquire_write (); } // Conditionally acquire a read lock. If the locking mechanism // doesn't support read locks then this just calls . template ACE_INLINE int ACE_Lock_Adapter::tryacquire_read (void) { return this->lock_->tryacquire_read (); } // Conditionally acquire a write lock. If the locking mechanism // doesn't support write locks then this just calls . template ACE_INLINE int ACE_Lock_Adapter::tryacquire_write (void) { return this->lock_->tryacquire_write (); } #if defined (ACE_HAS_THREADS) template ACE_INLINE int ACE_Condition::remove (void) { // ACE_TRACE ("ACE_Condition::remove"); // cond_destroy() is called in a loop if the condition variable is // BUSY. This avoids a condition where a condition is signaled and // because of some timing problem, the thread that is to be signaled // has called the cond_wait routine after the signal call. Since // the condition signal is not queued in any way, deadlock occurs. int result = 0; #if defined (CHORUS) // Are we the owner? if (this->process_cond_ && this->condname_) { // Only destroy the condition if we're the ones who initialized // it. while ((result = ACE_OS::cond_destroy (this->process_cond_)) == -1 && errno == EBUSY) { ACE_OS::cond_broadcast (this->process_cond_); ACE_OS::thr_yield (); } ACE_OS::munmap (this->process_cond_, sizeof (ACE_cond_t)); ACE_OS::shm_unlink (this->condname_); ACE_OS::free (ACE_static_cast (void *, ACE_const_cast (LPTSTR, this->condname_))); } else if (this->process_cond_) { ACE_OS::munmap (this->process_cond_, sizeof (ACE_cond_t)); result = 0; } else #endif /* CHORUS */ while ((result = ACE_OS::cond_destroy (&this->cond_)) == -1 && errno == EBUSY) { ACE_OS::cond_broadcast (&this->cond_); ACE_OS::thr_yield (); } return result; } template ACE_INLINE MUTEX & ACE_Condition::mutex (void) { // ACE_TRACE ("ACE_Condition::mutex"); return this->mutex_; } template ACE_INLINE int ACE_Condition::signal (void) { // ACE_TRACE ("ACE_Condition::signal"); #if defined (CHORUS) if (this->process_cond_ != 0) return ACE_OS::cond_signal (this->process_cond_); #endif /* CHORUS */ return ACE_OS::cond_signal (&this->cond_); } template ACE_INLINE int ACE_Condition::broadcast (void) { // ACE_TRACE ("ACE_Condition::broadcast"); #if defined (CHORUS) if (this->process_cond_ != 0) return ACE_OS::cond_broadcast (this->process_cond_); #endif /* CHORUS */ return ACE_OS::cond_broadcast (&this->cond_); } #endif /* ACE_HAS_THREADS */ #if !(defined (ACE_HAS_THREADS) && (defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || defined (ACE_HAS_TSS_EMULATION))) template ACE_INLINE ACE_TSS::ACE_TSS (TYPE *type) : type_ (type) { } template ACE_INLINE TYPE * ACE_TSS::ts_object (void) const { return this->type_; } template ACE_INLINE TYPE * ACE_TSS::ts_object (TYPE *type) { this->type_ = type; return this->type_; } template ACE_INLINE TYPE * ACE_TSS::ts_get (void) const { return this->type_; } #endif /* ! (defined (ACE_HAS_THREADS) && (defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || defined (ACE_HAS_TSS_EMULATION))) */