X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilctask.c;h=152487e48e6bf82533e060b63db6671f16fb63a6;hb=6175840fb524397cecae2d70b4befa8d377a652d;hp=9aec2507e5ab1ce9f6158434ed378a4538481dc9;hpb=439d7874f4cc9590a4a4e5d57f924c1b661a1485;p=silc.git diff --git a/lib/silcutil/silctask.c b/lib/silcutil/silctask.c index 9aec2507..152487e4 100644 --- a/lib/silcutil/silctask.c +++ b/lib/silcutil/silctask.c @@ -151,6 +151,57 @@ SilcTask silc_task_add(SilcTaskQueue queue, SilcTask new, return new; } +#if 0 +void dump_tasks(SilcTaskQueue queue) +{ + SilcTask first, prev; + + if (!queue->task) + return; + + first = queue->task; + + fprintf(stderr, "\nqueue->task:\t%p\t%d\n", queue->task, + queue->task->timeout.tv_sec); + + prev = first->prev; + while (1) { + if (first == prev) + break; + + fprintf(stderr, "task :\t%p\t%d\n", prev, prev->timeout.tv_sec); + + prev = prev->prev; + } + fprintf(stderr, "\n"); +} +#endif + +/* Return the timeout task with smallest timeout. */ + +static SilcTask silc_task_get_first(SilcTaskQueue queue, SilcTask first) +{ + SilcTask prev, task; + + prev = first->prev; + + if (first == prev) + return first; + + task = first; + while (1) { + if (first == prev) + break; + + if (silc_task_timeout_compare(&prev->timeout, &task->timeout)) + task = prev; + + prev = prev->prev; + } + + return task; +} + /* Adds a timeout task into the task queue. This function is used by silc_task_register function. Returns a pointer to the registered task. Timeout tasks are sorted by their timeout value in ascending @@ -316,6 +367,10 @@ SilcTask silc_task_add_timeout(SilcTaskQueue queue, SilcTask new, return NULL; } +#if 0 + dump_tasks(queue); +#endif + return new; } @@ -443,12 +498,17 @@ int silc_task_remove(SilcTaskQueue queue, SilcTask task) if (prev == old && next == old) queue->task = NULL; if (queue->task == old) - queue->task = next; + queue->task = silc_task_get_first(queue, next); + /*queue->task = next;*/ + +#if 0 + dump_tasks(queue); +#endif silc_free(old); return TRUE; } - old = old->next; + old = old->prev; if (old == first) return FALSE;