diff options
-rw-r--r-- | includes/Task.h | 34 | ||||
-rw-r--r-- | src/Handle.cc | 13 |
2 files changed, 35 insertions, 12 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); } } } diff --git a/src/Handle.cc b/src/Handle.cc index 361561a..cc39f41 100644 --- a/src/Handle.cc +++ b/src/Handle.cc @@ -96,14 +96,11 @@ ssize_t Balau::Handle::forceWrite(const void * _buf, size_t count, Events::BaseE Balau::Future<uint8_t> Balau::Handle::readU8() { IO<Handle> t(this); - auto func = [t]() mutable -> uint8_t { - uint8_t r; - t->read(&r, 1); - return r; - }; - Future<uint8_t> r; - r.m_run = func; - return r; + return Future<uint8_t>([t]() mutable { + uint8_t b; + t->read(&b, 1); + return b; + }); } void Balau::Handle::rseek(off_t offset, int whence) throw (GeneralException) { |