Hi Yann,

Am 03.01.2018 um 11:07 schrieb Yann Ylavic:
On Wed, Jan 3, 2018 at 5:00 AM, Rainer Jung <rainer.j...@kippdata.de> wrote:

I did a check on Solaris 10 Sparc. Looks good as well:

Thanks Rainer, the PR is about Sparc so this is quite valuable return.
I first thought it was some concurrency issues (in mpm_event) specific
to Solaris Sparc until I found this..


- r1819856 (without the additional check and without the fix): no hang in
testpoll

- r1819857 (with the additional check but still without the fix): hangs in
testpoll in pollset_wakeup, more precisely in the new for loop in iteration
2 of 2 and there in the call to apr_pollset_wakeup().

Don't you mean that the hang was in the second call to apr_pollset_poll()?

Yes, sorry.

I don't really expect apr_pollset_wakeup() to block unless the pipe is
full, which'd be a capacity of one byte only here...

The hang was in the following stack:

(gdb) bt full
#0  0xff0cbcb4 in _portfs () from /lib/libc.so.1
No symbol table info available.
#1  0xff046230 in port_getn () from /lib/libc.so.1
No symbol table info available.
#2 0xff374b18 in call_port_getn (port=61, list=0x1aa418, max=2, nget=0xffbff558, timeout=-1) at .../poll/unix/port.c:110
        tv = {tv_sec = 0, tv_nsec = 0}
        tvptr = <optimized out>
        ret = <optimized out>
        rv = 0
#3 0xff374d34 in impl_pollset_poll (pollset=0x1aa3a8, timeout=<optimized out>, num=0xffbff634, descriptors=0xffbff638)
    at .../poll/unix/port.c:400
        fd = <optimized out>
        ret = <optimized out>
        i = <optimized out>
        j = <optimized out>
        nget = 1
        ep = <optimized out>
        rv = <optimized out>
        fp = <optimized out>
#4 0xff3743ac in apr_pollset_poll (pollset=0x1aa3a8, timeout=-1, num=num@entry=0xffbff634, descriptors=descriptors@entry=0xffbff638)
    at .../poll/unix/pollset.c:246
No locals.

=> So apr_pollset_poll()

#5 0x00028ffc in pollset_wakeup (tc=0xffbff6b0, data=0x0) at .../test/testpoll.c:805
        rv = <optimized out>
socket_pollfd = {p = 0xd1fd0, desc_type = APR_POLL_SOCKET, reqevents = 1, rtnevents = 1, desc = {f = 0x1c20c0, s = 0x1c20c0}, client_data = 0x1c20c0}
        pollset = 0x1aa3a8
        num = 0
        descriptors = 0x0
        i = 1

=> So i==1, second loop iteration

#6 0x000184d0 in abts_run_test (ts=ts@entry=0xd6dd8, f=0x28f64 <pollset_wakeup>, value=value@entry=0x0) at .../test/abts.c:171
        tc = {failed = 0, suite = 0xd6308}
        ss = 0xd6308
#7  0x000292e4 in testpoll (suite=0xd6dd8) at .../test/testpoll.c:956
No locals.
#8  0x00046944 in main (argc=2, argv=<optimized out>) at .../test/abts.c:429
        i = <optimized out>
        list_provided = <optimized out>
        suite = 0xd6dd8


- r1819858 (with the additional check and with the fix): no hang in testpoll

- r1819902 (head of trunk): no hang in testpoll

Thanks for finding and fixing this!

Happy new year,

Best wishes to all!


Regards,
Yann.

Reply via email to