diff options
Diffstat (limited to 'includes/TaskMan.h')
-rw-r--r-- | includes/TaskMan.h | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/includes/TaskMan.h b/includes/TaskMan.h index b4645fe..afc2b8a 100644 --- a/includes/TaskMan.h +++ b/includes/TaskMan.h @@ -8,40 +8,54 @@ #include <ext/hash_set> #include <vector> #include <Threads.h> +#include <Exceptions.h> namespace gnu = __gnu_cxx; namespace Balau { class Task; +class TaskScheduler; + +namespace Events { + +class Async; + +}; class TaskMan { public: TaskMan(); ~TaskMan(); void mainLoop(); - void stop() { m_stopped = true; } - static TaskMan * getTaskMan(); + static TaskMan * getDefaultTaskMan(); struct ev_loop * getLoop() { return m_loop; } void signalTask(Task * t); - + static void stop(); + void stopMe() { m_stopped = true; } private: - void registerTask(Task * t); + static void registerTask(Task * t); + void addToPending(Task * t); #ifndef _WIN32 coro_context m_returnContext; #else void * m_fiber; #endif friend class Task; + friend class TaskScheduler; + template<class T> + friend T * createTask(T * t); struct taskHasher { size_t operator()(const Task * t) const { return reinterpret_cast<uintptr_t>(t); } }; typedef gnu::hash_set<Task *, taskHasher> taskHash_t; - typedef std::vector<Task *> taskList_t; taskHash_t m_tasks, m_signaledTasks; - taskList_t m_pendingAdd; - Lock m_pendingLock; - volatile bool m_stopped; + Queue<Task *> m_pendingAdd; + bool m_stopped; struct ev_loop * m_loop; bool m_allowedToSignal; + ev::async m_evt; }; +template<class T> +T * createTask(T * t) { TaskMan::registerTask(t); Assert(dynamic_cast<Task *>(t)); return t; } + }; |