#include <vector>
#include <sigc++/sigc++.h>
#include <msp/core/mutex.h>
+#include <msp/core/noncopyable.h>
#include <msp/core/semaphore.h>
#include "timedelta.h"
#include "timestamp.h"
This class is thread-safe, to allow running timers in a separate thread.
*/
-class Timer
+class Timer: private NonCopyable
{
public:
class Slot
private:
struct SlotProxy
{
- Slot *slot;
+ Slot *slot = 0;
SlotProxy(Slot *);
bool operator<(const SlotProxy &) const;
std::vector<SlotProxy> slots;
Semaphore sem;
Mutex mutex;
+ bool blocking = false;
public:
+ Timer();
~Timer();
- /**
- Adds a timer that will be executed periodically as long as the timeout
- signal hander returns true.
- */
+ /** Adds a timer that will be executed periodically as long as the timeout
+ signal hander returns true. */
Slot &add(const TimeDelta &);
- /**
- Adds a timer that will be executed once at a specific time. The return
- value of the timeout signal handler is ignored.
- */
+ /** Adds a timer that will be executed once at a specific time. The return
+ value of the timeout signal handler is ignored. */
Slot &add(const TimeStamp &);
- /**
- Cancels a previously added timer.
- */
+ /** Cancels a previously added timer. */
void cancel(Slot &);
- /**
- Checks all timers, executing any that have timed out. If block is true,
- waits until one times out.
+ /** Waits until a timer expires, then executes it. If no timers have been
+ set, blocks until one is added from another thread. */
+ void tick();
- Note: If there are no active timers when a blocking tick is executed, it
- won't return until a timer is added from another thread.
- */
- void tick(bool block = true);
+ /** Waits until a timer expires but at most the specified amount of time.
+ If a timer did expire before the timeout, it is executed. */
+ void tick(const TimeDelta &);
+private:
+ void do_tick(const TimeDelta &);
+
+public:
TimeStamp get_next_timeout() const;
};