src/java.base/unix/native/libnio/ch/IOUtil.c
changeset 50275 69204b98dc3d
parent 49430 e376090dc07e
child 54154 1caf2daef7cf
equal deleted inserted replaced
50274:33a890c972c3 50275:69204b98dc3d
   118     int tn = 0;
   118     int tn = 0;
   119 
   119 
   120     for (;;) {
   120     for (;;) {
   121         int n = read(fd, buf, sizeof(buf));
   121         int n = read(fd, buf, sizeof(buf));
   122         tn += n;
   122         tn += n;
   123         if ((n < 0) && (errno != EAGAIN))
   123         if ((n < 0) && (errno != EAGAIN && errno != EWOULDBLOCK))
   124             JNU_ThrowIOExceptionWithLastError(env, "Drain");
   124             JNU_ThrowIOExceptionWithLastError(env, "Drain");
   125         if (n == (int)sizeof(buf))
   125         if (n == (int)sizeof(buf))
   126             continue;
   126             continue;
   127         return (tn > 0) ? JNI_TRUE : JNI_FALSE;
   127         return (tn > 0) ? JNI_TRUE : JNI_FALSE;
   128     }
   128     }
   134     int res;
   134     int res;
   135     char buf[1];
   135     char buf[1];
   136 
   136 
   137     res = read(fd, buf, 1);
   137     res = read(fd, buf, 1);
   138     if (res < 0) {
   138     if (res < 0) {
   139         if (errno == EAGAIN) {
   139         if (errno == EAGAIN || errno == EWOULDBLOCK) {
   140             res = 0;
   140             res = 0;
   141         } else if (errno == EINTR) {
   141         } else if (errno == EINTR) {
   142             return IOS_INTERRUPTED;
   142             return IOS_INTERRUPTED;
   143         } else {
   143         } else {
   144             JNU_ThrowIOExceptionWithLastError(env, "read");
   144             JNU_ThrowIOExceptionWithLastError(env, "read");
   185             return IOS_EOF; /* EOF is -1 in javaland */
   185             return IOS_EOF; /* EOF is -1 in javaland */
   186         } else {
   186         } else {
   187             return 0;
   187             return 0;
   188         }
   188         }
   189     }
   189     }
   190     else if (errno == EAGAIN)
   190     else if (errno == EAGAIN || errno == EWOULDBLOCK)
   191         return IOS_UNAVAILABLE;
   191         return IOS_UNAVAILABLE;
   192     else if (errno == EINTR)
   192     else if (errno == EINTR)
   193         return IOS_INTERRUPTED;
   193         return IOS_INTERRUPTED;
   194     else {
   194     else {
   195         const char *msg = reading ? "Read failed" : "Write failed";
   195         const char *msg = reading ? "Read failed" : "Write failed";
   210             return IOS_EOF; /* EOF is -1 in javaland */
   210             return IOS_EOF; /* EOF is -1 in javaland */
   211         } else {
   211         } else {
   212             return 0;
   212             return 0;
   213         }
   213         }
   214     }
   214     }
   215     else if (errno == EAGAIN)
   215     else if (errno == EAGAIN || errno == EWOULDBLOCK)
   216         return IOS_UNAVAILABLE;
   216         return IOS_UNAVAILABLE;
   217     else if (errno == EINTR)
   217     else if (errno == EINTR)
   218         return IOS_INTERRUPTED;
   218         return IOS_INTERRUPTED;
   219     else {
   219     else {
   220         const char *msg = reading ? "Read failed" : "Write failed";
   220         const char *msg = reading ? "Read failed" : "Write failed";