#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
{
Slot *slot;
- 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
/** 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;
};