X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Ftimer.c;h=761ab30e9be86ab1cb7e7f6613769e6263f70529;hb=5a78c3505ae7fa76a061e26676450049ec5946d5;hp=c355d3b7de1bd5d54e5fac5290bf4dad2624b047;hpb=4ecd6b5eabaf81c764a8ecf4ba8bacb7452a26d1;p=libucw.git diff --git a/lib/timer.c b/lib/timer.c index c355d3b7..761ab30e 100644 --- a/lib/timer.c +++ b/lib/timer.c @@ -1,43 +1,43 @@ /* - * Sherlock Library -- Prime Number Tests + * UCW Library -- A Simple Millisecond Timer * - * (c) 1997 Martin Mares, + * (c) 2007 Martin Mares + * + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. */ +#include "lib/lib.h" + #include #include #include -#include "lib.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) +{ + *timer = get_timestamp(); +} + +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) { - gettimeofday(&last_tv, NULL); + *new = get_timestamp(); + return MIN(*new-*old, ~0U); }