Get a count of (active) timers in Node.js event loop
Asked Answered
O

1

6

Is there a way to make a call in Node.js to determine the number of timers in the event loop queue? I have a library with a number of timeouts and instead of keeping track of them myself using some sort of internal bookkeeping system, it would be nice if I could just ask V8 or Libuv or whatever, how many timers there are.

Is this possible?

Oneway answered 28/12, 2016 at 1:10 Comment(2)
Do you believe overwriting setTimeout method with a wrapper that manages a counter would fit your needs?Gridiron
@DavidRissatoCruz that might work, yeah, although, you'd also have to monkeypatch clearTimeout as wellOneway
T
3

it would be nice if I could just ask V8 or Libuv or whatever

You cannot directly ask libuv, but it certainly offers a way to know how many active timers are there.
To do that, you can invoke uv_walk with a valid loop to get all the active handles. Then you can check each handle with the given callback and count those for which the data member type (that has type uv_handle_type) is equal to UV_TIMER.
The result is the number of active timers.

See the documentation for further details about the handle data structure.


As a trivial example, consider the following structure:

struct Counter {
    static int count;

    static void callback(uv_handle_t* handle, void*) {
        if(handle.type == uv_handle_type::UV_TIMER) count++;
    }
};

You can use it as it follows:

Counter::count = 0;
uv_walk(my_loop_ptr, &Counter::callback);
// Counter::count indicates how many active timers are running on the loop

Of course, this is not a production-ready code. Anyway, I hope it gives an idea of the proposed solution.


See here for the libuv documentation.

Tyree answered 28/12, 2016 at 21:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.