@ -139,7 +139,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
private byte [ ] packChecksum ;
private PackIndex loadedIdx ;
private volatile PackIndex loadedIdx ;
private PackReverseIndex reverseIdx ;
@ -174,35 +174,44 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
length = Long . MAX_VALUE ;
}
private synchronized PackIndex idx ( ) throws IOException {
if ( loadedIdx = = null ) {
if ( invalid )
throw new PackInvalidException ( packFile ) ;
try {
final PackIndex idx = PackIndex . open ( extFile ( INDEX ) ) ;
if ( packChecksum = = null ) {
packChecksum = idx . packChecksum ;
} else if ( ! Arrays . equals ( packChecksum , idx . packChecksum ) ) {
throw new PackMismatchException ( MessageFormat . format (
JGitText . get ( ) . packChecksumMismatch ,
packFile . getPath ( ) ,
ObjectId . fromRaw ( packChecksum ) . name ( ) ,
ObjectId . fromRaw ( idx . packChecksum ) . name ( ) ) ) ;
private PackIndex idx ( ) throws IOException {
PackIndex idx = loadedIdx ;
if ( idx = = null ) {
synchronized ( this ) {
idx = loadedIdx ;
if ( idx = = null ) {
if ( invalid ) {
throw new PackInvalidException ( packFile ) ;
}
try {
idx = PackIndex . open ( extFile ( INDEX ) ) ;
if ( packChecksum = = null ) {
packChecksum = idx . packChecksum ;
} else if ( ! Arrays . equals ( packChecksum ,
idx . packChecksum ) ) {
throw new PackMismatchException ( MessageFormat
. format ( JGitText . get ( ) . packChecksumMismatch ,
packFile . getPath ( ) ,
ObjectId . fromRaw ( packChecksum )
. name ( ) ,
ObjectId . fromRaw ( idx . packChecksum )
. name ( ) ) ) ;
}
loadedIdx = idx ;
} catch ( InterruptedIOException e ) {
// don't invalidate the pack, we are interrupted from
// another thread
throw e ;
} catch ( IOException e ) {
invalid = true ;
throw e ;
}
}
loadedIdx = idx ;
} catch ( InterruptedIOException e ) {
// don't invalidate the pack, we are interrupted from another thread
throw e ;
} catch ( IOException e ) {
invalid = true ;
throw e ;
}
}
return loadedIdx ;
return idx ;
}
/ * *
* Get the File object which locates this pack on disk .
*