I found some more differences between trunk and r1736521 in 1.6.x which
are all due to incomplete backports of changes applied to trunk after
r899905. I backported all of those because they seemed applicable for
1.6.x. At least the poll directory, testpoll.c, apr_poll.h and
arch/unix/apr_arch_poll_private.h are now in sync between trunk and 1.6.x.
Regards,
Rainer
Am 09.08.2016 um 23:31 schrieb Rainer Jung:
Am 25.03.2016 um 02:19 schrieb minf...@apache.org:
Author: minfrin
Date: Fri Mar 25 01:19:34 2016
New Revision: 1736521
URL: http://svn.apache.org/viewvc?rev=1736521&view=rev
Log:
Add apr_pollcb_wakeup(), with similar behavior to
apr_pollset_wakeup(). Add apr_pollcb_method_name(), with similar
behavior to apr_pollset_method_name().
...
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=1736521&r1=1736520&r2=1736521&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/poll/unix/port.c (original)
+++ apr/apr/branches/1.6.x/poll/unix/port.c Fri Mar 25 01:19:34 2016
@@ -413,7 +413,7 @@ static apr_status_t impl_pollset_poll(ap
if ((pollset->flags & APR_POLLSET_WAKEABLE) &&
fp.desc_type == APR_POLL_FILE &&
fp.desc.f == pollset->wakeup_pipe[0]) {
- apr_pollset_drain_wakeup_pipe(pollset);
+ apr_poll_drain_wakeup_pipe(pollset->wakeup_pipe);
rv = APR_EINTR;
}
else {
@@ -466,9 +466,8 @@ static apr_pollset_provider_t impl = {
apr_pollset_provider_t *apr_pollset_provider_port = &impl;
-static apr_status_t cb_cleanup(void *p_)
+static apr_status_t impl_pollcb_cleanup(apr_pollcb_t *pollcb)
{
- apr_pollcb_t *pollcb = (apr_pollcb_t *) p_;
close(pollcb->fd);
return APR_SUCCESS;
}
@@ -505,7 +504,6 @@ static apr_status_t impl_pollcb_create(a
}
pollcb->pollset.port = apr_palloc(p, size * sizeof(port_event_t));
- apr_pool_cleanup_register(p, pollcb, cb_cleanup,
apr_pool_cleanup_null);
return APR_SUCCESS;
}
@@ -558,16 +556,25 @@ static apr_status_t impl_pollcb_poll(apr
apr_pollcb_cb_t func,
void *baton)
{
- apr_pollfd_t *pollfd;
apr_status_t rv;
- unsigned int i, nget = 1;
+ unsigned int nget = 1;
rv = call_port_getn(pollcb->fd, pollcb->pollset.port,
pollcb->nalloc,
&nget, timeout);
if (nget) {
+ unsigned int i;
+
for (i = 0; i < nget; i++) {
- pollfd = (apr_pollfd_t
*)(pollcb->pollset.port[i].portev_user);
+ apr_pollfd_t *pollfd = (apr_pollfd_t
*)(pollcb->pollset.port[i].portev_user);
+
+ if ((pollfd->flags & APR_POLLSET_WAKEABLE) &&
+ pollfd->desc_type == APR_POLL_FILE &&
+ pollfd->desc.f == pollcb->wakeup_pipe[0]) {
+ apr_poll_drain_wakeup_pipe(pollcb->wakeup_pipe);
+ return APR_EINTR;
+ }
+
pollfd->rtnevents =
get_revent(pollcb->pollset.port[i].portev_events);
rv = func(baton, pollfd);
@@ -586,6 +593,7 @@ static apr_pollcb_provider_t impl_cb = {
impl_pollcb_add,
impl_pollcb_remove,
impl_pollcb_poll,
+ impl_pollcb_cleanup,
"port"
};
I get a compilation error (ggc on Solaris):
.../poll/unix/port.c: In function 'impl_pollcb_poll':
.../poll/unix/port.c:571:24: error: 'apr_pollfd_t' has no member named
'flags'
if ((pollfd->flags & APR_POLLSET_WAKEABLE) &&
^
Maybe the following patch is appropriate?
--- poll/unix/port.c (revision 1755647)
+++ poll/unix/port.c (working copy)
@@ -568,7 +568,7 @@
for (i = 0; i < nget; i++) {
apr_pollfd_t *pollfd = (apr_pollfd_t
*)(pollcb->pollset.port[i].portev_user);
- if ((pollfd->flags & APR_POLLSET_WAKEABLE) &&
+ if ((pollcb->flags & APR_POLLSET_WAKEABLE) &&
pollfd->desc_type == APR_POLL_FILE &&
pollfd->desc.f == pollcb->wakeup_pipe[0]) {
apr_poll_drain_wakeup_pipe(pollcb->wakeup_pipe);
At least it builds and "make check" runs fine.
Regards,
Rainer