diff -r e1e34b95279b openide.loaders/src/org/netbeans/modules/openide/loaders/DataNodeUtils.java --- a/openide.loaders/src/org/netbeans/modules/openide/loaders/DataNodeUtils.java Wed Sep 09 17:15:18 2015 +0000 +++ b/openide.loaders/src/org/netbeans/modules/openide/loaders/DataNodeUtils.java Wed Sep 09 22:10:47 2015 +0200 @@ -37,6 +37,11 @@ */ package org.netbeans.modules.openide.loaders; +import java.util.Map; +import java.util.WeakHashMap; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileStateInvalidException; +import org.openide.filesystems.FileSystem; import org.openide.util.RequestProcessor; /** Currently allows to share RP for nodes used by different packages @@ -46,11 +51,41 @@ */ public final class DataNodeUtils { private static final RequestProcessor RP = new RequestProcessor("Data System Nodes"); // NOI18N - + + private static final Map FS_2_RP + = new WeakHashMap(); + private DataNodeUtils() { } public static RequestProcessor reqProcessor() { return RP; } + + /** + * Get request processor for a file. + * + * @param fo Some FileObject. + * @return Request Processor (newly) assigned to the file's filesystem. + */ + public static RequestProcessor reqProcessor(FileObject fo) { + if (fo == null) { + return RP; + } + FileSystem fs; + try { + fs = fo.getFileSystem(); + synchronized (FS_2_RP) { + RequestProcessor rp = FS_2_RP.get(fs); + if (rp == null) { + rp = new RequestProcessor("Data System Nodes for " //NOI18N + + fs.getDisplayName()); + FS_2_RP.put(fs, rp); + } + return rp; + } + } catch (FileStateInvalidException ex) { + return RP; + } + } } diff -r e1e34b95279b openide.loaders/src/org/openide/loaders/FolderChildren.java --- a/openide.loaders/src/org/openide/loaders/FolderChildren.java Wed Sep 09 17:15:18 2015 +0000 +++ b/openide.loaders/src/org/openide/loaders/FolderChildren.java Wed Sep 09 22:10:47 2015 +0200 @@ -177,8 +177,13 @@ class R implements Runnable { List positioned = null; RefreshMode op; + Task prevTask = null; @Override public void run() { + if (prevTask != null) { + prevTask.waitFinished(); + prevTask = null; // do not hold task chain indefinitely + } if (op == RefreshMode.DEEP) { positioned = getPositionedFolderChildrenPairs(); //#229746 op = RefreshMode.DEEP_LATER; @@ -230,7 +235,10 @@ run.run(); } else { run.op = operation; - refTask = DataNodeUtils.reqProcessor().post(run); + synchronized (this) { + run.prevTask = refTask; + refTask = DataNodeUtils.reqProcessor(folder.getPrimaryFile()).post(run); + } } }