RFR [8055421]: (fs) bad error handling in java.base/unix/native/libnio/fs/UnixNativeDispatcher.c

Ivan Gerasimov ivan.gerasimov at oracle.com
Fri Aug 22 20:59:29 UTC 2014


How about another approach?
If we face EINTR, we can try to fallback to restartable close():

Java_sun_nio_fs_UnixNativeDispatcher_fclose(JNIEnv* env, jclass this, 
jlong stream)
{
     int res, fd;
     FILE* fp = jlong_to_ptr(stream);

     fd = fileno(fp);
     res = fclose(fp);
     if (res == EOF) {
         if (errno == EINTR) {
             if (fd == -1) {
                 errno = EBADF;
             } else {
                 RESTARTABLE(close(fd), res);
             }
         }
         if (res != 0) {
             throwUnixException(env, errno);
         }
     }
}

It's strange we have to do this, though.
I'm pretty sure it was not meant to be used this way.
I would think that fclose handles EINTR internally, but the 
documentation says nothing about it.

Sincerely yours,
Ivan



More information about the nio-dev mailing list