From 5a283e5b2b523d53e3504292c386b534dc74386a Mon Sep 17 00:00:00 2001 From: Pixel Date: Fri, 7 Oct 2011 09:27:04 -0700 Subject: Preliminary work for the Task manager. Added libcoro submodule. Also refactored some pieces of code. --- src/Local.cc | 4 ++++ src/Printer.cc | 29 +++++------------------------ src/Task.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/TaskMan.cc | 21 +++++++++++++++++++++ 4 files changed, 76 insertions(+), 24 deletions(-) create mode 100644 src/Task.cc create mode 100644 src/TaskMan.cc (limited to 'src') diff --git a/src/Local.cc b/src/Local.cc index 1262179..c354db9 100644 --- a/src/Local.cc +++ b/src/Local.cc @@ -13,6 +13,10 @@ void * Balau::TLSManager::setTLS(void * val) { return r; } +void * Balau::TLSManager::createTLS() { + return Local::create(); +} + static Balau::TLSManager dummyTLSManager; Balau::TLSManager * Balau::tlsManager = &dummyTLSManager; diff --git a/src/Printer.cc b/src/Printer.cc index fda9952..cb94084 100644 --- a/src/Printer.cc +++ b/src/Printer.cc @@ -2,14 +2,8 @@ #include "Main.h" #include "Local.h" -class PrinterLocal : public Balau::Local { - public: - PrinterLocal() { } - Balau::Printer * getGlobal() { return reinterpret_cast(Local::getGlobal()); } - Balau::Printer * get() { return reinterpret_cast(Local::get()); } - void setGlobal(Balau::Printer * printer) { Local::setGlobal(printer); } - void set(Balau::Printer * printer) { Local::set(printer); } -} printerLocal; +static Balau::DefaultTmpl defaultPrinter(10); +static Balau::LocalTmpl localPrinter; static const char * prefixes[] = { "(DD) ", @@ -21,11 +15,11 @@ static const char * prefixes[] = { }; Balau::Printer::Printer() : m_verbosity(M_STATUS | M_WARNING | M_ERROR) { - if (!printerLocal.getGlobal()) - printerLocal.setGlobal(this); + if (!localPrinter.getGlobal()) + localPrinter.setGlobal(this); } -Balau::Printer * Balau::Printer::getPrinter() { return printerLocal.get(); } +Balau::Printer * Balau::Printer::getPrinter() { return localPrinter.get(); } void Balau::Printer::_log(uint32_t level, const char * fmt, va_list ap) { if (!(level & m_verbosity)) @@ -45,16 +39,3 @@ void Balau::Printer::_log(uint32_t level, const char * fmt, va_list ap) { void Balau::Printer::_print(const char * fmt, va_list ap) { vfprintf(stderr, fmt, ap); } - -class DefaultPrinter : public Balau::AtStart { - public: - DefaultPrinter() : AtStart(10) { } - protected: - virtual void doStart(); -}; - -static DefaultPrinter defaultPrinter; - -void DefaultPrinter::doStart() { - new Balau::Printer(); -} diff --git a/src/Task.cc b/src/Task.cc new file mode 100644 index 0000000..d41f088 --- /dev/null +++ b/src/Task.cc @@ -0,0 +1,46 @@ +#include "Task.h" +#include "TaskMan.h" +#include "Exceptions.h" +#include "Printer.h" +#include "Local.h" + +Balau::Task::Task() { + size_t size = stackSize(); + stack = malloc(size); + coro_create(&ctx, coroutine, this, stack, size); + taskMan = TaskMan::getTaskMan(); + tls = tlsManager->createTLS(); + status = STARTING; +} + +void Balau::Task::coroutine(void * arg) { + Task * task = reinterpret_cast(arg); + Assert(task); + try { + task->status = RUNNING; + task->Do(); + task->status = STOPPED; + } + catch (GeneralException & e) { + Printer::log(M_WARNING, "Task %s caused an exception: `%s' - stopping.", task->getName(), e.getMsg()); + task->status = FAULTED; + } + catch (...) { + Printer::log(M_WARNING, "Task %s caused an unknown exception - stopping.", task->getName()); + task->status = FAULTED; + } + coro_transfer(&task->ctx, &task->taskMan->returnContext); +} + +void Balau::Task::switchTo() { + status = RUNNING; + void * oldTLS = tlsManager->getTLS(); + tlsManager->setTLS(tls); + coro_transfer(&taskMan->returnContext, &ctx); + tlsManager->setTLS(oldTLS); + status = IDLE; +} + +void Balau::Task::suspend() { + coro_transfer(&ctx, &taskMan->returnContext); +} diff --git a/src/TaskMan.cc b/src/TaskMan.cc new file mode 100644 index 0000000..783c683 --- /dev/null +++ b/src/TaskMan.cc @@ -0,0 +1,21 @@ +#include "TaskMan.h" +#include "Main.h" +#include "Local.h" + +static Balau::DefaultTmpl defaultTaskMan(50); +static Balau::LocalTmpl localTaskMan; + +Balau::TaskMan::TaskMan() { + coro_create(&returnContext, 0, 0, 0, 0); + if (!localTaskMan.getGlobal()) + localTaskMan.setGlobal(this); +} + +Balau::TaskMan * Balau::TaskMan::getTaskMan() { return localTaskMan.get(); } + +Balau::TaskMan::~TaskMan() { + Assert(localTaskMan.getGlobal() != this); +} + +void Balau::TaskMan::mainLoop() { +} -- cgit v1.2.3