# HG changeset patch # User padraigob@netbeans.org # Date 1202292315 0 # Node ID 35dbcfe2890e04850d22aa9e01f2b24c33473c0e # Parent 38cf114ab20abd64486c619cf57821076d9fa55c 126588: Reduce number of FileStatusCache.refresh calls for FileCreation and FileChanged events diff -r 38cf114ab20a -r 35dbcfe2890e mercurial/src/org/netbeans/modules/mercurial/FileStatusCache.java --- a/mercurial/src/org/netbeans/modules/mercurial/FileStatusCache.java Wed Feb 06 08:49:26 2008 +0000 +++ b/mercurial/src/org/netbeans/modules/mercurial/FileStatusCache.java Wed Feb 06 10:05:15 2008 +0000 @@ -322,6 +322,7 @@ public class FileStatusCache { private FileInformation refresh(File file, FileStatus repositoryStatus, boolean forceChangeEvent) { + Mercurial.LOG.log(Level.FINE, "refresh(): {0}", file); // NOI18N File dir = file.getParentFile(); if (dir == null) { return FileStatusCache.FILE_INFORMATION_NOTMANAGED; //default for filesystem roots diff -r 38cf114ab20a -r 35dbcfe2890e mercurial/src/org/netbeans/modules/mercurial/MercurialInterceptor.java --- a/mercurial/src/org/netbeans/modules/mercurial/MercurialInterceptor.java Wed Feb 06 08:49:26 2008 +0000 +++ b/mercurial/src/org/netbeans/modules/mercurial/MercurialInterceptor.java Wed Feb 06 10:05:15 2008 +0000 @@ -57,6 +57,8 @@ import java.util.Calendar; import java.util.Calendar; import org.netbeans.modules.mercurial.util.HgUtils; import org.netbeans.api.queries.SharabilityQuery; +import java.util.concurrent.ConcurrentLinkedQueue; + /** * Listens on file system changes and reacts appropriately, mainly refreshing affected files' status. @@ -69,9 +71,16 @@ public class MercurialInterceptor extend private List dirsToDelete; + private ConcurrentLinkedQueue filesToRefresh = new ConcurrentLinkedQueue(); + + private RequestProcessor.Task refreshTask; + + private static final RequestProcessor rp = new RequestProcessor("MercurialRefresh", 1, true); + public MercurialInterceptor() { cache = Mercurial.getInstance().getFileStatusCache(); dirsToDelete = new ArrayList(); + refreshTask = rp.create(new RefreshTask()); } public boolean beforeDelete(File file) { @@ -315,7 +324,10 @@ public class MercurialInterceptor extend HgProgressSupport supportCreate = new HgProgressSupport() { public void perform() { - cache.refresh(file, FileStatusCache.REPOSITORY_STATUS_UNKNOWN); + // There is no point in refreshing the cache for ignored files. + if (!HgUtils.isIgnored(file, false)) { + reScheduleRefresh(1000, file); + } } }; @@ -344,12 +356,38 @@ public class MercurialInterceptor extend Mercurial.LOG.log(Level.FINE, "fileChangedImpl(): File: {0}", file); // NOI18N // There is no point in refreshing the cache for ignored files. if (!HgUtils.isIgnored(file, false)) { - cache.refresh(file, FileStatusCache.REPOSITORY_STATUS_UNKNOWN); + reScheduleRefresh(1000, file); } } }; supportCreate.start(rp, root.getAbsolutePath(), org.openide.util.NbBundle.getMessage(MercurialInterceptor.class, "MSG_Change_Progress")); // NOI18N - } + } + + private void reScheduleRefresh(int delayMillis, File fileToRefresh) { + if (!filesToRefresh.contains(fileToRefresh)) { + if (!filesToRefresh.offer(fileToRefresh)) { + Mercurial.LOG.log(Level.FINE, "reScheduleRefresh failed to add to filesToRefresh queue {0}", fileToRefresh); + } + } + refreshTask.schedule(delayMillis); + } + + private class RefreshTask implements Runnable { + public void run() { + Thread.interrupted(); + File fileToRefresh = filesToRefresh.poll(); + if (fileToRefresh != null) { + cache.refresh(fileToRefresh, FileStatusCache.REPOSITORY_STATUS_UNKNOWN); + fileToRefresh = filesToRefresh.peek(); + if (fileToRefresh != null) { + refreshTask.schedule(0); + } + } + } + } + + + }