summaryrefslogtreecommitdiff
path: root/src/threadengine_win32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/threadengine_win32.cpp')
-rw-r--r--src/threadengine_win32.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/threadengine_win32.cpp b/src/threadengine_win32.cpp
new file mode 100644
index 000000000..5ee2f4596
--- /dev/null
+++ b/src/threadengine_win32.cpp
@@ -0,0 +1,109 @@
+#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);
+}
+