#include #include "Task.h" #include "String.h" Task::Task() : state(TASK_ON_HOLD), suspended(false) {} Task::~Task() {} int Task::Do() { return TASK_ON_HOLD; } int Task::Run() { cerr << "Running task '" << GetName() << "'...\n"; try { cerr << "Launching method Do()...\n"; state = Do(); } catch (TaskSwitch) { cerr << "Catch a task switching.\n"; throw; } catch (GeneralException e) { cerr << "Task " << GetName() << " caused an unexpected exception: '" << e.GetMsg() << "', closing it.\n"; return TASK_DONE; } cerr << "Task exitted normally.\n"; return state; } int Task::GetState() { return state; } String Task::GetName() { return "Unknow Task"; } int Task::Suspend() throw (GeneralException) { int r; cerr << "Suspending task " << GetName() << "...\n"; suspended = true; r = setjmp(env); if (!r) throw TaskSwitch(); return r; } void Task::Resume(int val) throw (GeneralException) { cerr << "Resuming task " << GetName() << "...\n"; if (suspended) { suspended = false; longjmp(env, val); } else { throw GeneralException(String("Task ") + GetName() + " was not suspended."); } }