#include "Cond.h"
|
|
Cond::Cond()
|
{
|
#if defined(WIN32) && !defined(MINGW)
|
InitializeCriticalSection(&m_mutex);
|
InitializeConditionVariable(&m_cond);
|
#else
|
pthread_mutex_init(&m_mutex, NULL);
|
pthread_cond_init(&m_cond, NULL);
|
#endif
|
|
}
|
|
Cond::~Cond()
|
{
|
#if defined(WIN32) && !defined(MINGW)
|
DeleteCriticalSection(&m_mutex);
|
#else
|
pthread_mutex_destroy(&m_mutex);
|
pthread_cond_destroy(&m_cond);
|
#endif
|
|
}
|
|
//¼ÓËø
|
int Cond::Lock()
|
{
|
#if defined(WIN32) && !defined(MINGW)
|
EnterCriticalSection(&m_mutex);
|
return 0;
|
#else
|
return pthread_mutex_lock(&m_mutex);
|
#endif
|
|
}
|
|
//½âËø
|
int Cond::Unlock()
|
{
|
#if defined(WIN32) && !defined(MINGW)
|
LeaveCriticalSection(&m_mutex);
|
return 0;
|
#else
|
return pthread_mutex_unlock(&m_mutex);
|
#endif
|
}
|
|
int Cond::Wait()
|
{
|
#if defined(WIN32) && !defined(MINGW)
|
DWORD ret = SleepConditionVariableCS((PCONDITION_VARIABLE)&m_cond, &m_mutex, INFINITE);
|
#else
|
int ret = pthread_cond_wait(&m_cond, &m_mutex);
|
#endif
|
|
return ret;
|
|
}
|
|
//¹Ì¶¨Ê±¼äµÈ´ý
|
int Cond::TimedWait(int second)
|
{
|
#if defined(WIN32) && !defined(MINGW)
|
SleepConditionVariableCS((PCONDITION_VARIABLE)&m_cond, &m_mutex, second*1000);
|
return 0;
|
#else
|
struct timespec abstime;
|
//»ñÈ¡´Óµ±Ç°Ê±¼ä£¬²¢¼ÓÉϵȴýʱ¼ä£¬ ÉèÖýø³ÌµÄ³¬Ê±Ë¯Ãßʱ¼ä
|
clock_gettime(CLOCK_REALTIME, &abstime);
|
abstime.tv_sec += second;
|
return pthread_cond_timedwait(&m_cond, &m_mutex, &abstime);
|
#endif
|
|
}
|
|
int Cond::Signal()
|
{
|
#if defined(WIN32) && !defined(MINGW)
|
int ret = 0;
|
WakeConditionVariable((PCONDITION_VARIABLE)&m_cond);
|
#else
|
int ret = pthread_cond_signal(&m_cond);
|
#endif
|
return ret;
|
}
|
|
//»½ÐÑËùÓÐ˯ÃßÏß³Ì
|
int Cond::Broadcast()
|
{
|
#if defined(WIN32) && !defined(MINGW)
|
WakeAllConditionVariable((PCONDITION_VARIABLE)&m_cond);
|
return 0;
|
#else
|
return pthread_cond_broadcast(&m_cond);
|
#endif
|
|
}
|