You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by yl...@apache.org on 2018/01/03 09:50:41 UTC

svn commit: r1819938 - in /apr/apr/branches/1.6.x: ./ poll/unix/epoll.c poll/unix/kqueue.c poll/unix/port.c test/testpoll.c

Author: ylavic
Date: Wed Jan  3 09:50:41 2018
New Revision: 1819938

URL: http://svn.apache.org/viewvc?rev=1819938&view=rev
Log:
Merge r1819857, r1819858, r1819860, r1819861, r1819934, r1819935 from trunk:

testpoll: check that the wakeup pipe is still in the pollset after returning
from poll(), e.g. APR_POLLSET_PORT should re-arm it automatically.



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.



poll, port: no need to release and re-acquire the lock in between walking the
pollset and handling the dead ring, all is simple/fast/nonblocking ops.

Also, set types of "i" and "j" respectively to the ones of nget and *num.



poll, port: follow up to r1819860.

This test is redundant now, axe it (no functional change).



poll, kqueue: save a pollfd (mem)copy per returned event.



poll, epoll: pollset's pfd is not modified on poll(), mark it const.


Reviewed/backported by: ylavic

Modified:
    apr/apr/branches/1.6.x/   (props changed)
    apr/apr/branches/1.6.x/poll/unix/epoll.c
    apr/apr/branches/1.6.x/poll/unix/kqueue.c
    apr/apr/branches/1.6.x/poll/unix/port.c
    apr/apr/branches/1.6.x/test/testpoll.c

Propchange: apr/apr/branches/1.6.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jan  3 09:50:41 2018
@@ -1,6 +1,6 @@
 /apr/apr/branches/1.4.x:1003369,1101301
 /apr/apr/branches/1.5.x:1775071
 /apr/apr/branches/1.7.x:1809650
-/apr/apr/trunk:733052,739635,741862,741866-741867,741869,741871,745763-745764,746310,747990,748080,748361,748371,748565,748888,748902,748988,749810,760443,767895,775683,782838,783398,783958,784633,784773,788588,789050,793192-793193,794118,794485,795267,799497,800627,809745,809854,810472,811455,813063,821306,829490,831641,832904,835607,888669,892028,892159,892435,892909,896382,896653,899905,901088,902077,902090,908427,910419,910597,917819,917837-917838,923311,923320,925965,929796,931973,932585,951771,960665,960671,979891,983618,989450,990435,1003338,1044440,1044447,1055657,1072165,1078845,1081462,1081495,1083038,1083242,1084662,1086695,1088023,1089031,1089129,1089438,1099348,1103310,1183683,1183685-1183686,1183688,1183693,1183698,1213382,1235047,1236970,1237078,1237507,1240472,1340286,1340288,1340470,1341193,1341196,1343233,1343243,1367050,1368819,1370494,1372018,1372022,1372093,1372849,1376957,1384764,1389077,1400200,1402868,1405985,1406690,1420106,1420109,1425356,1428809,1438940,14
 38957-1438959,1442903,1449568,1456418,1459994,1460179-1460180,1460241,1460399,1460405,1462738,1462813,1470186,1470348,1475509,1478905,1480067,1481262,1481265,1484271,1487796,1489517,1496407,1502804,1510354,1516261,1523384,1523479,1523484,1523505,1523521,1523604,1523613,1523615,1523844-1523845,1523853,1524014,1524031,1528797,1528809,1529488,1529495,1529515,1529521,1529668,1530786,1530800,1530988,1531554,1531768,1531884,1532022,1533104,1533111,1533979,1535027,1535157,1536744,1538171,1539374,1539389,1539455,1539603,1541054,1541061,1541486,1541655,1541666,1541744,1542601,1542779,1543033,1543056,1548575,1550907,1551650,1551659,1558905,1559382,1559873,1559975,1561040,1561260,1561265,1561321,1561347,1561356,1561361,1561394,1561555,1571894,1575509,1578420,1587045,1587063,1587543,1587545,1588878,1588937,1589982,1593611,1593614-1593615,1593680,1594684,1594708,1595549,1597797,1597803,1604590,1604596,1604598,1605104,1610854,1611023,1611107,1611110,1611117,1611120,1611125,1611184,1611193,1611466
 ,1611515,1611517,1625173,1626564,1634615,1642159,1648830,1664406,1664447,1664451,1664471,1664769-1664770,1664775,1664904,1664911,1664958,1666341,1666411,1666458,1666611,1667420-1667421,1667423,1667914-1667916,1671329,1671356,1671386,1671389,1671513-1671514,1671957,1672354,1672366,1672495,1672575,1675644,1675656,1675668,1676013,1683521,1685929,1696140,1696767,1722547,1722557,1726928,1727020,1727160,1727175,1727199,1728957,1733451,1733594,1733694,1733706,1733708,1733775,1734816,1736552,1738791,1738925,1750374,1755709,1755740,1755746,1755758,1755954,1762326,1774712,1775069,1776994,1776998,1788334,1788337,1788929,1789947,1789998,1790200,1791598,1798105,1805380,1808039,1808836,1809649,1809753,1810450,1810452,1813286
