00001 // -*- C++ -*- 00002 // 00003 // $Id: Condition_T.inl 72588 2006-05-09 07:36:18Z jwillemsen $ 00004 00005 ACE_BEGIN_VERSIONED_NAMESPACE_DECL 00006 00007 template<class MUTEX> ACE_INLINE int 00008 ACE_Condition<MUTEX>::remove (void) 00009 { 00010 // ACE_TRACE ("ACE_Condition<MUTEX>::remove"); 00011 00012 // cond_destroy() is called in a loop if the condition variable is 00013 // BUSY. This avoids a condition where a condition is signaled and 00014 // because of some timing problem, the thread that is to be signaled 00015 // has called the cond_wait routine after the signal call. Since 00016 // the condition signal is not queued in any way, deadlock occurs. 00017 00018 int result = 0; 00019 00020 while ((result = ACE_OS::cond_destroy (&this->cond_)) == -1 00021 && errno == EBUSY) 00022 { 00023 ACE_OS::cond_broadcast (&this->cond_); 00024 ACE_OS::thr_yield (); 00025 } 00026 00027 return result; 00028 } 00029 00030 template<class MUTEX> ACE_INLINE MUTEX & 00031 ACE_Condition<MUTEX>::mutex (void) 00032 { 00033 // ACE_TRACE ("ACE_Condition<MUTEX>::mutex"); 00034 return this->mutex_; 00035 } 00036 00037 template <class MUTEX> ACE_INLINE int 00038 ACE_Condition<MUTEX>::signal (void) 00039 { 00040 // ACE_TRACE ("ACE_Condition<MUTEX>::signal"); 00041 return ACE_OS::cond_signal (&this->cond_); 00042 } 00043 00044 template <class MUTEX> ACE_INLINE int 00045 ACE_Condition<MUTEX>::broadcast (void) 00046 { 00047 // ACE_TRACE ("ACE_Condition<MUTEX>::broadcast"); 00048 return ACE_OS::cond_broadcast (&this->cond_); 00049 } 00050 00051 ACE_END_VERSIONED_NAMESPACE_DECL