]> mj.ucw.cz Git - libucw.git/commitdiff
Replaced the old timing functions by something more useful.
authorMartin Mares <mj@ucw.cz>
Sat, 17 Feb 2007 21:02:21 +0000 (22:02 +0100)
committerMartin Mares <mj@ucw.cz>
Sat, 17 Feb 2007 21:02:21 +0000 (22:02 +0100)
get_timer() using global state was making it unusable in many cases,
especially in library routines. I decided to make the callers specify
an explicit context (a timer) instead and re-used the idea of millisecond
timestamps from mainloop.c.

I've moved timestamp_t to config.h, introduced global get_timestamp()
and replaced the timer functions by ones with an explicit timestamp_t *
argument.

lib/config.h
lib/lib.h
lib/mainloop.h
lib/timer.c

index 72be2f98826d12a36d59e313ce0daf69aae180d9..22140f203936af25076dc475185fcbaa6c68cd1f 100644 (file)
@@ -37,7 +37,8 @@ typedef uint64_t u64;                 /* exactly 64 bits, unsigned */
 typedef int64_t s64;                   /* exactly 64 bits, signed */
 
 typedef unsigned int uns;              /* at least 32 bits */
-typedef u32 sh_time_t;                 /* Timestamp */
+typedef u32 sh_time_t;                 /* seconds since UNIX epoch */
+typedef s64 timestamp_t;               /* milliseconds since UNIX epoch */
 
 #ifdef CONFIG_LARGE_FILES              /* File positions */
 typedef s64 sh_off_t;
index 554d9ecbd5d7b1561a12408b39058f8886faf529..d8a1ddff8aab0c426d1d00861bb7048a71bdf1e6 100644 (file)
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -192,11 +192,11 @@ uns prev_table_prime(uns x);
 
 /* timer.c */
 
-struct timeval;
+timestamp_t get_timestamp(void);
 
-void init_timer(void);
-uns get_timer(void);
-void get_last_timeval(struct timeval *tv);
+void init_timer(timestamp_t *timer);
+uns get_timer(timestamp_t *timer);
+uns switch_timer(timestamp_t *old, timestamp_t *new);
 
 /* regex.c */
 
index f321c2b5fc85e57402d1a4c2741b1deea26f2bcd..136d90e04858c1c3b4112c41d8c21dd9c53475d4 100644 (file)
@@ -12,7 +12,6 @@
 
 #include "lib/clists.h"
 
-typedef s64 timestamp_t;                       /* We measure time in milliseconds */
 extern timestamp_t main_now;                   /* Current time in milliseconds since UNIX epoch */
 extern sh_time_t main_now_seconds;             /* Current time in seconds since the epoch */
 extern uns main_shutdown;
index 86a2d1984cd06ad5dec760ba572def3978ea8051..761ab30e9be86ab1cb7e7f6613769e6263f70529 100644 (file)
@@ -1,7 +1,7 @@
 /*
- *     UCW Library -- Execution Timing
+ *     UCW Library -- A Simple Millisecond Timer
  *
- *     (c) 1997 Martin Mares <mj@ucw.cz>
+ *     (c) 2007 Martin Mares <mj@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
 #include <stdlib.h>
 #include <sys/time.h>
 
-static struct timeval last_tv;
-
-uns
-get_timer(void)
+timestamp_t
+get_timestamp(void)
 {
   struct timeval tv;
-  uns diff;
-
   gettimeofday(&tv, NULL);
-  if (tv.tv_sec < last_tv.tv_sec
-      || tv.tv_sec == last_tv.tv_sec && tv.tv_usec < last_tv.tv_usec)
-    diff = 0;
-  else
-    {
-      if (tv.tv_sec == last_tv.tv_sec)
-       diff = (tv.tv_usec - last_tv.tv_usec + 500) / 1000;
-      else
-       {
-         diff = 1000 * (tv.tv_sec - last_tv.tv_sec - 1);
-         diff += (1000500 - last_tv.tv_usec + tv.tv_usec) / 1000;
-       }
-    }
-  last_tv = tv;
-  return diff;
+  return (timestamp_t)tv.tv_sec * 1000 + tv.tv_usec / 1000;
 }
 
 void
-init_timer(void)
+init_timer(timestamp_t *timer)
 {
-  gettimeofday(&last_tv, NULL);
+  *timer = get_timestamp();
 }
 
-void
-get_last_timeval(struct timeval *tv)
+uns
+get_timer(timestamp_t *timer)
+{
+  timestamp_t t = *timer;
+  *timer = get_timestamp();
+  return MIN(*timer-t, ~0U);
+}
+
+uns
+switch_timer(timestamp_t *old, timestamp_t *new)
 {
-  *tv = last_tv;
+  *new = get_timestamp();
+  return MIN(*new-*old, ~0U);
 }