From 64120be7af8d2ded76cd3a3401fc69cadb96351e Mon Sep 17 00:00:00 2001 From: Pixel Date: Tue, 29 Nov 2011 01:21:48 -0800 Subject: The TaskManager no longer waits on the pop(); instead it waits in the libev loop; also the Queue<> template changed for a naive but std-less implementation. --- includes/Threads.h | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) (limited to 'includes/Threads.h') diff --git a/includes/Threads.h b/includes/Threads.h index 256e8e3..ca60627 100644 --- a/includes/Threads.h +++ b/includes/Threads.h @@ -1,6 +1,5 @@ #pragma once -#include #include namespace Balau { @@ -40,33 +39,52 @@ class Thread { template class Queue { public: - Queue() { pthread_cond_init(&m_cond, NULL); } - ~Queue() { while (size()) pop(); pthread_cond_destroy(&m_cond); } - void push(T & t) { + Queue() : m_front(NULL), m_back(NULL) { pthread_cond_init(&m_cond, NULL); } + ~Queue() { while (!isEmpty()) pop(); pthread_cond_destroy(&m_cond); } + void push(T * t) { m_lock.enter(); - m_queue.push(t); + Cell * c = new Cell(t); + c->m_prev = m_back; + if (m_back) + m_back->m_next = c; + else + m_front = c; + m_back = c; pthread_cond_signal(&m_cond); m_lock.leave(); } - T pop() { + T * pop() { m_lock.enter(); - if (m_queue.size() == 0) + while (!m_front) pthread_cond_wait(&m_cond, &m_lock.m_lock); - T t = m_queue.front(); - m_queue.pop(); + Cell * c = m_front; + m_front = c->m_next; + if (m_front) + m_front->m_prev = NULL; + else + m_back = NULL; + T * t = c->m_elem; + delete c; m_lock.leave(); return t; } - int size() { - int r; + bool isEmpty() { + bool r; m_lock.enter(); - r = m_queue.size(); + r = !m_front; m_lock.leave(); return r; } private: - std::queue m_queue; Lock m_lock; + class Cell { + public: + Cell(T * elem) : m_next(NULL), m_prev(NULL), m_elem(elem) { } + Cell * m_next, * m_prev; + T * m_elem; + }; + Cell * volatile m_front; + Cell * volatile m_back; pthread_cond_t m_cond; }; -- cgit v1.2.3