changed wxCondition API to take a reference, not pointer, to wxMutex

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14909 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-04-02 15:37:57 +00:00
parent cd10339a23
commit c112e10026
5 changed files with 152 additions and 76 deletions

View File

@@ -319,7 +319,7 @@ wxMutexError wxMutex::Unlock()
class wxConditionInternal
{
public:
wxConditionInternal( wxMutex *mutex );
wxConditionInternal(wxMutex& mutex);
~wxConditionInternal();
void Wait();
@@ -331,14 +331,16 @@ public:
void Broadcast();
private:
// get the POSIX mutex associated with us
pthread_mutex_t *GetMutex() const { return &m_mutex.m_internal->m_mutex; }
wxMutex *m_mutex;
wxMutex& m_mutex;
pthread_cond_t m_cond;
};
wxConditionInternal::wxConditionInternal( wxMutex *mutex )
wxConditionInternal::wxConditionInternal(wxMutex& mutex)
: m_mutex(mutex)
{
m_mutex = mutex;
if ( pthread_cond_init( &m_cond, NULL ) != 0 )
{
wxLogDebug(_T("pthread_cond_init() failed"));
@@ -355,7 +357,7 @@ wxConditionInternal::~wxConditionInternal()
void wxConditionInternal::Wait()
{
if ( pthread_cond_wait( &m_cond, &(m_mutex->m_internal->m_mutex) ) != 0 )
if ( pthread_cond_wait( &m_cond, GetMutex() ) != 0 )
{
wxLogDebug(_T("pthread_cond_wait() failed"));
}
@@ -363,13 +365,14 @@ void wxConditionInternal::Wait()
bool wxConditionInternal::Wait( const timespec *ts )
{
int result = pthread_cond_timedwait( &m_cond,
&(m_mutex->m_internal->m_mutex),
ts );
int result = pthread_cond_timedwait( &m_cond, GetMutex(), ts );
if ( result == ETIMEDOUT )
return FALSE;
wxASSERT_MSG( result == 0, _T("pthread_cond_timedwait() failed") );
if ( result != 0 )
{
wxLogDebug(_T("pthread_cond_timedwait() failed"));
}
return TRUE;
}
@@ -397,18 +400,9 @@ void wxConditionInternal::Broadcast()
// wxCondition
// ---------------------------------------------------------------------------
wxCondition::wxCondition( wxMutex *mutex )
wxCondition::wxCondition(wxMutex& mutex)
{
if ( !mutex )
{
wxFAIL_MSG( _T("NULL mutex in wxCondition ctor") );
m_internal = NULL;
}
else
{
m_internal = new wxConditionInternal( mutex );
}
m_internal = new wxConditionInternal( mutex );
}
wxCondition::~wxCondition()
@@ -418,14 +412,11 @@ wxCondition::~wxCondition()
void wxCondition::Wait()
{
if ( m_internal )
m_internal->Wait();
m_internal->Wait();
}
bool wxCondition::Wait( unsigned long timeout_millis )
{
wxCHECK_MSG( m_internal, FALSE, _T("can't wait on uninitalized condition") );
wxLongLong curtime = wxGetLocalTimeMillis();
curtime += timeout_millis;
wxLongLong temp = curtime / 1000;
@@ -444,14 +435,12 @@ bool wxCondition::Wait( unsigned long timeout_millis )
void wxCondition::Signal()
{
if ( m_internal )
m_internal->Signal();
m_internal->Signal();
}
void wxCondition::Broadcast()
{
if ( m_internal )
m_internal->Broadcast();
m_internal->Broadcast();
}
// ===========================================================================
@@ -483,7 +472,7 @@ private:
};
wxSemaphoreInternal::wxSemaphoreInternal( int initialcount, int maxcount )
: m_cond(&m_mutex)
: m_cond(m_mutex)
{
if ( (initialcount < 0) || ((maxcount > 0) && (initialcount > maxcount)) )
@@ -602,7 +591,7 @@ public:
m_signaled = FALSE;
m_mutex = new wxMutex();
m_cond = new wxCondition( m_mutex );
m_cond = new wxCondition( *m_mutex );
}
// increment the reference count
@@ -1711,7 +1700,7 @@ bool wxThreadModule::OnInit()
#endif // wxUSE_GUI
gs_mutexDeleteThread = new wxMutex();
gs_condAllDeleted = new wxCondition( gs_mutexDeleteThread );
gs_condAllDeleted = new wxCondition( *gs_mutexDeleteThread );
return TRUE;
}