Fix longstanding problem with wrap-arounds.
authorbernie <bernie@38d2e660-2303-0410-9eaa-f027e97ec537>
Thu, 14 Oct 2004 23:14:05 +0000 (23:14 +0000)
committerbernie <bernie@38d2e660-2303-0410-9eaa-f027e97ec537>
Thu, 14 Oct 2004 23:14:05 +0000 (23:14 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@236 38d2e660-2303-0410-9eaa-f027e97ec537

drv/timer.c

index 92152bc1059f6a1063a45d70c219ba72f300eacb..101a468d896afb5a9da1a346d7ea71e8b129dd49 100755 (executable)
@@ -14,6 +14,9 @@
 
 /*#*
  *#* $Log$
+ *#* Revision 1.18  2004/10/14 23:14:05  bernie
+ *#* Fix longstanding problem with wrap-arounds.
+ *#*
  *#* Revision 1.17  2004/10/03 18:52:08  bernie
  *#* Move \brief on top in header to please Doxygen.
  *#*
@@ -102,14 +105,18 @@ void timer_add(Timer *timer)
        /* Calculate expiration time for this timer */
        timer->tick = _clock + timer->delay;
 
-       /* Search for the first node whose expiration time is
+       /*
+        * Search for the first node whose expiration time is
         * greater than the timer we want to add.
         */
        node = (Timer *)timers_queue.head;
        while (node->link.succ)
        {
-               /* Stop just after the insertion point */
-               if (node->tick > timer->tick)
+               /*
+                * Stop just after the insertion point.
+                * (this fancy compare takes care of wrap-arounds).
+                */
+               if (node->tick - timer->tick > 0)
                        break;
 
                /* Go to next node */