diff options
author | Nicolas Noble <pixel@nobis-crew.org> | 2013-08-02 10:36:31 -0700 |
---|---|---|
committer | Nicolas Noble <pixel@nobis-crew.org> | 2013-08-02 10:36:31 -0700 |
commit | fdbddaa4873fda6e83b8894dd58f166ebde795c3 (patch) | |
tree | a5a203fd98e5b533d75dfbcc1db74f96aaac1b9b /includes | |
parent | 07f5a2245d7c15dfb6d716e307d2618a498886d9 (diff) |
Refining a bit more the Future class.
Diffstat (limited to 'includes')
-rw-r--r-- | includes/Task.h | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/includes/Task.h b/includes/Task.h index dcbdf91..4334ad2 100644 --- a/includes/Task.h +++ b/includes/Task.h @@ -262,22 +262,48 @@ class QueueBase { }; template<class R> -struct Future { +class Future { + public: typedef std::function<R()> func_t; + Future(func_t func) : m_func(func) { } R get(); - func_t m_run; + void run(); + private: + func_t m_func; + Events::BaseEvent * m_evt = NULL; }; template<class R> R Future<R>::get() { R r; for (;;) { + if (m_evt && !m_evt->gotSignal()) + continue; + m_evt = NULL; try { - r = m_run(); + r = m_func(); return r; } catch (EAgain & e) { - Task::operationYield(e.getEvent(), Task::INTERRUPTIBLE); + m_evt = e.getEvent(); + Task::operationYield(m_evt, Task::INTERRUPTIBLE); + } + } +} + +template<class R> +void Future<R>::run() { + for (;;) { + if (m_evt && !m_evt->gotSignal()) + continue; + m_evt = NULL; + try { + m_func(); + return; + } + catch (EAgain & e) { + m_evt = e.getEvent(); + Task::operationYield(m_evt, Task::INTERRUPTIBLE); } } } |