From d4946d1ec34567e389f2e30421b8552f5eff0a41 Mon Sep 17 00:00:00 2001 From: Denis Fokin Date: Fri, 28 Jan 2011 16:52:10 +0300 Subject: [PATCH] 6340263: Regression testcase java/awt/dnd/DnDClipboardDeadlockTest throughs IOException: Owner timed out Reviewed-by: anthony, art --- .../classes/sun/awt/X11/XSelection.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/jdk/src/solaris/classes/sun/awt/X11/XSelection.java b/jdk/src/solaris/classes/sun/awt/X11/XSelection.java index ea055bf4b64..1ffd1346361 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XSelection.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XSelection.java @@ -301,13 +301,8 @@ public final class XSelection { } 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 @@ public final class XSelection { 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 @@ public final class XSelection { 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;