Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java52
1 files changed, 52 insertions, 0 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java
index aac288ec5e..95fc7a9e5e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java
@@ -49,6 +49,7 @@ import static org.eclipse.jgit.storage.pack.StoredObjectRepresentation.PACK_WHOL
import java.io.IOException;
import java.io.OutputStream;
+import java.lang.ref.WeakReference;
import java.security.MessageDigest;
import java.text.MessageFormat;
import java.util.ArrayList;
@@ -62,7 +63,9 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.NoSuchElementException;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
@@ -141,6 +144,50 @@ import org.eclipse.jgit.util.TemporaryBuffer;
public class PackWriter {
private static final int PACK_VERSION_GENERATED = 2;
+ private static final Map<WeakReference<PackWriter>, Boolean> instances =
+ new ConcurrentHashMap<WeakReference<PackWriter>, Boolean>();
+
+ private static final Iterable<PackWriter> instancesIterable = new Iterable<PackWriter>() {
+ public Iterator<PackWriter> iterator() {
+ return new Iterator<PackWriter>() {
+ private final Iterator<WeakReference<PackWriter>> it =
+ instances.keySet().iterator();
+ private PackWriter next;
+
+ public boolean hasNext() {
+ if (next != null)
+ return true;
+ while (it.hasNext()) {
+ WeakReference<PackWriter> ref = it.next();
+ next = ref.get();
+ if (next != null)
+ return true;
+ it.remove();
+ }
+ return false;
+ }
+
+ public PackWriter next() {
+ if (hasNext()) {
+ PackWriter result = next;
+ next = null;
+ return result;
+ }
+ throw new NoSuchElementException();
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+ };
+
+ /** @return all allocated, non-released PackWriters instances. */
+ public static Iterable<PackWriter> getInstances() {
+ return instancesIterable;
+ }
+
@SuppressWarnings("unchecked")
private final BlockList<ObjectToPack> objectsLists[] = new BlockList[Constants.OBJ_TAG + 1];
{
@@ -176,6 +223,8 @@ public class PackWriter {
private final MutableState state;
+ private final WeakReference<PackWriter> selfRef;
+
private Statistics.ObjectType typeStats;
private List<ObjectToPack> sortedByName;
@@ -269,6 +318,8 @@ public class PackWriter {
reuseValidate = true; // be paranoid by default
stats = new Statistics();
state = new MutableState();
+ selfRef = new WeakReference<PackWriter>(this);
+ instances.put(selfRef, Boolean.TRUE);
}
/**
@@ -901,6 +952,7 @@ public class PackWriter {
myDeflater.end();
myDeflater = null;
}
+ instances.remove(selfRef);
}
private void searchForReuse(ProgressMonitor monitor) throws IOException {

Back to the top