If we scan the directory and it hasn't changed since the last time we scanned it, there is no reason to build a new PackList and update the volatile reference. This just generates unnecessary garbage and may make it more difficult to detect an unmodified directory. Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx> --- .../src/org/spearce/jgit/lib/ObjectDirectory.java | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-) diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectDirectory.java b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectDirectory.java index 5b28207..0bb3c01 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectDirectory.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectDirectory.java @@ -260,10 +260,8 @@ protected ObjectLoader openObject2(final WindowCursor curs, @Override protected boolean tryAgain1() { final PackList old = packList.get(); - if (old.tryAgain(packDirectory.lastModified())) { - scanPacks(old); - return true; - } + if (old.tryAgain(packDirectory.lastModified())) + return old != scanPacks(old); return false; } @@ -317,6 +315,8 @@ private PackList scanPacks(final PackList original) { return o; } n = scanPacksImpl(o); + if (n == o) + return n; } while (!packList.compareAndSet(o, n)); return n; } @@ -327,6 +327,7 @@ private PackList scanPacksImpl(final PackList old) { final long lastModified = packDirectory.lastModified(); final Set<String> names = listPackDirectory(); final List<PackFile> list = new ArrayList<PackFile>(names.size() >> 2); + boolean foundNew = false; for (final String indexName : names) { // Must match "pack-[0-9a-f]{40}.idx" to be an index. // @@ -352,8 +353,17 @@ private PackList scanPacksImpl(final PackList old) { final File packFile = new File(packDirectory, packName); final File idxFile = new File(packDirectory, indexName); list.add(new PackFile(idxFile, packFile)); + foundNew = true; } + // If we did not discover any new files, the modification time was not + // changed, and we did not remove any files, then the set of files is + // the same as the set we were given. Instead of building a new object + // return the same collection. + // + if (!foundNew && lastModified == old.lastModified && forReuse.isEmpty()) + return old; + for (final PackFile p : forReuse.values()) { p.close(); } -- 1.6.4.225.gb589e -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html