From 13684e6c58ed3f0bd6fd811125e31fc3a37bda21 Mon Sep 17 00:00:00 2001 From: Pixel Date: Thu, 13 Oct 2011 23:52:31 -0700 Subject: Adding a Thread and a Queue class. --- src/Threads.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'src') diff --git a/src/Threads.cc b/src/Threads.cc index fa3f0f3..5f07040 100644 --- a/src/Threads.cc +++ b/src/Threads.cc @@ -1,9 +1,20 @@ #include "Exceptions.h" #include "Threads.h" +#include "Local.h" + +namespace Balau { + +class ThreadHelper { + public: + static void * threadProc(void * arg); +}; + +} Balau::Lock::Lock() { int r; pthread_mutexattr_t attr; + r = pthread_mutexattr_init(&attr); Assert(r == 0); r = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); @@ -11,3 +22,37 @@ Balau::Lock::Lock() { r = pthread_mutex_init(&m_lock, &attr); Assert(r == 0); } + +void * Balau::ThreadHelper::threadProc(void * arg) { + void * tls = g_tlsManager->createTLS(); + g_tlsManager->setTLS(tls); + Balau::Thread * thread = reinterpret_cast(arg); + void * r = thread->proc(); + free(tls); + return r; +} + +Balau::Thread::~Thread() { + join(); +} + +void * Balau::Thread::join() { + void * r = NULL; + if (!m_joined) { + m_joined = true; + pthread_join(m_thread, &r); + } + return r; +} + +void Balau::Thread::threadStart() { + pthread_attr_t attr; + int r; + + r = pthread_attr_init(&attr); + Assert(r == 0); + r = pthread_create(&m_thread, &attr, Balau::ThreadHelper::threadProc, this); + Assert(r == 0); + r = pthread_attr_destroy(&attr); + Assert(r == 0); +} -- cgit v1.2.3