From fb61a39850cfc8083c6a9575ac04839ed4362094 Mon Sep 17 00:00:00 2001 From: Pixel Date: Sun, 8 Apr 2012 17:02:02 -0700 Subject: First pass on the stackless task class - mainly a bunch of #defines for now. --- includes/StacklessTask.h | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 includes/StacklessTask.h (limited to 'includes/StacklessTask.h') diff --git a/includes/StacklessTask.h b/includes/StacklessTask.h new file mode 100644 index 0000000..ca5d521 --- /dev/null +++ b/includes/StacklessTask.h @@ -0,0 +1,68 @@ +#pragma once + +#include + +namespace Balau { + +class StacklessTask : public Task { + public: + StacklessTask() : m_state(0) { setStackless(); } + protected: + void taskSwitch() throw (GeneralException) { throw TaskSwitch(); } + unsigned int m_state; +}; + +}; + +#define StacklessBegin() \ + switch(m_state) { \ + case 0: { \ + + +#define StacklessOperation(operation) \ + m_state = __LINE__; \ + } \ + case __LINE__: { \ + try { \ + operation; \ + } \ + catch (Balau::EAgain & e) { \ + auto evt = e.getEvent(); \ + waitFor(evt); \ + taskSwitch(); \ + } \ + + +#define StacklessWaitFor(evt) \ + m_state = __LINE__; \ + waitFor(evt); \ + taskSwitch(); \ + } \ + case __LINE__: { \ + + +#define StacklessWait(cond) \ + m_state = __LINE__; \ + } \ + case __LINE__: { \ + if (!(cond)) \ + taskSwitch(); \ + + +#define StacklessYield() \ + m_state = __LINE__; \ + try { \ + yield(true); \ + } \ + catch (Balau::EAgain & e) { \ + taskSwitch(); \ + } \ + } \ + case __LINE__: { \ + + +#define StacklessEnd() \ + } \ + default: \ + AssertHelper("unknown state", "State %i is out of range in task %s at %p", m_state, getName(), this); \ + } -- cgit v1.2.3