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) | |
| download | hiredict-ca4a0e850b9978104980ce980997f7a351376994.tar.xz | |
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); | 
