6340263: Regression testcase java/awt/dnd/DnDClipboardDeadlockTest throughs IOException: Owner timed out
Reviewed-by: anthony, art
diff --git a/src/solaris/classes/sun/awt/X11/XSelection.java b/src/solaris/classes/sun/awt/X11/XSelection.java
index ea055bf..1ffd134 100644
--- a/src/solaris/classes/sun/awt/X11/XSelection.java
+++ b/src/solaris/classes/sun/awt/X11/XSelection.java
@@ -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;