////////////////////////////////////////////////////////////////////////
// OpenTibia - an opensource roleplaying game
////////////////////////////////////////////////////////////////////////
// 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 3 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, see .
////////////////////////////////////////////////////////////////////////
#ifndef __TASKS__
#define __TASKS__
#include "otsystem.h"
#include
#define DISPATCHER_TASK_EXPIRATION 2000
class Task
{
public:
Task(const boost::function& f): m_expiration(
boost::date_time::not_a_date_time), m_f(f) {}
Task(uint32_t ms, const boost::function& f): m_expiration(
boost::get_system_time() + boost::posix_time::milliseconds(ms)), m_f(f) {}
virtual ~Task() {}
void operator()() {m_f();}
void unsetExpiration() {m_expiration = boost::date_time::not_a_date_time;}
bool hasExpired() const
{
if(m_expiration == boost::date_time::not_a_date_time)
return false;
return m_expiration < boost::get_system_time();
}
protected:
boost::system_time m_expiration;
boost::function m_f;
};
inline Task* createTask(boost::function f)
{
return new Task(f);
}
inline Task* createTask(uint32_t expiration, boost::function f)
{
return new Task(expiration, f);
}
class Dispatcher
{
public:
virtual ~Dispatcher() {}
static Dispatcher& getInstance()
{
static Dispatcher dispatcher;
return dispatcher;
}
void addTask(Task* task, bool front = false);
void stop();
void shutdown();
static void dispatcherThread(void* p);
protected:
void flush();
Dispatcher();
enum DispatcherState
{
STATE_RUNNING,
STATE_CLOSING,
STATE_TERMINATED
};
boost::mutex m_taskLock;
boost::condition_variable m_taskSignal;
std::list m_taskList;
static DispatcherState m_threadState;
};
#endif