Ensure that the following API functions always return either 0 or 1: * uv_is_active() * uv_is_closing() * uv_is_readable() * uv_is_writable()
Before this commit, creating an event loop, starting a timer and calling uv_run(UV_RUN_ONCE) blocked in uv_run() until the timer expired - but didn't actually run the timer.
This commit fixes two closely related integer overflow bugs: * Timers with a timeout > INT_MAX cause uv__next_timeout() to return a negative value. * Timers with very large timeouts (close or equal to ULLONG_MAX) run on the next tick. In both cases, clamp the values to prevent the overflow from happening. Fixes joyent/node#5101.
This commit changes how the event loop determines if it needs to stay alive. Previously, an internal counter was increased whenever a handle got created and decreased again when the handle was closed. While conceptually simple, it turned out hard to work with: you often want to keep the event loop alive only if the handle is actually doing something. Stopped or inactive handles were a frequent source of hanging event loops. That's why this commit changes the reference counting scheme to a model where a handle only references the event loop when it's active. 'Active' means different things for different handle types, e.g.: * timers: ticking * sockets: reading, writing or listening * processes: always active (for now, subject to change) * idle, check, prepare: only active when started This commit also changes how the uv_ref() and uv_unref() functions work: they now operate on the level of individual handles, not the whole event loop. The Windows implementation was done by Bert Belder.