To avoid problems in the very unlikely case where a timeout is so long
and new IDs are allocated so frequently that they would have a chance
to overflow and catch up with it, make sure before returning new ID that
it's currently not in use.
static SCH_TimeoutID
get_new_tqe_id(void)
{
+ TimerQueueEntry *ptr;
+
+try_again:
next_tqe_id++;
if (!next_tqe_id)
- next_tqe_id++;
+ goto try_again;
+
+ /* Make sure the ID isn't already used */
+ for (ptr = timer_queue.next; ptr != &timer_queue; ptr = ptr->next)
+ if (ptr->id == next_tqe_id)
+ goto try_again;
return next_tqe_id;
}