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:
parent
d8b6fab8bb
commit
6ea96719ab
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue