diff --git a/src/share/classes/sun/awt/shell/ShellFolder.java b/src/share/classes/sun/awt/shell/ShellFolder.java index cf3c78933849048a44d5ba1506b25ed32d37c337..c5b2296b2b754eb2781ac35eeb042997bcdc3ddc 100644 --- a/src/share/classes/sun/awt/shell/ShellFolder.java +++ b/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 diff --git a/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java b/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java index 90d008625cce3b4a98ef37a74f37e8080d97d1ad..f9b2f4c42802929ebbdfb6f8e79ac017ee7ed783 100644 --- a/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java +++ b/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/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java b/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java index abd49d3960bdb984b60736819e2465212d481b44..b7639fa77bbda34c41d72871fdadfd53651974d3 100644 --- a/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java +++ b/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) diff --git a/test/javax/swing/JFileChooser/6741890/bug6741890.java b/test/javax/swing/JFileChooser/6741890/bug6741890.java index 1253acb1f6aecbdfd62fac7f02ab0ccafd445333..1e670e704044db0a7fe9ba5030aea8e1c7129309 100644 --- a/test/javax/swing/JFileChooser/6741890/bug6741890.java +++ b/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