summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/Task.h34
-rw-r--r--src/Handle.cc13
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) {