Possible scheduler bug
I was browsing the source in old [GitHub repo](https://github.com/inolen/redream) and have found a potential bug in the [scheduler](https://github.com/inolen/redream/blob/master/src/guest/scheduler.c).
I realise there is a very good chance that this code has been rewritten behind the scenes, but I thought I should raise it in case.
It looks like clients can hold pointers to expired and recycled timers.
Example:
1. Client A schedules a timer and holds the returned pointer to Timer N
2. Timer N expires during tick(). It is cancelled internally and added to the free list.
3. Client A now holds a pointer to a cancelled timer. The cancel API is robust against cancelling it again via the active flag. However, client A does not cancel the timer.
4. Client B schedules a timer and is returned a pointer to recycled timer N
5. Now clients A and B both hold a pointer to the same timer.
6. Client A cancels timer N
7. Client B's timer never expires and the associated callback is never called.
One possible solution is to return unique IDs instead of pointers, which could incorporate a generation index.
Great project. Hope you plan to release the source again sometime!
issue