From ca4a0e850b9978104980ce980997f7a351376994 Mon Sep 17 00:00:00 2001 From: Anton Tiurin Date: Sun, 3 Jan 2021 18:01:44 +0000 Subject: [PATCH] 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 --- adapters/libuv.h | 8 ++++++++ 1 file changed, 8 insertions(+) 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);