As it happens, I'm not sure that NET_Timeout is ever called with timeout = 0.

A zero value for the socket option means block forever and there is no support
for polling in the API.

- Michael.

On 10/03/2020 18:21, Daniel Fuchs wrote:
Hi Vyom,

Now I have second thoughts. The documentation of poll(2) says:

       int poll(struct pollfd *fds, nfds_t nfds, int timeout);

       [...]

       Specifying a negative value in timeout means an infinite
       timeout.
       Specifying a timeout of zero causes poll() to return
       immediately, even if no file descriptors are ready.

As Michael hinted, are we sure that we are handling the
timeout=0 case properly?

Moreover, the timeout parameter is supposed to be an int.
I'd be more satisfied if we declared an int variable e.g.

   int timeoutms = timeout;

at about line 411, and then update it just after line 446:

   timeoutms = nanoTimeout / NET_NSEC_PER_MSEC

What do you think?

Also JDK-8179905 [1] also modified aix_close.c, solaris_close.c,
bsd_close.c [2] - so I believe you should also fix all these places.

best regards,

-- daniel

[1] https://bugs.openjdk.java.net/browse/JDK-8179905
[2] http://hg.openjdk.java.net/jdk10/jdk10/jdk/rev/cc195249c879

On 10/03/2020 16:53, Vyom Tewari26 wrote:
Hi Daniel,
Thanks for review and running all tests,  In past we(i am the culprit) removed the "if(timeout > 0) {" condition by mistake. This check is to make sure that if the timeout set only then we do all other time calculation but somehow it was not very clear by reading the code. NET_Timeout does not tells that there is infinite(-1) timeout as well, if you see the code changes I explicitly put else block to make code more readable. I hosted the patch to cr.openjdk.net(http://cr.openjdk.java.net/~vtewari/8237858/webrev/index.html).
Thanks,
Vyom

    ----- Original message -----
    From: Daniel Fuchs <daniel.fu...@oracle.com>
    To: Vyom Tewari26 <vtewa...@in.ibm.com>, net-dev@openjdk.java.net
    Cc:
    Subject: [EXTERNAL] Re: RFR 8237858: PlainSocketImpl.socketAccept()
    handles EINTR incorrectly
    Date: Tue, Mar 10, 2020 9:07 PM
    Hi Vyom,

    I have sent your proposed fix to our test system and observed no
    regression. I agree your proposed changes seem to address the
    issue adequately. However, I'd like to hear a second opinion on the
    possible side effects of this fix, since NET_Timeout may be called
    at many other places.

    I see that Alan has commented on
    https://bugs.openjdk.java.net/browse/JDK-8237858

    It would be good to get his approval (or at least Michael McMahon's)
    before pushing.

    best regards,

    -- daniel

    On 25/02/2020 16:36, Vyom Tewari26 wrote:
     > Hi ,
     > Please find the below fix for the
     > issue(https://bugs.openjdk.java.net/browse/JDK-8237858 ). In
     > "PlainSocketImpl_socketAccept" did not handle -1 timeout  properly.
     > In case of -1 timeout, "PlainSocketImpl_socketAccept" calls
     > "NET_Timeout"  if it is interrupted by signal(EINTR) then in case
    of -1
     > timeout it returns immediately instead of looping again.
     > Thanks,
     > Vyom
     > ##########################################################
     > diff -r d6b968af8b65 src/java.base/linux/native/libnet/linux_close.c      > --- a/src/java.base/linux/native/libnet/linux_close.c    Mon Feb 24
     > 23:44:29 2020 -0500
     > +++ b/src/java.base/linux/native/libnet/linux_close.c    Tue Feb 25
     > 19:06:11 2020 +0530
     > @@ -437,12 +437,16 @@
     >            * has expired return 0 (indicating timeout expired).
     >            */
     >           if (rv < 0 && errno == EINTR) {
     > -            jlong newNanoTime = JVM_NanoTime(env, 0);
     > -            nanoTimeout -= newNanoTime - prevNanoTime;
     > -            if (nanoTimeout < NET_NSEC_PER_MSEC) {
     > -                return 0;
     > +            if(timeout > 0) {
     > +                jlong newNanoTime = JVM_NanoTime(env, 0);
     > +                nanoTimeout -= newNanoTime - prevNanoTime;
     > +                if (nanoTimeout < NET_NSEC_PER_MSEC) {
     > +                    return 0;
     > +                }
     > +                prevNanoTime = newNanoTime;
     > +            } else {
     > +                continue; // timeout is -1, so  loop again.
     >               }
     > -            prevNanoTime = newNanoTime;
     >           } else {
     >               return rv;
     >           }
     >
     > ############################################################
     >



Reply via email to