diff options
| author | Adam <Adam@anope.org> | 2010-07-15 22:55:02 -0400 |
|---|---|---|
| committer | Adam <Adam@anope.org> | 2010-07-15 22:55:02 -0400 |
| commit | a22f8d3b2de88b9bb6f80f0c2780846ae23ab389 (patch) | |
| tree | a2fdf570868896a787df8a1169951b0028e68d6b /src/threadengines | |
| parent | 43b1e43afb85639485e36d24da351dc0f121be6e (diff) | |
Moved some files and diretories around, made cmake skip files it knows it can't compile because of missing dependices.
Diffstat (limited to 'src/threadengines')
| -rw-r--r-- | src/threadengines/threadengine_pthread.cpp | 108 | ||||
| -rw-r--r-- | src/threadengines/threadengine_win32.cpp | 106 |
2 files changed, 214 insertions, 0 deletions
diff --git a/src/threadengines/threadengine_pthread.cpp b/src/threadengines/threadengine_pthread.cpp new file mode 100644 index 000000000..a85af583e --- /dev/null +++ b/src/threadengines/threadengine_pthread.cpp @@ -0,0 +1,108 @@ +#include "services.h" + +/* Threadengine attributes used by this thread engine */ +static pthread_attr_t threadengine_attr; + +/** Entry point used for the threads + * @param parameter A Thread* cast to a void* + */ +static void *entry_point(void *parameter) +{ + Thread *thread = static_cast<Thread *>(parameter); + thread->Run(); + if (!thread->GetExitState()) + thread->Join(); + delete thread; + pthread_exit(0); +} + +/** Threadengines constructor + */ +ThreadEngine::ThreadEngine() +{ + if (pthread_attr_init(&threadengine_attr)) + throw CoreException("ThreadEngine: Error calling pthread_attr_init"); +} + +/** Threadengines destructor + */ +ThreadEngine::~ThreadEngine() +{ + pthread_attr_destroy(&threadengine_attr); +} + +/** Join to the thread, sets the exit state to true + */ +void Thread::Join() +{ + SetExitState(); + pthread_join(Handle, NULL); +} + +/** Start a new thread + * @param thread A pointer to a newley allocated thread + */ +void ThreadEngine::Start(Thread *thread) +{ + if (pthread_create(&thread->Handle, &threadengine_attr, entry_point, thread)) + { + delete thread; + throw CoreException("Unable to create thread: " + std::string(strerror(errno))); + } +} + +/** Constructor + */ +Mutex::Mutex() +{ + pthread_mutex_init(&mutex, NULL); +} + +/** Destructor + */ +Mutex::~Mutex() +{ + pthread_mutex_destroy(&mutex); +} + +/** Attempt to lock the mutex, will hang until a lock can be achieved + */ +void Mutex::Lock() +{ + pthread_mutex_lock(&mutex); +} + +/** Unlock the mutex, it must be locked first + */ +void Mutex::Unlock() +{ + pthread_mutex_unlock(&mutex); +} + +/** Constructor + */ +Condition::Condition() : Mutex() +{ + pthread_cond_init(&cond, NULL); +} + +/** Destructor + */ +Condition::~Condition() +{ + pthread_cond_destroy(&cond); +} + +/** Called to wakeup the waiter + */ +void Condition::Wakeup() +{ + pthread_cond_signal(&cond); +} + +/** Called to wait for a Wakeup() call + */ +void Condition::Wait() +{ + pthread_cond_wait(&cond, &mutex); +} diff --git a/src/threadengines/threadengine_win32.cpp b/src/threadengines/threadengine_win32.cpp new file mode 100644 index 000000000..54db9529a --- /dev/null +++ b/src/threadengines/threadengine_win32.cpp @@ -0,0 +1,106 @@ +#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<Thread *>(parameter); + thread->Run(); + if (!thread->GetExitState()) + thread->Join(); + delete thread; + return 0; +} + +/** Threadengines constructor + */ +ThreadEngine::ThreadEngine() +{ +} + +/** Threadengines destructor + */ +ThreadEngine::~ThreadEngine() +{ +} + +/** Join to the thread, sets the exit state to true + */ +void Thread::Join() +{ + SetExitState(); + WaitForSingleObject(Handle, INFINITE); +} + +/** Start a new thread + * @param thread A pointer to a newley allocated thread + */ +void ThreadEngine::Start(Thread *thread) +{ + thread->Handle = CreateThread(NULL, 0, entry_point, thread, 0, NULL); + + if (!thread->Handle) + { + delete thread; + throw CoreException("Unable to create thread: " + std::string(dlerror())); + } +} + +/** 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); +} + +/** 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); +} |
