#include "services.h" /** Entry point for the thread * @param paramter A Thread* cast to a void* */ static DWORD WINAPI entry_point(void *parameter) { Thread *thread = static_cast(parameter); thread->Run(); thread->SetExitState(); return 0; } /** Join to the thread, sets the exit state to true */ void Thread::Join() { this->SetExitState(); WaitForSingleObject(Handle, INFINITE); } /** Exit the thread. Note that the thread still must be joined to free resources! */ void Thread::Exit() { this->SetExitState(); ExitThread(0); } /** Launch the thread */ void Thread::Start() { this->Handle = CreateThread(NULL, 0, entry_point, this, 0, NULL); if (!this->Handle) { this->SetFlag(SF_DEAD); throw CoreException("Unable to create thread: " + Anope::LastError()); } } /** Constructor */ Mutex::Mutex() { InitializeCriticalSection(&mutex); } /** Destructor */ Mutex::~Mutex() { DeleteCriticalSection(&mutex); } /** Attempt to lock the mutex, will hang until a lock can be achieved */ void Mutex::Lock() { EnterCriticalSection(&mutex); } /** Unlock the mutex, it must be locked first */ void Mutex::Unlock() { LeaveCriticalSection(&mutex); } /** Attempt to lock the mutex, will return true on success and false on fail * Does not block * @return true or false */ bool Mutex::TryLock() { return TryEnterCriticalSection(&mutex); } /** Constructor */ Condition::Condition() : Mutex() { cond = CreateEvent(NULL, false, false, NULL); } /** Destructor */ Condition::~Condition() { CloseHandle(cond); } /** Called to wakeup the waiter */ void Condition::Wakeup() { PulseEvent(cond); } /** Called to wait for a Wakeup() call */ void Condition::Wait() { LeaveCriticalSection(&mutex); WaitForSingleObject(cond, INFINITE); EnterCriticalSection(&mutex); }