6340263: Regression testcase java/awt/dnd/DnDClipboardDeadlockTest throughs IOException: Owner timed out
authordenis
Fri, 28 Jan 2011 16:52:10 +0300
changeset 8134 fb60ca70b79e
parent 8133 c7e4a02e928e
child 8135 5143a1ab97f4
6340263: Regression testcase java/awt/dnd/DnDClipboardDeadlockTest throughs IOException: Owner timed out Reviewed-by: anthony, art
jdk/src/solaris/classes/sun/awt/X11/XSelection.java
--- a/jdk/src/solaris/classes/sun/awt/X11/XSelection.java	Tue Jan 25 19:07:27 2011 +0300
+++ b/jdk/src/solaris/classes/sun/awt/X11/XSelection.java	Fri Jan 28 16:52:10 2011 +0300
@@ -301,13 +301,8 @@
                 } finally {
                     XToolkit.awtUnlock();
                 }
-                if (!dataGetter.isExecuted()) {
-                    throw new IOException("Owner timed out");
-                }
 
-                if (dataGetter.isDisposed()) {
-                    throw new IOException("Owner failed to convert data");
-                }
+                validateDataGetter(dataGetter);
 
                 // Handle incremental transfer.
                 if (dataGetter.getActualType() ==
@@ -380,14 +375,7 @@
                                 XToolkit.awtUnlock();
                             }
 
-                            // The owner didn't respond - terminate the transfer.
-                            if (!incrDataGetter.isExecuted()) {
-                                throw new IOException("Owner timed out");
-                            }
-
-                            if (incrDataGetter.isDisposed()) {
-                                throw new IOException("Owner failed to convert data");
-                            }
+                            validateDataGetter(dataGetter);
 
                             if (incrDataGetter.getActualFormat() != 8) {
                                 throw new IOException("Unsupported data format: " +
@@ -445,6 +433,23 @@
         return data != null ? data : new byte[0];
     }
 
+    void validateDataGetter(WindowPropertyGetter propertyGetter)
+            throws IOException
+    {
+        // The order of checks is important because a property getter
+        // has not been executed in case of timeout as well as in case of
+        // changed selection owner.
+
+        if (propertyGetter.isDisposed()) {
+            throw new IOException("Owner failed to convert data");
+        }
+
+        // The owner didn't respond - terminate the transfer.
+        if (!propertyGetter.isExecuted()) {
+            throw new IOException("Owner timed out");
+        }
+    }
+
     // To be MT-safe this method should be called under awtLock.
     boolean isOwner() {
         return isOwner;