X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=timing.c;h=696c1e1d7ce58281052299dbc9c8bb2e3e49d67c;hb=700908ef6e9c66886af6c73f86287a84dc4731f2;hp=9c2a8787da64cd9711d02a58a6e5e8e890898875;hpb=538090ede444b111039904cf918f095dc858e875;p=PuTTY.git diff --git a/timing.c b/timing.c index 9c2a8787..696c1e1d 100644 --- a/timing.c +++ b/timing.c @@ -36,13 +36,13 @@ struct timer { timer_fn_t fn; void *ctx; - long now; - long when_set; + unsigned long now; + unsigned long when_set; }; static tree234 *timers = NULL; static tree234 *timer_contexts = NULL; -static long now = 0L; +static unsigned long now = 0L; static int compare_timers(void *av, void *bv) { @@ -62,7 +62,11 @@ static int compare_timers(void *av, void *bv) */ #if defined(__LCC__) || defined(__clang__) /* lcc won't let us compare function pointers. Legal, but annoying. */ - return memcmp(&a->fn, &b->fn, sizeof(a->fn)); + { + int c = memcmp(&a->fn, &b->fn, sizeof(a->fn)); + if (c) + return c; + } #else if (a->fn < b->fn) return -1; @@ -102,9 +106,9 @@ static void init_timers(void) } } -long schedule_timer(int ticks, timer_fn_t fn, void *ctx) +unsigned long schedule_timer(int ticks, timer_fn_t fn, void *ctx) { - long when; + unsigned long when; struct timer *t, *first; init_timers(); @@ -144,12 +148,23 @@ long schedule_timer(int ticks, timer_fn_t fn, void *ctx) return when; } +unsigned long timing_last_clock(void) +{ + /* + * Return the last value we stored in 'now'. In particular, + * calling this just after schedule_timer returns the value of + * 'now' that was used to decide when the timer you just set would + * go off. + */ + return now; +} + /* * Call to run any timers whose time has reached the present. * Returns the time (in ticks) expected until the next timer after * that triggers. */ -int run_timers(long anow, long *next) +int run_timers(unsigned long anow, unsigned long *next) { struct timer *first; @@ -170,8 +185,8 @@ int run_timers(long anow, long *next) */ delpos234(timers, 0); sfree(first); - } else if (first->now - now <= 0 || - now - (first->when_set - 10) < 0) { + } else if (now - (first->when_set - 10) > + first->now - (first->when_set - 10)) { /* * This timer is active and has reached its running * time. Run it.