just by giving a different sorting function to find234().
git-svn-id: http://svn.tartarus.org/sgt/putty@8849
cda61777-01e9-0310-a592-
d414129be87e
};
static tree234 *timers = NULL;
};
static tree234 *timers = NULL;
+static tree234 *timer_contexts = NULL;
static long now = 0L;
static int compare_timers(void *av, void *bv)
static long now = 0L;
static int compare_timers(void *av, void *bv)
static int compare_timer_contexts(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)
if (a < b)
return -1;
else if (a > b)
{
if (!timers) {
timers = newtree234(compare_timers);
{
if (!timers) {
timers = newtree234(compare_timers);
+ timer_contexts = newtree234(compare_timer_contexts);
now = GETTICKCOUNT();
}
}
now = GETTICKCOUNT();
}
}
if (t != add234(timers, t)) {
sfree(t); /* identical timer already exists */
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);
}
first = (struct timer *)index234(timers, 0);
if (!first)
return FALSE; /* no timers remaining */
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.
/*
* This timer is active and has reached its running
* time. Run it.
*/
void expire_timer_context(void *ctx)
{
*/
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);
- }
- /* 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);