#include "BaseEvent.h" #include CBaseEvent::CBaseEvent() { m_bIsSignaled = FALSE; pthread_mutex_init(&m_mutex,NULL); pthread_cond_init(&m_cond,NULL); } CBaseEvent::~CBaseEvent() { pthread_cond_destroy(&m_cond); pthread_mutex_destroy(&m_mutex); } VOID CBaseEvent::ResetEvent() { /// @todo implement me pthread_mutex_lock(&m_mutex); m_bIsSignaled = FALSE; pthread_mutex_unlock(&m_mutex); } INT32 CBaseEvent::Wait(UINT32 ui32TimeOut) { /// @todo implement me pthread_mutex_lock(&m_mutex); struct timespec absTime; struct timeval curTime; while (!m_bIsSignaled) { gettimeofday(&curTime,NULL); absTime.tv_sec = curTime.tv_sec + ui32TimeOut / 1000; absTime.tv_nsec = (curTime.tv_usec + (ui32TimeOut % 1000) * 1000) * 1000; //absTime.tv_sec = curTime.tv_sec + ui32TimeOut / 1000000; //absTime.tv_nsec = (curTime.tv_usec + ui32TimeOut % 1000000) * 1000; absTime.tv_sec = absTime.tv_sec + absTime.tv_nsec / 1000000000; absTime.tv_nsec = absTime.tv_nsec % 1000000000; int res; res = pthread_cond_timedwait(&m_cond,&m_mutex,&absTime); if (res == ETIMEDOUT) { pthread_mutex_unlock(&m_mutex); return CON_EVENT_TIME_OUT; } } pthread_mutex_unlock(&m_mutex); return CON_EVENT_GET_IT; } VOID CBaseEvent::SetEvent() { /// @todo implement me pthread_mutex_lock(&m_mutex); m_bIsSignaled = TRUE; pthread_cond_broadcast(&m_cond); pthread_mutex_unlock(&m_mutex); } VOID CBaseEvent::Wait() { /// @todo implement me pthread_mutex_lock(&m_mutex); while (!m_bIsSignaled) { pthread_cond_wait(&m_cond,&m_mutex); } pthread_mutex_unlock(&m_mutex); }