Browse Source

Merge "Remove unnecessary inflate stride in DfsBlock"

stable-3.1
Shawn Pearce 11 years ago committed by Gerrit Code Review @ Eclipse.org
parent
commit
c2a9f9e742
  1. 35
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlock.java
  2. 13
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java

35
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlock.java

@ -55,17 +55,6 @@ import org.eclipse.jgit.internal.storage.pack.PackOutputStream;
/** A cached slice of a {@link DfsPackFile}. */ /** A cached slice of a {@link DfsPackFile}. */
final class DfsBlock { final class DfsBlock {
/**
* Size in bytes to pass to {@link Inflater} at a time.
* <p>
* Blocks can be large (for example 1 MiB), while compressed objects inside
* of them are very small (for example less than 100 bytes for a delta). JNI
* forces the data supplied to the Inflater to be copied during setInput(),
* so use a smaller stride to reduce the risk that too much unnecessary was
* moved into the native layer.
*/
private static final int INFLATE_STRIDE = 512;
final DfsPackKey pack; final DfsPackKey pack;
final long start; final long start;
@ -105,29 +94,9 @@ final class DfsBlock {
return n; return n;
} }
int inflate(Inflater inf, long pos, byte[] dstbuf, int dstoff) void setInput(Inflater inf, long pos) {
throws DataFormatException {
int ptr = (int) (pos - start); int ptr = (int) (pos - start);
int in = Math.min(INFLATE_STRIDE, block.length - ptr); inf.setInput(block, ptr, block.length - ptr);
if (dstoff < dstbuf.length)
in = Math.min(in, dstbuf.length - dstoff);
inf.setInput(block, ptr, in);
for (;;) {
int out = inf.inflate(dstbuf, dstoff, dstbuf.length - dstoff);
if (out == 0) {
if (inf.needsInput()) {
ptr += in;
in = Math.min(INFLATE_STRIDE, block.length - ptr);
if (in == 0)
return dstoff;
inf.setInput(block, ptr, in);
continue;
}
return dstoff;
}
dstoff += out;
}
} }
void crc32(CRC32 out, long pos, int cnt) { void crc32(CRC32 out, long pos, int cnt) {

13
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java

@ -616,20 +616,25 @@ public final class DfsReader extends ObjectReader implements ObjectReuseAsIs {
boolean headerOnly) throws IOException, DataFormatException { boolean headerOnly) throws IOException, DataFormatException {
prepareInflater(); prepareInflater();
pin(pack, position); pin(pack, position);
block.setInput(inf, position);
int dstoff = 0; int dstoff = 0;
for (;;) { for (;;) {
dstoff = block.inflate(inf, position, dstbuf, dstoff); int n = inf.inflate(dstbuf, dstoff, dstbuf.length - dstoff);
if (n == 0) {
if (headerOnly && dstoff == dstbuf.length) if (headerOnly && dstoff == dstbuf.length)
return dstoff; return dstoff;
if (inf.needsInput()) { if (inf.needsInput()) {
position += block.remaining(position); position += block.remaining(position);
pin(pack, position); pin(pack, position);
} else if (inf.finished()) block.setInput(inf, position);
continue;
}
if (inf.finished())
return dstoff; return dstoff;
else
throw new DataFormatException(); throw new DataFormatException();
} }
dstoff += n;
}
} }
DfsBlock quickCopy(DfsPackFile p, long pos, long cnt) DfsBlock quickCopy(DfsPackFile p, long pos, long cnt)

Loading…
Cancel
Save