Split Timer::tick into two overloads
authorMikko Rasa <tdb@tdb.fi>
Fri, 25 Dec 2015 10:16:47 +0000 (12:16 +0200)
committerMikko Rasa <tdb@tdb.fi>
Fri, 25 Dec 2015 10:16:47 +0000 (12:16 +0200)
This is in line with other similar interfaces, such as Poller and
Semaphore.  The old function still exists but is deprecated.

source/time/timer.cpp
source/time/timer.h

index 7c9567ecfecccafe826f8d1fcd52d0bb82d6f899..be1d1ed3291482b453ab03d228f5961eb80b8cab 100644 (file)
@@ -56,6 +56,28 @@ void Timer::cancel(Slot &slot)
 
 void Timer::tick(bool block)
 {
+       if(block)
+               tick();
+       else
+               tick(zero);
+}
+
+void Timer::tick()
+{
+       do_tick(-sec);
+}
+
+void Timer::tick(const TimeDelta &timeout)
+{
+       do_tick(timeout);
+}
+
+void Timer::do_tick(const TimeDelta &timeout)
+{
+       TimeStamp deadline;
+       if(timeout>=zero)
+               deadline = now()+timeout;
+
        Slot *next = 0;
        {
                MutexLock l(mutex);
@@ -71,12 +93,14 @@ void Timer::tick(bool block)
                                        break;
                        }
 
-                       if(block)
+                       if(timeout && (!deadline || t<deadline))
                        {
                                SetFlag setf(blocking);
                                mutex.unlock();
-                               if(stamp)
+                               if(stamp && (!deadline || stamp<deadline))
                                        sem.wait(stamp-t);
+                               else if(deadline)
+                                       sem.wait(deadline-t);
                                else
                                        sem.wait();
                                mutex.lock();
index 90d870ca9a3afbd44b155f5ccfb5b85747c02442..21aeb2b4b5b02ea0b41932f4a3311028f35c7e55 100644 (file)
@@ -66,13 +66,21 @@ public:
        /** 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.
+       /** Deprecated.  Use one of the other overloads. */
+       void tick(bool block);
 
-       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, then executes it.  If no timers have been
+       set, blocks until one is added from another thread. */
+       void tick();
 
+       /** 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;
 };