]> source.dussan.org Git - jgit.git/commitdiff
Correctly name DeltaBaseCache 54/1554/1
authorShawn O. Pearce <spearce@spearce.org>
Wed, 8 Sep 2010 01:18:55 +0000 (18:18 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Wed, 8 Sep 2010 01:18:59 +0000 (18:18 -0700)
This class is used only to cache the unpacked form of an object that
was used as a base for another object.  The theory goes that if an
object is used as a delta base for A, it will probably also be a
delta base for B, C, D, E, etc. and therefore having an unpacked copy
of it on hand will make delta resolution for the others very fast.

However since objects are usually only accessed once, we don't want
to cache everything we unpack, just things that we are likely to
need again.  The only things we need again are the delta bases.
Hence, its a delta base cache.

This gets us the class name UnpackedObjectCache back, so we can
use it to actually create a cache of unpacked object information.

Change-Id: I121f356cf4eca7b80126497264eac22bd5825a1d
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/DeltaBaseCache.java [new file with mode: 0644]
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/PackFile.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/UnpackedObjectCache.java [deleted file]
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCache.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java

diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/DeltaBaseCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/DeltaBaseCache.java
new file mode 100644 (file)
index 0000000..8b54824
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.storage.file;
+
+import java.lang.ref.SoftReference;
+
+class DeltaBaseCache {
+       private static final int CACHE_SZ = 1024;
+
+       private static final SoftReference<Entry> DEAD;
+
+       private static int hash(final long position) {
+               return (((int) position) << 22) >>> 22;
+       }
+
+       private static int maxByteCount;
+
+       private static final Slot[] cache;
+
+       private static Slot lruHead;
+
+       private static Slot lruTail;
+
+       private static int openByteCount;
+
+       static {
+               DEAD = new SoftReference<Entry>(null);
+               maxByteCount = new WindowCacheConfig().getDeltaBaseCacheLimit();
+
+               cache = new Slot[CACHE_SZ];
+               for (int i = 0; i < CACHE_SZ; i++)
+                       cache[i] = new Slot();
+       }
+
+       static synchronized void reconfigure(final WindowCacheConfig cfg) {
+               final int dbLimit = cfg.getDeltaBaseCacheLimit();
+               if (maxByteCount != dbLimit) {
+                       maxByteCount = dbLimit;
+                       releaseMemory();
+               }
+       }
+
+       static synchronized Entry get(final PackFile pack, final long position) {
+               final Slot e = cache[hash(position)];
+               if (e.provider == pack && e.position == position) {
+                       final Entry buf = e.data.get();
+                       if (buf != null) {
+                               moveToHead(e);
+                               return buf;
+                       }
+               }
+               return null;
+       }
+
+       static synchronized void store(final PackFile pack, final long position,
+                       final byte[] data, final int objectType) {
+               if (data.length > maxByteCount)
+                       return; // Too large to cache.
+
+               final Slot e = cache[hash(position)];
+               clearEntry(e);
+
+               openByteCount += data.length;
+               releaseMemory();
+
+               e.provider = pack;
+               e.position = position;
+               e.sz = data.length;
+               e.data = new SoftReference<Entry>(new Entry(data, objectType));
+               moveToHead(e);
+       }
+
+       private static void releaseMemory() {
+               while (openByteCount > maxByteCount && lruTail != null) {
+                       final Slot currOldest = lruTail;
+                       final Slot nextOldest = currOldest.lruPrev;
+
+                       clearEntry(currOldest);
+                       currOldest.lruPrev = null;
+                       currOldest.lruNext = null;
+
+                       if (nextOldest == null)
+                               lruHead = null;
+                       else
+                               nextOldest.lruNext = null;
+                       lruTail = nextOldest;
+               }
+       }
+
+       static synchronized void purge(final PackFile file) {
+               for (final Slot e : cache) {
+                       if (e.provider == file) {
+                               clearEntry(e);
+                               unlink(e);
+                       }
+               }
+       }
+
+       private static void moveToHead(final Slot e) {
+               unlink(e);
+               e.lruPrev = null;
+               e.lruNext = lruHead;
+               if (lruHead != null)
+                       lruHead.lruPrev = e;
+               else
+                       lruTail = e;
+               lruHead = e;
+       }
+
+       private static void unlink(final Slot e) {
+               final Slot prev = e.lruPrev;
+               final Slot next = e.lruNext;
+               if (prev != null)
+                       prev.lruNext = next;
+               if (next != null)
+                       next.lruPrev = prev;
+       }
+
+       private static void clearEntry(final Slot e) {
+               openByteCount -= e.sz;
+               e.provider = null;
+               e.data = DEAD;
+               e.sz = 0;
+       }
+
+       private DeltaBaseCache() {
+               throw new UnsupportedOperationException();
+       }
+
+       static class Entry {
+               final byte[] data;
+
+               final int type;
+
+               Entry(final byte[] aData, final int aType) {
+                       data = aData;
+                       type = aType;
+               }
+       }
+
+       private static class Slot {
+               Slot lruPrev;
+
+               Slot lruNext;
+
+               PackFile provider;
+
+               long position;
+
+               int sz;
+
+               SoftReference<Entry> data = DEAD;
+       }
+}
index ed159ef389f6fdb69e6808c4ed0aea21ebbcc6b3..52391116230ae078631f8db54bb299dff08c79a5 100644 (file)
@@ -220,7 +220,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
         * Close the resources utilized by this repository
         */
        public void close() {
-               UnpackedObjectCache.purge(this);
+               DeltaBaseCache.purge(this);
                WindowCache.purge(this);
                synchronized (this) {
                        loadedIdx = null;
@@ -274,14 +274,6 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
                return getReverseIdx().findObject(offset);
        }
 
-       private final UnpackedObjectCache.Entry readCache(final long position) {
-               return UnpackedObjectCache.get(this, position);
-       }
-
-       private final void saveCache(final long position, final byte[] data, final int type) {
-               UnpackedObjectCache.store(this, position, data, type);
-       }
-
        private final byte[] decompress(final long position, final long totalSize,
                        final WindowCursor curs) throws IOException, DataFormatException {
                final byte[] dstbuf = new byte[(int) totalSize];
@@ -700,7 +692,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
                byte[] data;
                int type;
 
-               UnpackedObjectCache.Entry e = readCache(posBase);
+               DeltaBaseCache.Entry e = DeltaBaseCache.get(this, posBase);
                if (e != null) {
                        data = e.data;
                        type = e.type;
@@ -715,7 +707,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
                        }
                        data = p.getCachedBytes();
                        type = p.getType();
-                       saveCache(posBase, data, type);
+                       DeltaBaseCache.store(this, posBase, data, type);
                }
 
                // At this point we have the base, and its small, and the delta
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/UnpackedObjectCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/UnpackedObjectCache.java
deleted file mode 100644 (file)
index 92f4824..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
- * and other copyright owners as documented in the project's IP log.
- *
- * This program and the accompanying materials are made available
- * under the terms of the Eclipse Distribution License v1.0 which
- * accompanies this distribution, is reproduced below, and is
- * available at http://www.eclipse.org/org/documents/edl-v10.php
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above
- *   copyright notice, this list of conditions and the following
- *   disclaimer in the documentation and/or other materials provided
- *   with the distribution.
- *
- * - Neither the name of the Eclipse Foundation, Inc. nor the
- *   names of its contributors may be used to endorse or promote
- *   products derived from this software without specific prior
- *   written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.eclipse.jgit.storage.file;
-
-import java.lang.ref.SoftReference;
-
-class UnpackedObjectCache {
-       private static final int CACHE_SZ = 1024;
-
-       private static final SoftReference<Entry> DEAD;
-
-       private static int hash(final long position) {
-               return (((int) position) << 22) >>> 22;
-       }
-
-       private static int maxByteCount;
-
-       private static final Slot[] cache;
-
-       private static Slot lruHead;
-
-       private static Slot lruTail;
-
-       private static int openByteCount;
-
-       static {
-               DEAD = new SoftReference<Entry>(null);
-               maxByteCount = new WindowCacheConfig().getDeltaBaseCacheLimit();
-
-               cache = new Slot[CACHE_SZ];
-               for (int i = 0; i < CACHE_SZ; i++)
-                       cache[i] = new Slot();
-       }
-
-       static synchronized void reconfigure(final WindowCacheConfig cfg) {
-               final int dbLimit = cfg.getDeltaBaseCacheLimit();
-               if (maxByteCount != dbLimit) {
-                       maxByteCount = dbLimit;
-                       releaseMemory();
-               }
-       }
-
-       static synchronized Entry get(final PackFile pack, final long position) {
-               final Slot e = cache[hash(position)];
-               if (e.provider == pack && e.position == position) {
-                       final Entry buf = e.data.get();
-                       if (buf != null) {
-                               moveToHead(e);
-                               return buf;
-                       }
-               }
-               return null;
-       }
-
-       static synchronized void store(final PackFile pack, final long position,
-                       final byte[] data, final int objectType) {
-               if (data.length > maxByteCount)
-                       return; // Too large to cache.
-
-               final Slot e = cache[hash(position)];
-               clearEntry(e);
-
-               openByteCount += data.length;
-               releaseMemory();
-
-               e.provider = pack;
-               e.position = position;
-               e.sz = data.length;
-               e.data = new SoftReference<Entry>(new Entry(data, objectType));
-               moveToHead(e);
-       }
-
-       private static void releaseMemory() {
-               while (openByteCount > maxByteCount && lruTail != null) {
-                       final Slot currOldest = lruTail;
-                       final Slot nextOldest = currOldest.lruPrev;
-
-                       clearEntry(currOldest);
-                       currOldest.lruPrev = null;
-                       currOldest.lruNext = null;
-
-                       if (nextOldest == null)
-                               lruHead = null;
-                       else
-                               nextOldest.lruNext = null;
-                       lruTail = nextOldest;
-               }
-       }
-
-       static synchronized void purge(final PackFile file) {
-               for (final Slot e : cache) {
-                       if (e.provider == file) {
-                               clearEntry(e);
-                               unlink(e);
-                       }
-               }
-       }
-
-       private static void moveToHead(final Slot e) {
-               unlink(e);
-               e.lruPrev = null;
-               e.lruNext = lruHead;
-               if (lruHead != null)
-                       lruHead.lruPrev = e;
-               else
-                       lruTail = e;
-               lruHead = e;
-       }
-
-       private static void unlink(final Slot e) {
-               final Slot prev = e.lruPrev;
-               final Slot next = e.lruNext;
-               if (prev != null)
-                       prev.lruNext = next;
-               if (next != null)
-                       next.lruPrev = prev;
-       }
-
-       private static void clearEntry(final Slot e) {
-               openByteCount -= e.sz;
-               e.provider = null;
-               e.data = DEAD;
-               e.sz = 0;
-       }
-
-       private UnpackedObjectCache() {
-               throw new UnsupportedOperationException();
-       }
-
-       static class Entry {
-               final byte[] data;
-
-               final int type;
-
-               Entry(final byte[] aData, final int aType) {
-                       data = aData;
-                       type = aType;
-               }
-       }
-
-       private static class Slot {
-               Slot lruPrev;
-
-               Slot lruNext;
-
-               PackFile provider;
-
-               long position;
-
-               int sz;
-
-               SoftReference<Entry> data = DEAD;
-       }
-}
index 68fa19120398d615d517e46bd2a6e5388e80a98d..f533af48c2aa478f20f2daa2096ffc4494cd7ddb 100644 (file)
@@ -187,7 +187,7 @@ public class WindowCache {
                        oc.removeAll();
                cache = nc;
                streamFileThreshold = cfg.getStreamFileThreshold();
-               UnpackedObjectCache.reconfigure(cfg);
+               DeltaBaseCache.reconfigure(cfg);
        }
 
        static int getStreamFileThreshold() {
index 90ea376b5f0a6cb1ae06030b88588abba85f9835..95ec6f7c761c51a2ed6d5c0e07c0c0c5d323a24c 100644 (file)
@@ -146,7 +146,7 @@ public class WindowCacheConfig {
        }
 
        /**
-        * @return maximum number of bytes to cache in {@link UnpackedObjectCache}
+        * @return maximum number of bytes to cache in {@link DeltaBaseCache}
         *         for inflated, recently accessed objects, without delta chains.
         *         <b>Default 10 MB.</b>
         */
@@ -157,7 +157,7 @@ public class WindowCacheConfig {
        /**
         * @param newLimit
         *            maximum number of bytes to cache in
-        *            {@link UnpackedObjectCache} for inflated, recently accessed
+        *            {@link DeltaBaseCache} for inflated, recently accessed
         *            objects, without delta chains.
         */
        public void setDeltaBaseCacheLimit(final int newLimit) {