summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tiurin <atiurin@twitter.com>2021-01-03 18:01:44 +0000
committerMichael Grunder <michael.grunder@gmail.com>2022-09-01 12:37:30 -0700
commitca4a0e850b9978104980ce980997f7a351376994 (patch)
treeac454813be5432e5903d8d87117d6fe027cab41d
parent35d398c903021f9d6827c06e1b9c799b6dad4d07 (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.h8
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);