+/apr/apr/trunk:733052,739635,741862,741866-741867,741869,741871,745763-745764,746310,747990,748080,748361,748371,748565,748888,748902,748988,749810,760443,767895,775683,782838,783398,783958,784633,784773,788588,789050,793192-793193,794118,794485,795267,799497,800627,809745,809854,810472,811455,813063,821306,829490,831641,832904,835607,888669,892028,892159,892435,892909,896382,896653,899905,901088,902077,902090,908427,910419,910597,917819,917837-917838,923311,923320,925965,929796,931973,932585,951771,960665,960671,979891,983618,989450,990435,1003338,1044440,1044447,1055657,1072165,1078845,1081462,1081495,1083038,1083242,1084662,1086695,1088023,1089031,1089129,1089438,1099348,1103310,1183683,1183685-1183686,1183688,1183693,1183698,1213382,1235047,1236970,1237078,1237507,1240472,1340286,1340288,1340470,1341193,1341196,1343233,1343243,1367050,1368819,1370494,1372018,1372022,1372093,1372849,1376957,1384764,1389077,1400200,1402868,1405985,1406690,1420106,1420109,1425356,1428809,1438940,14
 38957-1438959,1442903,1449568,1456418,1459994,1460179-1460180,1460241,1460399,1460405,1462738,1462813,1470186,1470348,1475509,1478905,1480067,1481262,1481265,1484271,1487796,1489517,1496407,1502804,1510354,1516261,1523384,1523479,1523484,1523505,1523521,1523604,1523613,1523615,1523844-1523845,1523853,1524014,1524031,1528797,1528809,1529488,1529495,1529515,1529521,1529668,1530786,1530800,1530988,1531554,1531768,1531884,1532022,1533104,1533111,1533979,1535027,1535157,1536744,1538171,1539374,1539389,1539455,1539603,1541054,1541061,1541486,1541655,1541666,1541744,1542601,1542779,1543033,1543056,1548575,1550907,1551650,1551659,1558905,1559382,1559873,1559975,1561040,1561260,1561265,1561321,1561347,1561356,1561361,1561394,1561555,1571894,1575509,1578420,1587045,1587063,1587543,1587545,1588878,1588937,1589982,1593611,1593614-1593615,1593680,1594684,1594708,1595549,1597797,1597803,1604590,1604596,1604598,1605104,1610854,1611023,1611107,1611110,1611117,1611120,1611125,1611184,1611193,1611466
 ,1611515,1611517,1625173,1626564,1634615,1642159,1648830,1664406,1664447,1664451,1664471,1664769-1664770,1664775,1664904,1664911,1664958,1666341,1666411,1666458,1666611,1667420-1667421,1667423,1667914-1667916,1671329,1671356,1671386,1671389,1671513-1671514,1671957,1672354,1672366,1672495,1672575,1675644,1675656,1675668,1676013,1683521,1685929,1696140,1696767,1722547,1722557,1726928,1727020,1727160,1727175,1727199,1728957,1733451,1733594,1733694,1733706,1733708,1733775,1734816,1736552,1738791,1738925,1750374,1755709,1755740,1755746,1755758,1755954,1762326,1774712,1775069,1776994,1776998,1788334,1788337,1788929,1789947,1789998,1790200,1791598,1798105,1805380,1808039,1808836,1809649,1809753,1810450,1810452,1813286,1819857-1819858,1819860-1819861,1819934-1819935
 /apr/apr/trunk/test/testnames.c:1460405
 /httpd/httpd/trunk:1604590

