blob: 2681a5af411eddf6d303709c6890946c12fc5595 [file] [log] [blame]
#if !defined(_concurrency_TimerManager_h_)
#define _concurrency_TimerManager_h_ 1
#include "Exception.h"
#include "Monitor.h"
#include "Thread.h"
#include <map>
#include <time.h>
namespace facebook { namespace thrift { namespace concurrency {
/** Timer Manager
This class dispatches timer tasks when they fall due.
@author marc
@version $Id:$ */
class TimerManager {
public:
TimerManager();
virtual ~TimerManager();
virtual const ThreadFactory* threadFactory() const;
virtual void threadFactory(const ThreadFactory* value);
/** Starts the timer manager service
@throws IllegalArgumentException Missing thread factory attribute */
virtual void start();
/** Stops the timer manager service */
virtual void stop();
virtual size_t taskCount() const ;
/** Adds a task to be executed at some time in the future by a worker thread.
@param task The task to execute
@param timeout Time in milliseconds to delay before executing task */
virtual void add(Runnable* task, long long timeout);
/** Adds a task to be executed at some time in the future by a worker thread.
@param task The task to execute
@param timeout Absolute time in the future to execute task. */
virtual void add(Runnable* task, const struct timespec& timeout);
/** Removes a pending task
@throws NoSuchTaskException Specified task doesn't exist. It was either processed already or this call was made for a task that
was never added to this timer
@throws UncancellableTaskException Specified task is already being executed or has completed execution. */
virtual void remove(Runnable* task);
enum STATE {
UNINITIALIZED = 1000,
STARTING = 1001,
STARTED = 1002,
STOPPING = 1003,
STOPPED = 1004
};
virtual const STATE state() const;
private:
const ThreadFactory* _threadFactory;
class Task;
friend class Task;
std::multimap<long long, Task*> _taskMap;
size_t _taskCount;
Monitor _monitor;
STATE _state;
class Dispatcher;
friend class Dispatcher;
Dispatcher* _dispatcher;
Thread* _dispatcherThread;
};
}}} // facebook::thrift::concurrency
#endif // !defined(_concurrency_TimerManager_h_)