--- a/jdk/src/share/classes/sun/awt/shell/ShellFolder.java Fri Nov 06 22:26:37 2009 +0300
+++ b/jdk/src/share/classes/sun/awt/shell/ShellFolder.java Fri Nov 06 22:33:40 2009 +0300
@@ -201,6 +201,8 @@
private static ShellFolderManager shellFolderManager;
+ private static Invoker invoker;
+
static {
String managerClassName = (String)Toolkit.getDefaultToolkit().
getDesktopProperty("Shell.shellFolderManager");
@@ -225,6 +227,8 @@
throw new Error ("Could not access Shell Folder Manager: "
+ managerClass.getName());
}
+
+ invoker = shellFolderManager.createInvoker();
}
/**
@@ -486,21 +490,6 @@
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 static <T, E extends Throwable> T invoke(Callable<T> task, Class<E> exceptionClass)
throws InterruptedException, E {
try {
- return getInvoker().invoke(task);
+ return invoker.invoke(task);
} catch (Exception e) {
if (e instanceof RuntimeException) {
// Rethrow unchecked exceptions
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java Fri Nov 06 22:26:37 2009 +0300
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java Fri Nov 06 22:33:40 2009 +0300
@@ -693,29 +693,32 @@
ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>();
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]
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Fri Nov 06 22:26:37 2009 +0300
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Fri Nov 06 22:33:40 2009 +0300
@@ -79,9 +79,12 @@
// 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)
--- a/jdk/test/javax/swing/JFileChooser/6741890/bug6741890.java Fri Nov 06 22:26:37 2009 +0300
+++ b/jdk/test/javax/swing/JFileChooser/6741890/bug6741890.java Fri Nov 06 22:33:40 2009 +0300
@@ -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 @@
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