From: jacob Date: Sun, 17 Jan 2010 23:53:29 +0000 (+0000) Subject: Revert r8847, which was bilge; I can't magically change the order of a tree X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/commitdiff_plain/1605c493c65a1879408acad03a1d5991ada08dc2 Revert r8847, which was bilge; I can't magically change the order of a tree just by giving a different sorting function to find234(). git-svn-id: svn://svn.tartarus.org/sgt/putty@8849 cda61777-01e9-0310-a592-d414129be87e --- diff --git a/timing.c b/timing.c index 3eb3299a..abb9b466 100644 --- a/timing.c +++ b/timing.c @@ -22,6 +22,7 @@ struct timer { }; static tree234 *timers = NULL; +static tree234 *timer_contexts = NULL; static long now = 0L; static int compare_timers(void *av, void *bv) @@ -70,10 +71,8 @@ static int compare_timers(void *av, void *bv) static int compare_timer_contexts(void *av, void *bv) { - struct timer *at = (struct timer *)av; - struct timer *bt = (struct timer *)bv; - char *a = (char *)at->ctx; - char *b = (char *)bt->ctx; + char *a = (char *)av; + char *b = (char *)bv; if (a < b) return -1; else if (a > b) @@ -85,6 +84,7 @@ static void init_timers(void) { if (!timers) { timers = newtree234(compare_timers); + timer_contexts = newtree234(compare_timer_contexts); now = GETTICKCOUNT(); } } @@ -113,6 +113,8 @@ long schedule_timer(int ticks, timer_fn_t fn, void *ctx) if (t != add234(timers, t)) { sfree(t); /* identical timer already exists */ + } else { + add234(timer_contexts, t->ctx);/* don't care if this fails */ } first = (struct timer *)index234(timers, 0); @@ -198,7 +200,14 @@ int run_timers(long anow, long *next) if (!first) return FALSE; /* no timers remaining */ - if (first->now - now <= 0) { + if (find234(timer_contexts, first->ctx, NULL) == NULL) { + /* + * This timer belongs to a context that has been + * expired. Delete it without running. + */ + delpos234(timers, 0); + sfree(first); + } else if (first->now - now <= 0) { /* * This timer is active and has reached its running * time. Run it. @@ -222,24 +231,13 @@ int run_timers(long anow, long *next) */ void expire_timer_context(void *ctx) { - struct timer *ptr; - struct timer exemplar; - - if (!timers) return; - - exemplar.ctx = ctx; - /* don't care about initialisation of other members */ - - /* Dispose of all timers with this context */ - while ((ptr = (struct timer *)find234(timers, &exemplar, - compare_timer_contexts))) { - del234(timers, ptr); - sfree(ptr); - } + init_timers(); - /* Dispose of timer tree itself if none are left */ - if (count234(timers) == 0) { - freetree234(timers); - timers = NULL; - } + /* + * We don't bother to check the return value; if the context + * already wasn't in the tree (presumably because no timers + * ever actually got scheduled for it) then that's fine and we + * simply don't need to do anything. + */ + del234(timer_contexts, ctx); }