Fixed bad logic inside the timer scheduling.

This commit is contained in:
Jan Vidar Krey
2010-01-21 22:56:07 +01:00
parent b04a20c66e
commit 78ad9b8572
4 changed files with 29 additions and 28 deletions

View File

@@ -36,7 +36,6 @@ void timeout_evt_reset(struct timeout_evt* t)
int timeout_evt_is_scheduled(struct timeout_evt* t)
{
if (!t) return 0;
return !!t->prev;
}
@@ -82,16 +81,18 @@ void timeout_queue_insert(struct timeout_queue* t, struct timeout_evt* evt, size
first = t->events[pos];
if (!first)
if (first)
{
first->prev->next = evt;
evt->prev = first->prev;
first->prev = evt;
}
else
{
t->events[pos] = evt;
evt->prev = evt;
}
else
{
evt->prev = first->prev;
first->prev = evt;
}
evt->next = 0;
}
void timeout_queue_remove(struct timeout_queue* t, struct timeout_evt* evt)
@@ -99,23 +100,33 @@ void timeout_queue_remove(struct timeout_queue* t, struct timeout_evt* evt)
size_t pos = (evt->timestamp % t->max);
struct timeout_evt* first = t->events[pos];
if (!first || !evt)
if (!first || !evt->prev)
return;
if (first == evt)
{
if (first->next)
first->next->prev = first->prev;
t->events[pos] = first->next;
if (first->prev != first)
{
t->events[pos] = first->next;
t->events[pos]->prev = evt->prev;
}
else
{
t->events[pos] = 0;
}
}
else if (evt == first->prev)
{
first->prev = evt->prev;
evt->prev->next = 0;
}
else
{
evt->prev->next = evt->next;
if (evt->next)
evt->next->prev = evt->prev;
else
first->prev = evt->prev;
evt->next->prev = evt->prev;
}
evt->next = 0;
evt->prev = 0;
}
void timeout_queue_reschedule(struct timeout_queue* t, struct timeout_evt* evt, size_t seconds)