make IsTimedOut() public

allow waiting for the next heartbeat
This commit is contained in:
Glenn Maynard
2005-02-06 08:44:01 +00:00
parent c8f2f71551
commit a89d88b5e6
2 changed files with 28 additions and 4 deletions
+20 -1
View File
@@ -3,7 +3,8 @@
#include "RageLog.h"
WorkerThread::WorkerThread( const CString &sName ):
m_WorkerEvent( "\"" + sName + "\" worker event" )
m_WorkerEvent( "\"" + sName + "\" worker event" ),
m_HeartbeatEvent( "\"" + sName + "\" heartbeat event" )
{
m_Timeout.SetZero();
m_iRequest = REQ_NONE;
@@ -122,6 +123,12 @@ void WorkerThread::WorkerMain()
{
DoHeartbeat();
/* Wake up anyone waiting for a heartbeat. */
m_HeartbeatEvent.Lock();
m_HeartbeatEvent.Broadcast();
m_HeartbeatEvent.Unlock();
/* Schedule the next heartbeat. */
m_NextHeartbeat.Touch();
m_NextHeartbeat += m_fHeartbeat;
}
@@ -164,6 +171,18 @@ void WorkerThread::WorkerMain()
}
}
bool WorkerThread::WaitForOneHeartbeat()
{
/* It doesn't make sense to wait for a heartbeat if there is no heartbeat. */
ASSERT( m_fHeartbeat != -1 );
m_HeartbeatEvent.Lock();
bool bTimedOut = !m_HeartbeatEvent.Wait( &m_Timeout );
m_HeartbeatEvent.Unlock();
return !bTimedOut;
}
/*
* (c) 2005 Glenn Maynard
* All rights reserved.
+8 -3
View File
@@ -18,6 +18,13 @@ public:
void SetTimeout( float fSeconds );
bool TimeoutEnabled() const { return !m_Timeout.IsZero(); }
/* Return true if the last operation has timed out and has not yet recovered. */
bool IsTimedOut() const { return m_bTimedOut; }
/* Pause until the next heartbeat completes. Returns false if timed out. This
* triggers no actions, so no cleanup is run and IsTimedOut() is not affected. */
bool WaitForOneHeartbeat();
protected:
/* Call this in the derived class to start and stop the thread. */
void StartThread();
@@ -28,9 +35,6 @@ protected:
* timed out and DoRequest() must not be called. */
bool DoRequest( int iRequest );
/* Return true if the last operation has timed out and has not yet recovered. */
bool IsTimedOut() const { return m_bTimedOut; }
/* Overload this in the derived class to handle requests. */
virtual void HandleRequest( int iRequest ) = 0;
@@ -58,6 +62,7 @@ private:
float m_fHeartbeat;
RageTimer m_NextHeartbeat;
RageEvent m_HeartbeatEvent;
};
#endif