summaryrefslogtreecommitdiff
path: root/src/threadengines/threadengine_pthread.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2010-07-15 22:55:02 -0400
committerAdam <Adam@anope.org>2010-07-15 22:55:02 -0400
commita22f8d3b2de88b9bb6f80f0c2780846ae23ab389 (patch)
treea2fdf570868896a787df8a1169951b0028e68d6b /src/threadengines/threadengine_pthread.cpp
parent43b1e43afb85639485e36d24da351dc0f121be6e (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/threadengine_pthread.cpp')
-rw-r--r--src/threadengines/threadengine_pthread.cpp108
1 files changed, 108 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);
+}