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