< prev index next >

src/java.base/unix/native/libnio/ch/IOUtil.c

Print this page
rev 50258 : [mq]: 8203369-Check-for-both-EAGAIN-and-EWOULDBLOCK-error-codes

@@ -118,11 +118,11 @@
     int tn = 0;
 
     for (;;) {
         int n = read(fd, buf, sizeof(buf));
         tn += n;
-        if ((n < 0) && (errno != EAGAIN))
+        if ((n < 0) && (errno != EAGAIN && errno != EWOULDBLOCK))
             JNU_ThrowIOExceptionWithLastError(env, "Drain");
         if (n == (int)sizeof(buf))
             continue;
         return (tn > 0) ? JNI_TRUE : JNI_FALSE;
     }

@@ -134,11 +134,11 @@
     int res;
     char buf[1];
 
     res = read(fd, buf, 1);
     if (res < 0) {
-        if (errno == EAGAIN) {
+        if (errno == EAGAIN || errno == EWOULDBLOCK) {
             res = 0;
         } else if (errno == EINTR) {
             return IOS_INTERRUPTED;
         } else {
             JNU_ThrowIOExceptionWithLastError(env, "read");

@@ -185,11 +185,11 @@
             return IOS_EOF; /* EOF is -1 in javaland */
         } else {
             return 0;
         }
     }
-    else if (errno == EAGAIN)
+    else if (errno == EAGAIN || errno == EWOULDBLOCK)
         return IOS_UNAVAILABLE;
     else if (errno == EINTR)
         return IOS_INTERRUPTED;
     else {
         const char *msg = reading ? "Read failed" : "Write failed";

@@ -210,11 +210,11 @@
             return IOS_EOF; /* EOF is -1 in javaland */
         } else {
             return 0;
         }
     }
-    else if (errno == EAGAIN)
+    else if (errno == EAGAIN || errno == EWOULDBLOCK)
         return IOS_UNAVAILABLE;
     else if (errno == EINTR)
         return IOS_INTERRUPTED;
     else {
         const char *msg = reading ? "Read failed" : "Write failed";
< prev index next >