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; } +  }; | 
