Tweak the Timer implementation: first, schedule repeat expiration based on the current time, not when the timer was supposed to go off. Second, make 5 ms the minimum actual delay used on a timer. Third, Only pop one timer event off the queue in any Thane heartbeat. This last change is somewhere between audacious and questionable; it will definitely help prevent e.g. socket starvation and keep programmers honest. On the other hand it sacrifices some (admittedly bizarre) scenarios where multiple timers ought to fire simultaneously.
Tweak the Timer implementation: first, schedule repeat expiration based on the current time, not when the timer was supposed to go off. Second, make 5 ms the minimum actual delay used on a timer. Third, Only pop one timer event off the queue in any Thane heartbeat. This last change is somewhere between audacious and questionable; it will definitely help prevent e.g. socket starvation and keep programmers honest. On the other hand it sacrifices some (admittedly bizarre) scenarios where multiple timers ought to fire simultaneously.

greyhavens/thane,greyhavens/thane,greyhavens/thane,greyhavens/thane,greyhavens/thane,greyhavens/thane,greyhavens/thane