7133499: (fc) FileChannel.read not preempted by asynchronous close on OS X
authoralanb
Wed, 22 Jan 2014 09:36:11 +0000
changeset 22561 5ee70f9edbb7
parent 22357 bbc7015fe560
child 22562 e909d64b8dd8
7133499: (fc) FileChannel.read not preempted by asynchronous close on OS X Reviewed-by: chegar
jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java
jdk/src/share/classes/sun/nio/ch/NativeThreadSet.java
jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java
jdk/src/solaris/native/sun/nio/ch/NativeThread.c
jdk/test/ProblemList.txt
--- a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java	Tue Jan 21 10:52:48 2014 -0500
+++ b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java	Wed Jan 22 09:36:11 2014 +0000
@@ -110,7 +110,7 @@
             }
         }
 
-        nd.preClose(fd);
+        // signal any threads blocked on this channel
         threads.signalAndWait();
 
         if (parent != null) {
--- a/jdk/src/share/classes/sun/nio/ch/NativeThreadSet.java	Tue Jan 21 10:52:48 2014 -0500
+++ b/jdk/src/share/classes/sun/nio/ch/NativeThreadSet.java	Wed Jan 22 09:36:11 2014 +0000
@@ -82,8 +82,9 @@
 
     // Signals all threads in this set.
     //
-    void signalAndWait() {
-        synchronized (this) {
+    synchronized void signalAndWait() {
+        boolean interrupted = false;
+        while (used > 0) {
             int u = used;
             int n = elts.length;
             for (int i = 0; i < n; i++) {
@@ -96,16 +97,15 @@
                     break;
             }
             waitingToEmpty = true;
-            boolean interrupted = false;
-            while (used > 0) {
-                try {
-                    wait();
-                } catch (InterruptedException e) {
-                    interrupted = true;
-                }
+            try {
+                wait(50);
+            } catch (InterruptedException e) {
+                interrupted = true;
+            } finally {
+                waitingToEmpty = false;
             }
-            if (interrupted)
-                Thread.currentThread().interrupt();
         }
+        if (interrupted)
+            Thread.currentThread().interrupt();
     }
 }
--- a/jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java	Tue Jan 21 10:52:48 2014 -0500
+++ b/jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java	Wed Jan 22 09:36:11 2014 +0000
@@ -88,7 +88,6 @@
         invalidateAllLocks();
 
         // signal any threads blocked on this channel
-        nd.preClose(fdObj);
         threads.signalAndWait();
 
         // wait until all async I/O operations have completely gracefully
--- a/jdk/src/solaris/native/sun/nio/ch/NativeThread.c	Tue Jan 21 10:52:48 2014 -0500
+++ b/jdk/src/solaris/native/sun/nio/ch/NativeThread.c	Wed Jan 22 09:36:11 2014 +0000
@@ -32,27 +32,32 @@
 #include "sun_nio_ch_NativeThread.h"
 #include "nio_util.h"
 
-
 #ifdef __linux__
-#include <pthread.h>
-#include <sys/signal.h>
-
-/* Also defined in src/solaris/native/java/net/linux_close.c */
-#define INTERRUPT_SIGNAL (__SIGRTMAX - 2)
+  #include <pthread.h>
+  #include <sys/signal.h>
+  /* Also defined in net/linux_close.c */
+  #define INTERRUPT_SIGNAL (__SIGRTMAX - 2)
+#elif __solaris__
+  #include <thread.h>
+  #include <signal.h>
+  #define INTERRUPT_SIGNAL (SIGRTMAX - 2)
+#elif _ALLBSD_SOURCE
+  #include <pthread.h>
+  #include <signal.h>
+  /* Also defined in net/bsd_close.c */
+  #define INTERRUPT_SIGNAL SIGIO
+#else
+  #error "missing platform-specific definition here"
+#endif
 
 static void
 nullHandler(int sig)
 {
 }
 
-#endif
-
-
 JNIEXPORT void JNICALL
 Java_sun_nio_ch_NativeThread_init(JNIEnv *env, jclass cl)
 {
-#ifdef __linux__
-
     /* Install the null handler for INTERRUPT_SIGNAL.  This might overwrite the
      * handler previously installed by java/net/linux_close.c, but that's okay
      * since neither handler actually does anything.  We install our own
@@ -67,25 +72,27 @@
     sigemptyset(&sa.sa_mask);
     if (sigaction(INTERRUPT_SIGNAL, &sa, &osa) < 0)
         JNU_ThrowIOExceptionWithLastError(env, "sigaction");
-
-#endif
 }
 
 JNIEXPORT jlong JNICALL
 Java_sun_nio_ch_NativeThread_current(JNIEnv *env, jclass cl)
 {
-#ifdef __linux__
-    return (long)pthread_self();
+#ifdef __solaris__
+    return (jlong)thr_self();
 #else
-    return -1;
+    return (jlong)pthread_self();
 #endif
 }
 
 JNIEXPORT void JNICALL
 Java_sun_nio_ch_NativeThread_signal(JNIEnv *env, jclass cl, jlong thread)
 {
-#ifdef __linux__
-    if (pthread_kill((pthread_t)thread, INTERRUPT_SIGNAL))
+    int ret;
+#ifdef __solaris__
+    ret = thr_kill((thread_t)thread, INTERRUPT_SIGNAL);
+#else
+    ret = pthread_kill((pthread_t)thread, INTERRUPT_SIGNAL);
+#endif
+    if (ret != 0)
         JNU_ThrowIOExceptionWithLastError(env, "Thread signal failed");
-#endif
 }
--- a/jdk/test/ProblemList.txt	Tue Jan 21 10:52:48 2014 -0500
+++ b/jdk/test/ProblemList.txt	Wed Jan 22 09:36:11 2014 +0000
@@ -173,11 +173,6 @@
 # 6963118
 java/nio/channels/Selector/Wakeup.java                          windows-all
 
-# 7133499, 7133497
-java/nio/channels/AsyncCloseAndInterrupt.java                   macosx-all
-java/nio/channels/AsynchronousFileChannel/Lock.java             macosx-all
-java/nio/channels/FileChannel/Transfer.java                     macosx-all
-
 # 7141822
 java/nio/channels/DatagramChannel/ChangingAddress.java          macosx-all