On Sun, 2007-06-03 at 18:13 +0300, Timo Sirainen wrote:
Maybe the optimal solution would be to create a new abstraction layer. Most of the timeout handlers are just checking for idle timeouts.
struct idle_timeout *idle_timeout_new(unsigned int secs, timeout_callback_t *callback, void *context); void idle_timeout_free(struct idle_timeout *idle); void idle_timeout_reset(struct idle_timeout *idle);
The code would internally keep just one timeout handler and whenever it's called, calculate the new time when it should be called.
..Or maybe just fix the basic timeout_*() API. Add a new timeout_reset() call == timeout_remove() + timeout_add(original values) and then make the implementation be fast with hundreds of timeouts. The timeouts are currently kept in linked list, so that could be changed to red-black tree I guess (sorted by next execution time). Or is there a better data structure for this?