diff options
author | Anton Tiurin <atiurin@twitter.com> | 2021-01-03 18:01:44 +0000 |
---|---|---|
committer | Michael Grunder <michael.grunder@gmail.com> | 2022-09-01 12:37:30 -0700 |
commit | ca4a0e850b9978104980ce980997f7a351376994 (patch) | |
tree | ac454813be5432e5903d8d87117d6fe027cab41d | |
parent | 35d398c903021f9d6827c06e1b9c799b6dad4d07 (diff) |
uvadapter: reduce number of uv_poll_start calls
Internally uv_poll_start iterates over all
attached event handlers to update event mask. It's
quite expensive operation if there many event handlers attached
to a loop.
As redisLibuvEvents.events is a copy of what libuv should see,
we can rely on it to avoid event mask updates.
Signed-off-by: Anton Tiurin <noxiouz@yandex.ru>
-rw-r--r-- | adapters/libuv.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/adapters/libuv.h b/adapters/libuv.h index df0a845..268edab 100644 --- a/adapters/libuv.h +++ b/adapters/libuv.h @@ -30,6 +30,10 @@ static void redisLibuvPoll(uv_poll_t* handle, int status, int events) { static void redisLibuvAddRead(void *privdata) { redisLibuvEvents* p = (redisLibuvEvents*)privdata; + if (p->events & UV_READABLE) { + return; + } + p->events |= UV_READABLE; uv_poll_start(&p->handle, p->events, redisLibuvPoll); @@ -52,6 +56,10 @@ static void redisLibuvDelRead(void *privdata) { static void redisLibuvAddWrite(void *privdata) { redisLibuvEvents* p = (redisLibuvEvents*)privdata; + if (p->events & UV_WRITABLE) { + return; + } + p->events |= UV_WRITABLE; uv_poll_start(&p->handle, p->events, redisLibuvPoll); |