diff options
Diffstat (limited to 'includes')
-rw-r--r-- | includes/TaskMan.h | 2 | ||||
-rw-r--r-- | includes/Threads.h | 44 |
2 files changed, 32 insertions, 14 deletions
diff --git a/includes/TaskMan.h b/includes/TaskMan.h index 026ea88..1e7a2f1 100644 --- a/includes/TaskMan.h +++ b/includes/TaskMan.h @@ -51,7 +51,7 @@ class TaskMan { struct taskHasher { size_t operator()(const Task * t) const { return reinterpret_cast<uintptr_t>(t); } }; typedef gnu::hash_set<Task *, taskHasher> taskHash_t; taskHash_t m_tasks, m_signaledTasks; - Queue<Task *> m_pendingAdd; + Queue<Task> m_pendingAdd; bool m_stopped; struct ev_loop * m_loop; bool m_allowedToSignal; 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 <queue> #include <pthread.h> namespace Balau { @@ -40,33 +39,52 @@ class Thread { template<class T> 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<T> 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; }; |