diff options
author | Yann Ylavic <ylavic@apache.org> | 2018-01-02 17:28:53 +0000 |
---|---|---|
committer | Yann Ylavic <ylavic@apache.org> | 2018-01-02 17:28:53 +0000 |
commit | 20ac05a4870a1ec86b38e7f0c20b9212cb511bc1 (patch) | |
tree | e0051536ee91468c9a6abb37982a80a7876a0fa4 /poll | |
parent | e1daecaefc8aa2c77b9258444c2ad213c0ad0318 (diff) | |
download | apr-20ac05a4870a1ec86b38e7f0c20b9212cb511bc1.tar.gz |
poll, port: re-add the wakeup pipe to the pollset after it triggered.
Just like user fds (file, socket), otherwise it's one shot only (PR-61786).
Corresponding test committed in r1819857.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1819858 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'poll')
-rw-r--r-- | poll/unix/port.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/poll/unix/port.c b/poll/unix/port.c index a436f62d8..8e2894f48 100644 --- a/poll/unix/port.c +++ b/poll/unix/port.c @@ -358,7 +358,6 @@ static apr_status_t impl_pollset_poll(apr_pollset_t *pollset, unsigned int nget; pfd_elem_t *ep; apr_status_t rv = APR_SUCCESS; - apr_pollfd_t fp; *num = 0; nget = 1; @@ -409,32 +408,30 @@ static apr_status_t impl_pollset_poll(apr_pollset_t *pollset, pollset_lock_rings(); for (i = 0, j = 0; i < nget; i++) { - fp = (((pfd_elem_t*)(pollset->p->port_set[i].portev_user))->pfd); + ep = (pfd_elem_t *)pollset->p->port_set[i].portev_user; if ((pollset->flags & APR_POLLSET_WAKEABLE) && - fp.desc_type == APR_POLL_FILE && - fp.desc.f == pollset->wakeup_pipe[0]) { + ep->pfd.desc_type == APR_POLL_FILE && + ep->pfd.desc.f == pollset->wakeup_pipe[0]) { apr_poll_drain_wakeup_pipe(pollset->wakeup_pipe); rv = APR_EINTR; } else { - pollset->p->result_set[j] = fp; + pollset->p->result_set[j] = ep->pfd; pollset->p->result_set[j].rtnevents = get_revent(pollset->p->port_set[i].portev_events); - - /* If the ring element is still on the query ring, move it - * to the add ring for re-association with the event port - * later. (It may have already been moved to the dead ring - * by a call to pollset_remove on another thread.) - */ - ep = (pfd_elem_t *)pollset->p->port_set[i].portev_user; - if (ep->on_query_ring) { - APR_RING_REMOVE(ep, link); - ep->on_query_ring = 0; - APR_RING_INSERT_TAIL(&(pollset->p->add_ring), ep, - pfd_elem_t, link); - } j++; } + /* If the ring element is still on the query ring, move it + * to the add ring for re-association with the event port + * later. (It may have already been moved to the dead ring + * by a call to pollset_remove on another thread.) + */ + if (ep->on_query_ring) { + APR_RING_REMOVE(ep, link); + ep->on_query_ring = 0; + APR_RING_INSERT_TAIL(&(pollset->p->add_ring), ep, + pfd_elem_t, link); + } } pollset_unlock_rings(); if ((*num = j)) { /* any event besides wakeup pipe? */ |