Made condition variable data volatile. This will hopefully fix

an strange deadlock seen on OSX.  The CSocketMultiplexer deadlocks
with two threads, one waiting for m_polling to become false and
the other waiting for m_pollable to become true.  The weird part
is that they're both false so the first thread should proceed.
It either didn't receive the broadcast when m_polling went to
false or it's not really checking the actual value of that flag.
I can't see how the former is possible and this change fixes the
latter.
This commit is contained in:
crs 2004-11-10 21:00:30 +00:00
parent d8b6fab8bb
commit 6ea96719ab
1 changed files with 5 additions and 7 deletions

View File

@ -160,12 +160,12 @@ public:
Get the variable's value. The condition variable should be locked Get the variable's value. The condition variable should be locked
before calling this method. before calling this method.
*/ */
operator const T&() const; operator const volatile T&() const;
//@} //@}
private: private:
T m_data; volatile T m_data;
}; };
template <class T> template <class T>
@ -199,8 +199,7 @@ CCondVar<T>::~CCondVar()
template <class T> template <class T>
inline inline
CCondVar<T>& CCondVar<T>&
CCondVar<T>::operator=( CCondVar<T>::operator=(const CCondVar<T>& cv)
const CCondVar<T>& cv)
{ {
m_data = cv.m_data; m_data = cv.m_data;
return *this; return *this;
@ -209,8 +208,7 @@ CCondVar<T>::operator=(
template <class T> template <class T>
inline inline
CCondVar<T>& CCondVar<T>&
CCondVar<T>::operator=( CCondVar<T>::operator=(const T& data)
const T& data)
{ {
m_data = data; m_data = data;
return *this; return *this;
@ -218,7 +216,7 @@ CCondVar<T>::operator=(
template <class T> template <class T>
inline inline
CCondVar<T>::operator const T&() const CCondVar<T>::operator const volatile T&() const
{ {
return m_data; return m_data;
} }