implement RageEvent::Wait timeouts

This commit is contained in:
Glenn Maynard
2005-01-26 20:59:41 +00:00
parent 4757f00aba
commit 63604a6536
7 changed files with 35 additions and 11 deletions
+6 -2
View File
@@ -666,14 +666,18 @@ RageEvent::~RageEvent()
}
/* For each of these calls, the mutex must be locked, and must not be locked recursively. */
void RageEvent::Wait()
bool RageEvent::Wait( RageTimer *pTimeout )
{
ASSERT( IsLockedByThisThread() );
ASSERT( m_LockCnt == 0 );
m_pEvent->Wait();
/* A zero RageTimer also means no timeout. */
if( pTimeout != NULL && pTimeout->IsZero() )
pTimeout = NULL;
bool bRet = m_pEvent->Wait( pTimeout );
m_LockedBy = GetThisThreadId();
return bRet;
}
void RageEvent::Signal()
+8 -1
View File
@@ -2,6 +2,7 @@
#define RAGE_THREADS_H
struct ThreadSlot;
class RageTimer;
class RageThread
{
ThreadSlot *m_pSlot;
@@ -137,7 +138,13 @@ public:
RageEvent( CString name );
~RageEvent();
void Wait();
/*
* If pTimeout is non-NULL, the event will be automatically signalled at the given
* time. Note that implementing this timeout is optional; not all archs support it.
* If false is returned, the wait timed out (and the mutex is locked, as if the
* event had been signalled).
*/
bool Wait( RageTimer *pTimeout = NULL );
void Signal();
void Broadcast();
+2 -2
View File
@@ -3,7 +3,7 @@
/* This is the low-level implementation; you probably want RageThreads. */
class RageMutex;
class RageTimer;
class ThreadImpl
{
@@ -46,7 +46,7 @@ class EventImpl
{
public:
virtual ~EventImpl() { }
virtual void Wait() = 0;
virtual bool Wait( RageTimer *pTimeout ) = 0;
virtual void Signal() = 0;
virtual void Broadcast() = 0;
};
@@ -215,9 +215,19 @@ EventImpl_Pthreads::~EventImpl_Pthreads()
pthread_cond_destroy( &m_Cond );
}
void EventImpl_Pthreads::Wait()
bool EventImpl_Pthreads::Wait( RageTimer *pTimeout )
{
pthread_cond_wait( &m_Cond, &m_pParent->mutex );
if( pTimeout == NULL )
{
pthread_cond_wait( &m_Cond, &m_pParent->mutex );
return true;
}
timespec abstime;
timeout.tv_sec = pTimeout->m_secs;
timeout.tv_nsec = pTimeout->m_us * 1000;
int iRet = pthread_cond_timedwait( &m_Cond, &m_pParent->mutex );
return iRet != ETIMEDOUT;
}
void EventImpl_Pthreads::Signal()
@@ -52,7 +52,7 @@ public:
EventImpl_Pthreads( MutexImpl_Pthreads *pParent );
~EventImpl_Pthreads();
void Wait();
bool Wait( RageTimer *pTimeout );
void Signal();
void Broadcast();
+5 -2
View File
@@ -321,8 +321,9 @@ static void PortableSignalObjectAndWait( HANDLE hObjectToSignal, HANDLE hObjectT
WaitForSingleObject( hObjectToWaitOn, INFINITE );
}
/* Event logic from http://www.cs.wustl.edu/~schmidt/win32-cv-1.html. */
void EventImpl_Win32::Wait()
/* Event logic from http://www.cs.wustl.edu/~schmidt/win32-cv-1.html.
* pTimeout is not currently implemented. */
bool EventImpl_Win32::Wait( RageTimer *pTimeout )
{
EnterCriticalSection( &m_iNumWaitingLock );
++m_iNumWaiting;
@@ -342,6 +343,8 @@ void EventImpl_Win32::Wait()
PortableSignalObjectAndWait( m_WaitersDone, m_pParent->mutex, false );
else
WaitForSingleObject( m_pParent->mutex, INFINITE );
return true;
}
void EventImpl_Win32::Signal()
+1 -1
View File
@@ -46,7 +46,7 @@ public:
EventImpl_Win32( MutexImpl_Win32 *pParent );
~EventImpl_Win32();
void Wait();
bool Wait( RageTimer *pTimeout );
void Signal();
void Broadcast();