Modified: apr/apr/branches/1.6.x/poll/unix/epoll.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/poll/unix/epoll.c?rev=1819938&r1=1819937&r2=1819938&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/poll/unix/epoll.c (original)
+++ apr/apr/branches/1.6.x/poll/unix/epoll.c Wed Jan  3 09:50:41 2018
@@ -274,7 +274,7 @@ static apr_status_t impl_pollset_poll(ap
     }
     else {
         int i, j;
-        apr_pollfd_t *fdptr;
+        const apr_pollfd_t *fdptr;
 
         for (i = 0, j = 0; i < ret; i++) {
             if (pollset->flags & APR_POLLSET_NOCOPY) {

Modified: apr/apr/branches/1.6.x/poll/unix/kqueue.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/poll/unix/kqueue.c?rev=1819938&r1=1819937&r2=1819938&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/poll/unix/kqueue.c (original)
+++ apr/apr/branches/1.6.x/poll/unix/kqueue.c Wed Jan  3 09:50:41 2018
@@ -257,7 +257,6 @@ static apr_status_t impl_pollset_poll(ap
     int ret;
     struct timespec tv, *tvptr;
     apr_status_t rv = APR_SUCCESS;
-    apr_pollfd_t fd;
 
     *num = 0;
 
@@ -280,17 +279,18 @@ static apr_status_t impl_pollset_poll(ap
     }
     else {
         int i, j;
+        const apr_pollfd_t *fd;
 
         for (i = 0, j = 0; i < ret; i++) {
-            fd = (((pfd_elem_t *)(pollset->p->ke_set[i].udata))->pfd);
+            fd = &((pfd_elem_t *)pollset->p->ke_set[i].udata)->pfd;
             if ((pollset->flags & APR_POLLSET_WAKEABLE) &&
-                fd.desc_type == APR_POLL_FILE &&
-                fd.desc.f == pollset->wakeup_pipe[0]) {
+                fd->desc_type == APR_POLL_FILE &&
+                fd->desc.f == pollset->wakeup_pipe[0]) {
                 apr_poll_drain_wakeup_pipe(pollset->wakeup_pipe);
                 rv = APR_EINTR;
             }
             else {
-                pollset->p->result_set[j] = fd;
+                pollset->p->result_set[j] = *fd;
                 pollset->p->result_set[j].rtnevents =
                         get_kqueue_revent(pollset->p->ke_set[i].filter,
                                           pollset->p->ke_set[i].flags);

Modified: apr/apr/branches/1.6.x/poll/unix/port.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/poll/unix/port.c?rev=1819938&r1=1819937&r2=1819938&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/poll/unix/port.c (original)
+++ apr/apr/branches/1.6.x/poll/unix/port.c Wed Jan  3 09:50:41 2018
@@ -354,11 +354,11 @@ static apr_status_t impl_pollset_poll(ap
                                       const apr_pollfd_t **descriptors)
 {
     apr_os_sock_t fd;
-    int ret, i, j;
-    unsigned int nget;
+    int ret;
+    unsigned int nget, i;
+    apr_int32_t j;
     pfd_elem_t *ep;
     apr_status_t rv = APR_SUCCESS;
-    apr_pollfd_t fp;
 
     *num = 0;
     nget = 1;
@@ -404,48 +404,40 @@ static apr_status_t impl_pollset_poll(ap
        port_associate within apr_pollset_add() */
     apr_atomic_dec32(&pollset->p->waiting);
 
-    if (nget) {
-
-        pollset_lock_rings();
+    pollset_lock_rings();
 
-        for (i = 0, j = 0; i < nget; i++) {
-            fp = (((pfd_elem_t*)(pollset->p->port_set[i].portev_user))->pfd);
-            if ((pollset->flags & APR_POLLSET_WAKEABLE) &&
-                fp.desc_type == APR_POLL_FILE &&
-                fp.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].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++;
-            }
-        }
-        pollset_unlock_rings();
-        if ((*num = j)) { /* any event besides wakeup pipe? */
-            rv = APR_SUCCESS;
-            if (descriptors) {
-                *descriptors = pollset->p->result_set;
-            }
+    for (i = 0, j = 0; i < nget; i++) {
+        ep = (pfd_elem_t *)pollset->p->port_set[i].portev_user;
+        if ((pollset->flags & APR_POLLSET_WAKEABLE) &&
+            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] = ep->pfd;
+            pollset->p->result_set[j].rtnevents =
+                get_revent(pollset->p->port_set[i].portev_events);
+            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);
+        }
+    }
+    if ((*num = j)) { /* any event besides wakeup pipe? */
+        rv = APR_SUCCESS;
+        if (descriptors) {
+            *descriptors = pollset->p->result_set;
         }
     }
-
-    pollset_lock_rings();
 
     /* Shift all PFDs in the Dead Ring to the Free Ring */
     APR_RING_CONCAT(&(pollset->p->free_ring), &(pollset->p->dead_ring), pfd_elem_t, link);

Modified: apr/apr/branches/1.6.x/test/testpoll.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/test/testpoll.c?rev=1819938&r1=1819937&r2=1819938&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/test/testpoll.c (original)
+++ apr/apr/branches/1.6.x/test/testpoll.c Wed Jan  3 09:50:41 2018
@@ -783,6 +783,7 @@ static void pollset_wakeup(abts_case *tc
     apr_pollset_t *pollset;
     apr_int32_t num;
     const apr_pollfd_t *descriptors;
+    int i;
 
     rv = apr_pollset_create_ex(&pollset, 1, p, APR_POLLSET_WAKEABLE,
                                default_pollset_impl);
@@ -792,12 +793,18 @@ static void pollset_wakeup(abts_case *tc
     }
     ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
 
-    /* send wakeup but no data; apr_pollset_poll() should return APR_EINTR */
-    rv = apr_pollset_wakeup(pollset);
-    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+    /* Send wakeup but no data; apr_pollset_poll() should return APR_EINTR.
+     * Do it twice to test implementations that need to re-arm the events after
+     * poll()ing (e.g. APR_POLLSET_PORT), hence verify that the wakeup pipe is
+     * still in the place afterward.
+     */
+    for (i = 0; i < 2; ++i) {
+        rv = apr_pollset_wakeup(pollset);
+        ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
 
-    rv = apr_pollset_poll(pollset, -1, &num, &descriptors);
-    ABTS_INT_EQUAL(tc, APR_EINTR, rv);
+        rv = apr_pollset_poll(pollset, -1, &num, &descriptors);
+        ABTS_INT_EQUAL(tc, APR_EINTR, rv);
+    }
 
     /* send wakeup and data; apr_pollset_poll() should return APR_SUCCESS */
     socket_pollfd.desc_type = APR_POLL_SOCKET;