From ed46d2eaca4f95c933a696c6f5c37e4aa3e49f29 Mon Sep 17 00:00:00 2001 From: Riza Sulistyo Date: Wed, 27 Apr 2022 10:10:23 +0700 Subject: [PATCH] Always re-arm ioqueue for events on pj_ioqueue_poll() (#3018) --- pjlib/src/pj/ioqueue_epoll.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/pjlib/src/pj/ioqueue_epoll.c b/pjlib/src/pj/ioqueue_epoll.c index fb57d7a41..a18d284c3 100644 --- a/pjlib/src/pj/ioqueue_epoll.c +++ b/pjlib/src/pj/ioqueue_epoll.c @@ -692,6 +692,7 @@ PJ_DEF(int) pj_ioqueue_poll( pj_ioqueue_t *ioqueue, const pj_time_val *timeout) pj_lock_acquire(ioqueue->lock); for (event_cnt=0, i=0; igrp_lock) @@ -787,23 +797,33 @@ PJ_DEF(int) pj_ioqueue_poll( pj_ioqueue_t *ioqueue, const pj_time_val *timeout) /* Just do not exceed PJ_IOQUEUE_MAX_EVENTS_IN_SINGLE_POLL */ if (processed_cnt < PJ_IOQUEUE_MAX_EVENTS_IN_SINGLE_POLL) { + pj_bool_t event_done = PJ_FALSE; switch (queue[i].event_type) { case READABLE_EVENT: - if (ioqueue_dispatch_read_event(ioqueue, queue[i].key)) - ++processed_cnt; + event_done = ioqueue_dispatch_read_event(ioqueue,queue[i].key); + break; case WRITEABLE_EVENT: - if (ioqueue_dispatch_write_event(ioqueue, queue[i].key)) - ++processed_cnt; + event_done = ioqueue_dispatch_write_event(ioqueue, + queue[i].key); + break; case EXCEPTION_EVENT: - if (ioqueue_dispatch_exception_event(ioqueue, queue[i].key)) - ++processed_cnt; + event_done = ioqueue_dispatch_exception_event(ioqueue, + queue[i].key); break; case NO_EVENT: pj_assert(!"Invalid event!"); break; } + if (event_done) { + ++processed_cnt; + } else { + pj_ioqueue_lock_key(queue[i].key); + ioqueue_remove_from_set(ioqueue, queue[i].key, + queue[i].event_type); + pj_ioqueue_unlock_key(queue[i].key); + } } #if PJ_IOQUEUE_HAS_SAFE_UNREG