summaryrefslogtreecommitdiff
path: root/poll
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2018-01-02 17:28:53 +0000
committerYann Ylavic <ylavic@apache.org>2018-01-02 17:28:53 +0000
commit20ac05a4870a1ec86b38e7f0c20b9212cb511bc1 (patch)
treee0051536ee91468c9a6abb37982a80a7876a0fa4 /poll
parente1daecaefc8aa2c77b9258444c2ad213c0ad0318 (diff)
downloadapr-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.c33
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? */