www.pudn.com > zfxcengine-0.1.0.zip > ceThreading.cpp
#include "Core/ceExceptions.h"
#include "Core/ceThreading.h"
#include "SDL.h"
#include "SDL_thread.h"
#include "SDL_mutex.h"
using namespace ZFXCE;
using namespace ZFXCE::Threading;
void Sleep(UINT milisec)
{
SDL_Delay(milisec);
}
ceThread::ceThread()
: m_Data(0)
{
}
ceThread::ceThread(int (*func) (void*), void* data)
{
if(!(m_Data = SDL_CreateThread(func, data)))
CE_EXCEPTION("ceThread::ctor: Create thread failed.", 2);
}
ceThread::ceThread(const ceThread& t)
: m_Data(t.m_Data)
{
}
void ceThread::Kill()
{
if(m_Data)
SDL_KillThread((SDL_Thread*)m_Data);
}
INT ceThread::WaitForExit()
{
INT ret = 0;
if(m_Data)
SDL_WaitThread((SDL_Thread*)m_Data, &ret);
return ret;
}
ceMutex::ceMutex()
{
if(!(m_Data = SDL_CreateMutex()))
CE_EXCEPTION("ceMutex::ctor: Create mutex failed.", 2);
}
ceMutex::~ceMutex()
{
SDL_DestroyMutex((SDL_mutex*)m_Data);
}
void ceMutex::Lock()
{
if(SDL_mutexP((SDL_mutex*)m_Data)==-1)
CE_EXCEPTION("ceMutex::Lock: Lock mutex failed.", 2);
}
void ceMutex::Unlock()
{
if(SDL_mutexV((SDL_mutex*)m_Data)==-1)
CE_EXCEPTION("ceMutex::Lock: Lock mutex failed.", 2);
}
ceSemaphore::ceSemaphore(UINT initVal)
{
if(!(m_Data = SDL_CreateSemaphore(initVal)))
CE_EXCEPTION("ceSemaphore::ctor: Create semaphore failed.", 2);
}
ceSemaphore::~ceSemaphore()
{
SDL_DestroySemaphore((SDL_sem*)m_Data);
}
void ceSemaphore::Wait()
{
if(SDL_SemWait((SDL_sem*)m_Data)==-1)
CE_EXCEPTION("ceSemaphore::Wait: Wait for semaphore failed.", 2);
}
BOOL ceSemaphore::TryWait()
{
INT ret = SDL_SemTryWait((SDL_sem*)m_Data);
if(ret==-1)
CE_EXCEPTION("ceSemaphore::TryWait: Wait for semaphore failed.", 2);
return(ret!=SDL_MUTEX_TIMEDOUT);
}
BOOL ceSemaphore::WaitTimeout(UINT milisec)
{
INT ret = SDL_SemWaitTimeout((SDL_sem*)m_Data, milisec);
if(ret==-1)
CE_EXCEPTION("ceSemaphore::WaitTimeout: Wait for semaphore failed.", 2);
return(ret!=SDL_MUTEX_TIMEDOUT);
}
void ceSemaphore::Unlock()
{
if(SDL_SemPost((SDL_sem*)m_Data)==-1)
CE_EXCEPTION("ceSemaphore::Unlock: Unlock semaphore failed.", 2);
}
UINT ceSemaphore::GetValue()
{
return SDL_SemValue((SDL_sem*)m_Data);
}
ceCondition::ceCondition()
{
if(!(m_Data = SDL_CreateCond()))
CE_EXCEPTION("ceCondition::ctor: Create condition failed.", 2);
}
ceCondition::~ceCondition()
{
SDL_DestroyCond((SDL_cond*)m_Data);
}
void ceCondition::Signal()
{
if(SDL_CondSignal((SDL_cond*)m_Data)==-1)
CE_EXCEPTION("ceCondition::Signal: Signal condition failed.", 2);
}
void ceCondition::Broadcast()
{
if(SDL_CondBroadcast((SDL_cond*)m_Data)==-1)
CE_EXCEPTION("ceCondition::Broadcast: Broadcast condition failed.", 2);
}
void ceCondition::Wait(const ceMutex* mutex)
{
if(SDL_CondWait((SDL_cond*)m_Data, (SDL_mutex*)mutex->m_Data)==-1)
CE_EXCEPTION("ceCondition::Wait: Wait for condition failed.", 2);
}
BOOL ceCondition::WaitTimeout(const ceMutex* mutex, UINT milisec)
{
INT ret = SDL_CondWaitTimeout((SDL_cond*)m_Data, (SDL_mutex*)mutex->m_Data,milisec);
if(ret==-1)
CE_EXCEPTION("ceCondition::WaitTimeout: Wait for condition failed.", 2);
return(ret!=SDL_MUTEX_TIMEDOUT);
}