/* * Baltisot * Copyright (C) 1999-2007 Nicolas "Pixel" Noble * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef _WIN32 #include #endif #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "TaskMan.h" #include "Task.h" #include "BString.h" #include "gettext.h" Task::Task() : current(0), state(TASK_ON_HOLD), stopped(false), suspended(false), yielded(false), wbta(0), wta(0), BurstHandle(0) { TaskMan::AddTask(this); } Task::~Task() { TaskMan::RemoveFromWatches(this); TaskMan::RemoveTimeout(this); if (wbta) wbta->wta = 0; if (wta) wta->wbta = 0; } int Task::Do() throw (GeneralException) { return TASK_ON_HOLD; } int Task::Run() { if (TaskMan::Event() == Task::EVT_TASK) wta = 0; try { state = Do(); } catch (TaskSwitch) { return state; } catch (GeneralException e) { std::cerr << _("Task ") << GetName() << _(" caused an unexpected exception: \"") << e.GetMsg() << _("\". Terminating.\n"); state = TASK_DONE; return TASK_DONE; } return state; } int Task::DryRun() { while (state != TASK_DONE) { try { state = Do(); } catch (TaskSwitch) { } catch (GeneralException e) { std::cerr << _("Task ") << GetName() << _(" caused an unexpected exception during dry-run: \"") << e.GetMsg() << _("\". Terminating.\n"); state = TASK_DONE; } } return state; } int Task::GetState() { return state; } String Task::GetName() { return _("Unknow Task"); } void Task::Suspend(int newstate) throw (GeneralException) { if (newstate != -1) { state = newstate; } suspended = true; throw TaskSwitch(); } void Task::WaitFor(Handle * h, int flags) { h->SetNonBlock(); TaskMan::WaitFor(h, this, flags); } void Task::WaitFor(Task * t) { t->wbta = this; wta = t; } void Task::WaitFor(pid_t p) { TaskMan::WaitFor(p, this); } void Task::WaitFor(const timeval & t, int flags) { TaskMan::WaitFor(t, this, flags); } void Task::Yield() { yielded = true; Suspend(TASK_ON_HOLD); } bool Task::Yielded() { return yielded; } void Task::Unyield() { yielded = false; SetBurst(); } void Task::SetBurst() { state = TASK_BURST; } void Task::Stop() { stopped = true; } void Task::Restart() { stopped = false; } bool Task::IsStopped() { return stopped; } Task * Task::WaitedBy() { return wbta; } void Task::RemoveFromWatches() { wbta = 0; } void Task::RemoveTimeout() { TaskMan::RemoveTimeout(this); }