--- old/src/java.base/unix/native/libnet/SocketInputStream.c 2016-08-22 13:42:51.952744888 +0530 +++ new/src/java.base/unix/native/libnet/SocketInputStream.c 2016-08-22 13:42:51.836745337 +0530 @@ -28,14 +28,13 @@ #include #include #include - +#include #include "jvm.h" #include "jni_util.h" #include "net_util.h" #include "java_net_SocketInputStream.h" - /************************************************************************ * SocketInputStream */ @@ -65,7 +64,15 @@ char BUF[MAX_BUFFER_LEN]; char *bufP; jint fd, nread; - + long prevtime = 0, newtime; + struct timeval t; + long _timeout = timeout; + + if (_timeout > 0) { + gettimeofday(&t, NULL); + prevtime = t.tv_sec * 1000 + t.tv_usec / 1000; + } + if (IS_NULL(fdObj)) { /* shouldn't this be a NullPointerException? -br */ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", @@ -99,8 +106,8 @@ bufP = BUF; } - if (timeout) { - nread = NET_Timeout(fd, timeout); +LABEL: if (_timeout) { + nread = NET_Timeout(fd, _timeout); if (nread <= 0) { if (nread == 0) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException", @@ -120,10 +127,19 @@ } return -1; } + 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; + goto LABEL; + } + } + } else { // no timeout set, it has to be blocking call. + nread = NET_Read(fd, bufP, len); } - - nread = NET_Read(fd, bufP, len); - if (nread <= 0) { if (nread < 0) { @@ -143,7 +159,6 @@ JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException", "Operation interrupted"); break; - default: JNU_ThrowByNameWithMessageAndLastError (env, JNU_JAVANETPKG "SocketException", "Read failed");