Vyom, > On 13 Sep 2016, at 04:00, Vyom Tewari <vyom.tew...@oracle.com> wrote: > > any comment on latest > webrev(http://cr.openjdk.java.net/~vtewari/8075484/webrev0.5/index.html) ?
I am happy with the way this change turned out. Reviewed. Trivially, before you push, just add a space to the four OS specific versions of Net_Timeout0, as follows: NET_Timeout0(int s, long timeout, long currentTime) ^^^ Thanks, -Chris. > Vyom > > On Thursday 08 September 2016 03:13 PM, Vyom Tewari wrote: >> >> On Thursday 08 September 2016 02:50 PM, Langer, Christoph wrote: >>> Hi Vyom, >>> >>> this looks good. >>> >>> Is there any particular reason why NET_ReadWithTimeout should remain in >>> SocketInputStream.c and not also move to net_util_md.c? That way you could >>> also have a "static long getCurrentTime()" inside net_util_md.c, instead of >>> an exported NET_GetCurrentTime(). >>> >> I thought this "NET_ReadWithTimeou" is specific to SocketInputStream so i >> will be good if we put this method to socketinputstream.c. >> >> In future we will in using the monotonic increasing clock so >> "NET_GetCurrentTime()" will help , Just change the implementation you are >> done. >> >> Vyom >>> >>> And no "#include <sys/time.h>" would be needed in SocketInputStream.c - >>> maybe not even now as it is. >>> >>> Best regards >>> Christoph >>> >>> >>>> -----Original Message----- >>>> From: Vyom Tewari [ >>>> mailto:vyom.tew...@oracle.com >>>> ] >>>> Sent: Donnerstag, 8. September 2016 05:20 >>>> To: Langer, Christoph >>>> <christoph.lan...@sap.com> >>>> >>>> Cc: >>>> net-dev@openjdk.java.net >>>> >>>> Subject: Re: RFR 8075484:SocketInputStream.socketRead0 can hang even with >>>> soTimeout set >>>> >>>> Hi All, >>>> >>>> Please find the latest >>>> webrev( >>>> http://cr.openjdk.java.net/~vtewari/8075484/webrev0.5/index.html >>>> <http://cr.openjdk.java.net/%7Evtewari/8075484/webrev0.5/index.html> >>>> ). >>>> >>>> I fixed the AIX flag issue and move some come common code to >>>> "net_util_md.c" file. >>>> >>>> Thanks, >>>> Vyom >>>> >>>> On 9/8/2016 12:32 PM, Langer, Christoph wrote: >>>> >>>>> Hi Vyom, >>>>> >>>>> ok, thanks. I have one addition to my proposal: I don't think there's a >>>>> need for >>>>> >>>> a global NET_GetCurrentTime function. This one should probably be a static >>>> function inside net_util_md.c (static long getCurrentTime()). >>>> >>>>> Best >>>>> Christoph >>>>> >>>>> >>>>>> -----Original Message----- >>>>>> From: Vyom Tewari [ >>>>>> mailto:vyom.tew...@oracle.com >>>>>> ] >>>>>> Sent: Mittwoch, 7. September 2016 18:31 >>>>>> To: Langer, Christoph >>>>>> <christoph.lan...@sap.com> >>>>>> >>>>>> Cc: >>>>>> net-dev@openjdk.java.net; Chris Hegarty <chris.hega...@oracle.com> >>>>>> >>>>>> Subject: Re: RFR 8075484:SocketInputStream.socketRead0 can hang even >>>>>> >>>> with >>>> >>>>>> soTimeout set >>>>>> >>>>>> Hi Chris, >>>>>> >>>>>> Sorry I was mostly focusing on our test failure first, i will check >>>>>> your suggestions. >>>>>> >>>>>> Thanks, >>>>>> >>>>>> Vyom >>>>>> >>>>>> >>>>>> On Wednesday 07 September 2016 08:44 PM, Langer, Christoph wrote: >>>>>> >>>>>>> Hi Vyom, >>>>>>> >>>>>>> did you have a look at my suggestions regarding AIX and refactoring? I >>>>>>> >>>> can't >>>> >>>>>> find none of it in the new webrev nor did you comment on it. >>>>>> >>>>>>> Best regards >>>>>>> Christoph >>>>>>> >>>>>>> >>>>>>>> -----Original Message----- >>>>>>>> From: net-dev [ >>>>>>>> mailto:net-dev-boun...@openjdk.java.net >>>>>>>> ] On Behalf Of >>>>>>>> >>>>>> Vyom >>>>>> >>>>>>>> Tewari >>>>>>>> Sent: Mittwoch, 7. September 2016 17:10 >>>>>>>> To: Chris Hegarty >>>>>>>> <chris.hega...@oracle.com> >>>>>>>> >>>>>>>> Cc: >>>>>>>> net-dev@openjdk.java.net >>>>>>>> >>>>>>>> Subject: Re: RFR 8075484:SocketInputStream.socketRead0 can hang even >>>>>>>> >>>>>> with >>>>>> >>>>>>>> soTimeout set >>>>>>>> >>>>>>>> Hi All, >>>>>>>> >>>>>>>> Please find the latest >>>>>>>> >>>>>>>> >>>> webrev(http://cr.openjdk.java.net/~vtewari/8075484/webrev0.4/index.html >>>> <http://cr.openjdk.java.net/%7Evtewari/8075484/webrev0.4/index.html> >>>> ). >>>> >>>>>>>> there were some test failures in JPRT and Chris also pointed the same >>>>>>>> issue in modified code. Now with latest code JPRT is clean. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> >>>>>>>> Vyom >>>>>>>> >>>>>>>> >>>>>>>> On Wednesday 07 September 2016 03:18 PM, Chris Hegarty wrote: >>>>>>>> >>>>>>>>> On 07/09/16 07:45, Vyom Tewari wrote: >>>>>>>>> >>>>>>>>>> Hi Chris, >>>>>>>>>> >>>>>>>>>> Please find the latest >>>>>>>>>> >>>>>>>>>> >>>>>> webrev(http://cr.openjdk.java.net/~vtewari/8075484/webrev0.3/index.html >>>>>> <http://cr.openjdk.java.net/%7Evtewari/8075484/webrev0.3/index.html> >>>>>> ). I >>>>>> >>>>>>>>>> did some code refactoring, JPRT is in progress. >>>>>>>>>> >>>>>>>>> In terms of NET_Timeout**, I'm happy with this version, but I >>>>>>>>> have an additional comment. >>>>>>>>> >>>>>>>>> If NET_ReadWithTimeout returns -1 because >>>>>>>>> >>>>>> NET_TimeoutWithCurrentTime >>>>>> >>>>>>>>> returns <= 0, then a JNI pending exception will be set. So the code >>>>>>>>> calling NET_ReadWithTimeout should, a) free bufP, and b) return -1, >>>>>>>>> immediately rather than continuing and possibly trying to set another >>>>>>>>> JNI pending exception. >>>>>>>>> >>>>>>>>> One option is to check the return value from NET_ReadWithTimeout and >>>>>>>>> also (*env)->ExceptionCheck(env). Another is to possibly consolidate >>>>>>>>> the setting of JNI pending exceptions in one place, towards the end >>>>>>>>> of Java_java_net_SocketInputStream_socketRead0, for example EBADF >>>>>>>>> >>>> is >>>> >>>>>>>>> handled in two places. >>>>>>>>> >>>>>>>>> -Chris. >>>>>>>>> >>>>>>>>> >>>>>>>>>> I need help from some one to build and test latest changes on AIX, >>>>>>>>>> may >>>>>>>>>> be Christoph can help. >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> >>>>>>>>>> Vyom >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Tuesday 06 September 2016 06:25 PM, Chris Hegarty wrote: >>>>>>>>>> >>>>>>>>>>> Vyom, >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> On 6 Sep 2016, at 10:20, Vyom Tewari <vyom.tew...@oracle.com> >>>>>> wrote: >>>>>> >>>>>>>>>>>> Hi, >>>>>>>>>>>> >>>>>>>>>>>> Please find the latest >>>>>>>>>>>> >>>>>>>>>>>> >>>> webrev(http://cr.openjdk.java.net/~vtewari/8075484/webrev0.2/index.html >>>> <http://cr.openjdk.java.net/%7Evtewari/8075484/webrev0.2/index.html> >>>> ). >>>> >>>>>>>>>>>> I >>>>>>>>>>>> have incorporated the review comments. >>>>>>>>>>>> >>>>>>>>>>> Your changes completely avoid NET_Timeout, which is quite complex >>>>>>>>>>> >>>> on >>>> >>>>>>>>>>> Linux, Mac, and AIX, for various reasons. ( NET_Timeout will use the >>>>>>>>>>> async close mechanism to signal/interrupt a thread blocked in a >>>>>>>>>>> poll / >>>>>>>>>>> select ). Also, select is used on Mac, which will use poll after >>>>>>>>>>> your >>>>>>>>>>> changes ( I do remember that there was a bug in poll on Mac around >>>>>>>>>>> the time of the original Mac port ). >>>>>>>>>>> >>>>>>>>>>> Would is be better, rather than replicating the logic in >>>>>>>>>>> NET_Timeout, >>>>>>>>>>> to have a version that supports passing a function pointer, to run >>>>>>>>>>> if >>>>>>>>>>> the poll/select returns before the timeout? Just an idea. >>>>>>>>>>> >>>>>>>>>>> -Chris. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> Thanks, >>>>>>>>>>>> >>>>>>>>>>>> Vyom >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Monday 05 September 2016 08:37 PM, Chris Hegarty wrote: >>>>>>>>>>>> >>>>>>>>>>>>> On 05/09/16 15:37, Mark Sheppard wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> if the desire is to avoid making double calls on gettimeofday in >>>>>>>>>>>>>> the >>>>>>>>>>>>>> NET_ReadWithTimeout's while loop for its main call flow, >>>>>>>>>>>>>> >>>>>>>>>>>>> Yes, the desire is to make no more calls to gettimeofday, than are >>>>>>>>>>>>> already done. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>>> then consider a modification to NET_Timeout and create a version >>>>>>>>>>>>>> int NET_TimeoutWithCurrentTime(int s, long timeout, stuct >>>>>>>>>>>>>> >>>> timeval * >>>> >>>>>>>>>>>>>> current_time) >>>>>>>>>>>>>> >>>>>>>>>>>>>> int NET_TimeoutWithCurrentTime(int s, long timeout, stuct >>>>>>>>>>>>>> >>>> timeval * >>>> >>>>>>>>>>>>>> current_time) { >>>>>>>>>>>>>> int result; >>>>>>>>>>>>>> struct timeval t; >>>>>>>>>>>>>> long prevtime, newtime; >>>>>>>>>>>>>> struct pollfd pfd; >>>>>>>>>>>>>> pfd.fd = s; >>>>>>>>>>>>>> pfd.events = POLLIN; >>>>>>>>>>>>>> >>>>>>>>>>>>>> if (timeout > 0) { >>>>>>>>>>>>>> prevtime = (current_time->tv_sec * 1000) + >>>>>>>>>>>>>> current_time->tv_usec / 1000; >>>>>>>>>>>>>> } >>>>>>>>>>>>>> >>>>>>>>>>>>>> for(;;) { >>>>>>>>>>>>>> result = poll(&pfd, 1, timeout); >>>>>>>>>>>>>> if (result < 0 && errno == EINTR) { >>>>>>>>>>>>>> if (timeout > 0) { >>>>>>>>>>>>>> gettimeofday(&t, NULL); >>>>>>>>>>>>>> newtime = (t.tv_sec * 1000) + t.tv_usec /1000; >>>>>>>>>>>>>> timeout -= newtime - prevtime; >>>>>>>>>>>>>> if (timeout <= 0) >>>>>>>>>>>>>> return 0; >>>>>>>>>>>>>> prevtime = newtime; >>>>>>>>>>>>>> } >>>>>>>>>>>>>> } else { >>>>>>>>>>>>>> return result; >>>>>>>>>>>>>> } >>>>>>>>>>>>>> } >>>>>>>>>>>>>> } >>>>>>>>>>>>>> >>>>>>>>>>>>>> the NET_ReadWithTimeout is modified with. >>>>>>>>>>>>>> >>>>>>>>>>>>>> while (timeout > 0) { >>>>>>>>>>>>>> result = NET_TimeoutWithCurrentTime(fd, timeout, &t); >>>>>>>>>>>>>> >>>>>>>>>>>>>> in any case there is the potential for multiple invocation of >>>>>>>>>>>>>> gettimeofday due to a need to make >>>>>>>>>>>>>> poll restartable, >>>>>>>>>>>>>> >>>>>>>>>>>>> Yes, and that is fine. Just no more than is already there. >>>>>>>>>>>>> >>>>>>>>>>>>> and adjust the originally specified timeout >>>>>>>>>>>>> >>>>>>>>>>>>>> accordingly, and for the edge case >>>>>>>>>>>>>> after the non blocking read. >>>>>>>>>>>>>> >>>>>>>>>>>>> After an initial skim, your suggestion seems reasonable. >>>>>>>>>>>>> >>>>>>>>>>>>> -Chris. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>>> regards >>>>>>>>>>>>>> Mark >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 05/09/2016 12:02, Chris Hegarty wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Vyom, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>> webrev(http://cr.openjdk.java.net/~vtewari/8075484/webrev0.1/index.html >>>>>>>>>>>>>>> There is some concern about the potential performance effect, >>>>>>>>>>>>>>> >>>> etc, >>>> >>>>>>>>>>>>>>> of gettimeofday, maybe there is a way out of this. The reuse of >>>>>>>>>>>>>>> NET_Timeout is good, but it also calls gettimeofday. It seems >>>>>>>>>>>>>>> that >>>>>>>>>>>>>>> a specific NET_ReadWithTimeout could be written to NOT reuse >>>>>>>>>>>>>>> NET_Timeout, but effectively inline its interruptible operation. >>>>>>>>>>>>>>> Or write a variant of NET_Timeout that takes a function to >>>>>>>>>>>>>>> execute. Rather than effectively two loops conditioned on the >>>>>>>>>>>>>>> timeout. Disclaimer: I have not actually tried to do this, but >>>>>>>>>>>>>>> it seems worth considering / evaluating. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -Chris. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 02/09/16 04:39, Vyom Tewari wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> hi Dimitry, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> thanks for review, I did consider to use a monotonically >>>>>>>>>>>>>>>> increasing >>>>>>>>>>>>>>>> clock like "clock_gettime" but existing nearby >>>>>>>>>>>>>>>> code("NET_Timeout") uses >>>>>>>>>>>>>>>> "gettimeofday" so i choose to be consistent with the existing >>>>>>>>>>>>>>>> code. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Vyom >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Friday 02 September 2016 01:38 AM, Dmitry Samersoff >>>>>>>>>>>>>>>> >>>> wrote: >>>> >>>>>>>>>>>>>>>>> Vyom, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Did you consider to use select() to calculate timeout instead >>>>>>>>>>>>>>>>> of >>>>>>>>>>>>>>>>> gettimeofday ? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> gettimeofday is affected by system time changes, so running >>>>>>>>>>>>>>>>> >>>> ntpd >>>> >>>>>>>>>>>>>>>>> can >>>>>>>>>>>>>>>>> cause unpredictable behavior of this code. Also it's rather >>>>>>>>>>>>>>>>> expensive >>>>>>>>>>>>>>>>> syscall. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -Dmitry >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 2016-09-01 19:03, Vyom Tewari wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> please find the updated >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>> webrev(http://cr.openjdk.java.net/~vtewari/8075484/webrev0.1/index.html >>>> <http://cr.openjdk.java.net/%7Evtewari/8075484/webrev0.1/index.html> >>>> ). >>>> >>>>>>>>>>>>>>>>>> I >>>>>>>>>>>>>>>>>> incorporated the review comments. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Vyom >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On Tuesday 30 August 2016 04:11 PM, Mark Sheppard wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Hi >>>>>>>>>>>>>>>>>>> perhaps there is an opportunity to do some refactoring >>>>>>>>>>>>>>>>>>> here (... >>>>>>>>>>>>>>>>>>> for me a "goto " carries a code smell! ) >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> along the lines >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> if (timeout) { >>>>>>>>>>>>>>>>>>> nread = NET_ReadWithTimeout(...); >>>>>>>>>>>>>>>>>>> } else { >>>>>>>>>>>>>>>>>>> nread = NET_Read(...); >>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> the NET_ReadWithTimeout (...) function will contain a >>>>>>>>>>>>>>>>>>> restructuring of >>>>>>>>>>>>>>>>>>> your goto loop >>>>>>>>>>>>>>>>>>> while (_timeout > 0) { nread = NET_Timeout(fd, _timeout); >>>>>>>>>>>>>>>>>>> if (nread <= 0) { >>>>>>>>>>>>>>>>>>> if (nread == 0) { >>>>>>>>>>>>>>>>>>> JNU_ThrowByName(env, JNU_JAVANETPKG >>>>>>>>>>>>>>>>>>> "SocketTimeoutException", >>>>>>>>>>>>>>>>>>> "Read timed out"); >>>>>>>>>>>>>>>>>>> } else if (nread == -1) { >>>>>>>>>>>>>>>>>>> if (errno == EBADF) { >>>>>>>>>>>>>>>>>>> JNU_ThrowByName(env, >>>>>>>>>>>>>>>>>>> JNU_JAVANETPKG >>>>>>>>>>>>>>>>>>> "SocketException", "Socket closed"); >>>>>>>>>>>>>>>>>>> } else if (errno == ENOMEM) { >>>>>>>>>>>>>>>>>>> JNU_ThrowOutOfMemoryError(env, >>>>>>>>>>>>>>>>>>> "NET_Timeout >>>>>>>>>>>>>>>>>>> native heap allocation failed"); >>>>>>>>>>>>>>>>>>> } else { >>>>>>>>>>>>>>>>>>> JNU_ThrowByNameWithMessageAndLastError >>>>>>>>>>>>>>>>>>> (env, JNU_JAVANETPKG >>>>>>>>>>>>>>>>>>> "SocketException", >>>>>>>>>>>>>>>>>>> "select/poll failed"); >>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>> // release buffer in main call flow >>>>>>>>>>>>>>>>>>> // if (bufP != BUF) { >>>>>>>>>>>>>>>>>>> // free(bufP); >>>>>>>>>>>>>>>>>>> // } >>>>>>>>>>>>>>>>>>> nread = -1; >>>>>>>>>>>>>>>>>>> break; >>>>>>>>>>>>>>>>>>> } else { >>>>>>>>>>>>>>>>>>> nread = NET_NonBlockingRead(fd, bufP, len); >>>>>>>>>>>>>>>>>>> if (nread == -1 && ((errno == EAGAIN) || (errno == >>>>>>>>>>>>>>>>>>> EWOULDBLOCK))) { >>>>>>>>>>>>>>>>>>> gettimeofday(&t, NULL); >>>>>>>>>>>>>>>>>>> newtime = t.tv_sec * 1000 + t.tv_usec / 1000; >>>>>>>>>>>>>>>>>>> _timeout -= newtime - prevtime; >>>>>>>>>>>>>>>>>>> if(_timeout > 0){ >>>>>>>>>>>>>>>>>>> prevtime = newtime; >>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>> } else { break; } } } return nread; >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> e&oe >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> regards >>>>>>>>>>>>>>>>>>> Mark >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On 29/08/2016 10:58, Vyom Tewari wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> gentle reminder, please review the below code change. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Vyom >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On Monday 22 August 2016 05:12 PM, Vyom Tewari wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Hi All, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Please review the code changes for below issue. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Bug : >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8075484 >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> webrev : >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>> http://cr.openjdk.java.net/~vtewari/8075484/webrev0.0/index.html >>>>>>>> <http://cr.openjdk.java.net/%7Evtewari/8075484/webrev0.0/index.html> >>>>>>>>>>>>>>>>>>>>> This issue is SocketInputStream.socketread0() hangs even >>>>>>>>>>>>>>>>>>>>> >>>>>> with >>>>>> >>>>>>>>>>>>>>>>>>>>> "soTimeout" set.the implementation of >>>>>>>>>>>>>>>>>>>>> Java_java_net_SocketInputStream_socketRead0 assumes >>>>>>>>>>>>>>>>>>>>> >>>>>> that >>>>>> >>>>>>>>>>>>>>>>>>>>> read() >>>>>>>>>>>>>>>>>>>>> won't block after poll() reports that a read is possible. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> This assumption does not hold, as noted on the man page >>>>>>>>>>>>>>>>>>>>> >>>> for >>>> >>>>>>>>>>>>>>>>>>>>> select >>>>>>>>>>>>>>>>>>>>> (referenced by the man page for poll): Under Linux, >>>>>>>>>>>>>>>>>>>>> >>>> select() >>>> >>>>>>>>>>>>>>>>>>>>> may >>>>>>>>>>>>>>>>>>>>> report a socket file descriptor as "ready for reading", >>>>>>>>>>>>>>>>>>>>> >>>> while >>>> >>>>>>>>>>>>>>>>>>>>> nevertheless a subsequent read blocks. This could for >>>>>>>>>>>>>>>>>>>>> >>>>>> example >>>>>> >>>>>>>>>>>>>>>>>>>>> happen >>>>>>>>>>>>>>>>>>>>> when data has arrived but upon examination has wrong >>>>>>>>>>>>>>>>>>>>> >>>>>>>> checksum >>>>>>>> >>>>>>>>>>>>>>>>>>>>> and is >>>>>>>>>>>>>>>>>>>>> discarded. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Vyom >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >> >