diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Task.cc | 19 | ||||
-rw-r--r-- | src/TaskMan.cc | 7 |
2 files changed, 16 insertions, 10 deletions
diff --git a/src/Task.cc b/src/Task.cc index 5026d28..52e9fa2 100644 --- a/src/Task.cc +++ b/src/Task.cc @@ -19,16 +19,21 @@ bool Balau::Task::needsStacks() { } void Balau::Task::setup(TaskMan * taskMan, void * stack) { - size_t size = stackSize(); + if (m_stackless) { + IAssert(!stack, "Since we're stackless, no stack should've been allocated."); + m_stack = NULL; + } else { + size_t size = stackSize(); #ifndef _WIN32 - IAssert(stack, "Can't setup a coroutine without a stack"); - m_stack = stack; - coro_create(&m_ctx, coroutineTrampoline, this, m_stack, size); + IAssert(stack, "Can't setup a coroutine without a stack"); + m_stack = stack; + coro_create(&m_ctx, coroutineTrampoline, this, m_stack, size); #else - Assert(!stack, "We shouldn't allocate stacks with Fibers"); - m_stack = NULL; - m_fiber = CreateFiber(size, coroutineTrampoline, this); + Assert(!stack, "We shouldn't allocate stacks with Fibers"); + m_stack = NULL; + m_fiber = CreateFiber(size, coroutineTrampoline, this); #endif + } m_taskMan = taskMan; diff --git a/src/TaskMan.cc b/src/TaskMan.cc index 048b27a..33d07d0 100644 --- a/src/TaskMan.cc +++ b/src/TaskMan.cc @@ -192,10 +192,11 @@ Balau::TaskMan::~TaskMan() { } void * Balau::TaskMan::getStack() { + if (!Task::needsStacks()) + return NULL; void * r = NULL; if (m_nStacks == 0) { - if (Task::needsStacks()) - r = malloc(Task::stackSize()); + r = malloc(Task::stackSize()); } else { r = m_stacks.front(); m_stacks.pop(); @@ -298,7 +299,7 @@ int Balau::TaskMan::mainLoop() { Printer::elog(E_TASK, "TaskMan at %p popped task %p...", this, t); IAssert(m_tasks.find(t) == m_tasks.end(), "TaskMan got task %p twice... ?", t); ev_now_update(m_loop); - t->setup(this, getStack()); + t->setup(this, t->isStackless() ? NULL : getStack()); m_tasks.insert(t); starting.insert(t); } |