@ -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 {