From ce0d94ffec1923e25f488d42a1f30dfeabf15a90 Mon Sep 17 00:00:00 2001 From: Pavel Porvatov Date: Fri, 30 Oct 2009 14:05:48 +0300 Subject: [PATCH 1/3] 6894504: javax/swing/JFileChooser/6741890/bug6741890.java fails w/ RuntimeException Reviewed-by: malenkov --- jdk/test/javax/swing/JFileChooser/6741890/bug6741890.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/jdk/test/javax/swing/JFileChooser/6741890/bug6741890.java b/jdk/test/javax/swing/JFileChooser/6741890/bug6741890.java index 1253acb1f6a..1e670e70404 100644 --- a/jdk/test/javax/swing/JFileChooser/6741890/bug6741890.java +++ b/jdk/test/javax/swing/JFileChooser/6741890/bug6741890.java @@ -29,6 +29,7 @@ */ import sun.awt.shell.ShellFolder; +import sun.awt.OSInfo; import java.io.File; import java.lang.reflect.Field; @@ -43,6 +44,12 @@ public class bug6741890 { private static final int COUNT = 100000; public static void main(String[] args) throws Exception { + if (OSInfo.getOSType() != OSInfo.OSType.WINDOWS) { + System.out.println("The test is applicable only for Windows. Skipped."); + + return; + } + String tmpDir = System.getProperty("java.io.tmpdir"); if (tmpDir.length() == 0) { //'java.io.tmpdir' isn't guaranteed to be defined From fcfa835d860e9d1cf0b9df6f01d84908df1abf3e Mon Sep 17 00:00:00 2001 From: Pavel Porvatov Date: Fri, 30 Oct 2009 14:18:23 +0300 Subject: [PATCH 2/3] 6891412: The sun.awt.shell.ShellFolder#getInvoker method should be synchronized Reviewed-by: peterz --- .../classes/sun/awt/shell/ShellFolder.java | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/jdk/src/share/classes/sun/awt/shell/ShellFolder.java b/jdk/src/share/classes/sun/awt/shell/ShellFolder.java index cf3c7893384..c5b2296b2b7 100644 --- a/jdk/src/share/classes/sun/awt/shell/ShellFolder.java +++ b/jdk/src/share/classes/sun/awt/shell/ShellFolder.java @@ -201,6 +201,8 @@ public abstract class ShellFolder extends File { private static ShellFolderManager shellFolderManager; + private static Invoker invoker; + static { String managerClassName = (String)Toolkit.getDefaultToolkit(). getDesktopProperty("Shell.shellFolderManager"); @@ -225,6 +227,8 @@ public abstract class ShellFolder extends File { throw new Error ("Could not access Shell Folder Manager: " + managerClass.getName()); } + + invoker = shellFolderManager.createInvoker(); } /** @@ -486,21 +490,6 @@ public abstract class ShellFolder extends File { return null; } - private static Invoker invoker; - - /** - * Provides the single access point to the {@link Invoker}. It is guaranteed that the value - * returned by this method will be always the same. - * - * @return the singleton instance of {@link Invoker} - */ - public static Invoker getInvoker() { - if (invoker == null) { - invoker = shellFolderManager.createInvoker(); - } - return invoker; - } - /** * Invokes the {@code task} which doesn't throw checked exceptions * from its {@code call} method. If invokation is interrupted then Thread.currentThread().isInterrupted() will @@ -522,7 +511,7 @@ public abstract class ShellFolder extends File { public static T invoke(Callable task, Class exceptionClass) throws InterruptedException, E { try { - return getInvoker().invoke(task); + return invoker.invoke(task); } catch (Exception e) { if (e instanceof RuntimeException) { // Rethrow unchecked exceptions From e918d4b8607964e66f5c189bb8172e75e3a797df Mon Sep 17 00:00:00 2001 From: Pavel Porvatov Date: Fri, 6 Nov 2009 12:44:41 +0300 Subject: [PATCH 3/3] 6621569: Win32ShellFolder2 and Win32ShellFolderManager2 may leak native resources Reviewed-by: malenkov --- .../sun/awt/shell/Win32ShellFolder2.java | 47 ++++++++++--------- .../awt/shell/Win32ShellFolderManager2.java | 9 ++-- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java index 90d008625cc..f9b2f4c4280 100644 --- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java +++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java @@ -693,29 +693,32 @@ final class Win32ShellFolder2 extends ShellFolder { ArrayList list = new ArrayList(); long pEnumObjects = getEnumObjects(includeHiddenFiles); if (pEnumObjects != 0) { - long childPIDL; - int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR; - do { - childPIDL = getNextChild(pEnumObjects); - boolean releasePIDL = true; - if (childPIDL != 0 && - (getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) { - Win32ShellFolder2 childFolder; - if (Win32ShellFolder2.this.equals(desktop) - && personal != null - && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) { - childFolder = personal; - } else { - childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL); - releasePIDL = false; + try { + long childPIDL; + int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR; + do { + childPIDL = getNextChild(pEnumObjects); + boolean releasePIDL = true; + if (childPIDL != 0 && + (getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) { + Win32ShellFolder2 childFolder; + if (Win32ShellFolder2.this.equals(desktop) + && personal != null + && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) { + childFolder = personal; + } else { + childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL); + releasePIDL = false; + } + list.add(childFolder); } - list.add(childFolder); - } - if (releasePIDL) { - releasePIDL(childPIDL); - } - } while (childPIDL != 0 && !Thread.currentThread().isInterrupted()); - releaseEnumObjects(pEnumObjects); + if (releasePIDL) { + releasePIDL(childPIDL); + } + } while (childPIDL != 0 && !Thread.currentThread().isInterrupted()); + } finally { + releaseEnumObjects(pEnumObjects); + } } return Thread.currentThread().isInterrupted() ? new File[0] diff --git a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java index abd49d3960b..b7639fa77bb 100644 --- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java +++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java @@ -79,9 +79,12 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { // Shouldn't happen but watch for it anyway throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found"); } - Win32ShellFolder2 folder = createShellFolderFromRelativePIDL(parent, pIDL); - Win32ShellFolder2.releasePIDL(pIDL); - return folder; + + try { + return createShellFolderFromRelativePIDL(parent, pIDL); + } finally { + Win32ShellFolder2.releasePIDL(pIDL); + } } static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL)