/* -*- C++ -*- */ // $Id$ // Synch_T.i #include "ace/Thread.h" template ACE_INLINE ACE_Atomic_Op::ACE_Atomic_Op (const ACE_Atomic_Op &rhs) { // ACE_TRACE ("ACE_Atomic_Op::ACE_Atomic_Op"); *this = rhs; // Invoke the assignment operator. } template ACE_INLINE TYPE ACE_Atomic_Op::operator++ (void) { // ACE_TRACE ("ACE_Atomic_Op::operator++"); ACE_Guard m (this->lock_); return ++this->value_; } template ACE_INLINE TYPE ACE_Atomic_Op::operator++ (int) { // ACE_TRACE ("ACE_Atomic_Op::operator++"); ACE_Guard m (this->lock_); return this->value_++; } template ACE_INLINE TYPE ACE_Atomic_Op::operator+= (const TYPE i) { // ACE_TRACE ("ACE_Atomic_Op::operator+="); ACE_Guard m (this->lock_); return this->value_ += i; } template ACE_INLINE TYPE ACE_Atomic_Op::operator-- (void) { // ACE_TRACE ("ACE_Atomic_Op::operator--"); ACE_Guard m (this->lock_); return --this->value_; } template ACE_INLINE TYPE ACE_Atomic_Op::operator-- (int) { // ACE_TRACE ("ACE_Atomic_Op::operator--"); ACE_Guard m (this->lock_); return this->value_--; } template ACE_INLINE TYPE ACE_Atomic_Op::operator-= (const TYPE i) { // ACE_TRACE ("ACE_Atomic_Op::operator-="); ACE_Guard m (this->lock_); return this->value_ -= i; } template ACE_INLINE TYPE ACE_Atomic_Op::operator== (const TYPE i) const { // ACE_TRACE ("ACE_Atomic_Op::operator=="); ACE_Guard m ((LOCK &) this->lock_); return this->value_ == i; } template ACE_INLINE TYPE ACE_Atomic_Op::operator>= (const TYPE i) const { // ACE_TRACE ("ACE_Atomic_Op::operator>="); ACE_Guard m ((LOCK &) this->lock_); return this->value_ >= i; } template ACE_INLINE TYPE ACE_Atomic_Op::operator> (const TYPE rhs) const { // ACE_TRACE ("ACE_Atomic_Op::operator>"); ACE_Guard m ((LOCK &) this->lock_); return this->value_ > rhs; } template ACE_INLINE TYPE ACE_Atomic_Op::operator<= (const TYPE rhs) const { // ACE_TRACE ("ACE_Atomic_Op::operator<="); ACE_Guard m ((LOCK &) this->lock_); return this->value_ <= rhs; } template ACE_INLINE TYPE ACE_Atomic_Op::operator< (const TYPE rhs) const { // ACE_TRACE ("ACE_Atomic_Op::operator<"); ACE_Guard m ((LOCK &) this->lock_); return this->value_ < rhs; } template void ACE_Atomic_Op::operator= (const ACE_Atomic_Op &rhs) { // ACE_TRACE ("ACE_Atomic_Op::operator="); if (&rhs == this) return; // Avoid deadlock... ACE_Guard m (this->lock_); // This will call ACE_Atomic_Op::TYPE(), which will ensure the value // of is acquired atomically. this->value_ = rhs; } template ACE_INLINE ACE_Atomic_Op::operator TYPE () const { // ACE_TRACE ("ACE_Atomic_Op::operator TYPE"); ACE_Guard m ((LOCK &) this->lock_); return this->value_; } template ACE_INLINE void ACE_Atomic_Op::operator= (const TYPE i) { // ACE_TRACE ("ACE_Atomic_Op::operator="); ACE_Guard m (this->lock_); this->value_ = i; } #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; 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"); return ACE_OS::cond_signal (&this->cond_); } template ACE_INLINE int ACE_Condition::broadcast (void) { // ACE_TRACE ("ACE_Condition::broadcast"); return ACE_OS::cond_broadcast (&this->cond_); } #endif /* ACE_HAS_THREADS */ #if !(defined (ACE_HAS_THREADS) && defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)) template ACE_INLINE ACE_TSS::ACE_TSS (TYPE *) { } template ACE_INLINE TYPE * ACE_TSS::ts_object (void) const { return (TYPE *) &this->type_; } template ACE_INLINE TYPE * ACE_TSS::ts_object (TYPE *) { return &this->type_; } template ACE_INLINE TYPE * ACE_TSS::ts_get (void) const { return (TYPE *) &this->type_; } // Explicitly destroy the lock. template int ACE_Lock_Adapter::remove (void) { return this->lock_.remove (); } // Block the thread until the lock is acquired. template int ACE_Lock_Adapter::acquire (void) { return this->lock_.acquire (); } // Conditionally acquire the lock (i.e., won't block). template int ACE_Lock_Adapter::tryacquire (void) { return this->lock_.tryacquire (); } // Release the lock. template 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 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 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 int ACE_Lock_Adapter::tryacquire_read (void) { return this->lock_.tryacquire_read (); } // Conditionally acquire a write lock. If the locking mechanism // doesn't support read locks then this just calls . template int ACE_Lock_Adapter::acquire_write (void) { return this->lock_.acquire_write (); } #endif /* defined (ACE_HAS_THREADS) && defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) */