Merge "Enforce max memory for DeltaWindow."

This commit is contained in:
Colby Ranger 2012-12-27 12:33:13 -05:00 committed by Gerrit Code Review @ Eclipse.org
commit 5a3d35e9e2
1 changed files with 24 additions and 0 deletions

View File

@ -164,6 +164,14 @@ private static long estimateSize(ObjectToPack ent) {
return DeltaIndex.estimateIndexSize(ent.getWeight());
}
private static long estimateIndexSize(DeltaWindowEntry ent) {
if (ent.buffer == null)
return estimateSize(ent.object);
int len = ent.buffer.length;
return DeltaIndex.estimateIndexSize(len) - len;
}
private void clear(DeltaWindowEntry ent) {
if (ent.index != null)
loaded -= ent.index.getIndexSize();
@ -420,6 +428,8 @@ private DeltaIndex index(DeltaWindowEntry ent)
IOException, LargeObjectException {
DeltaIndex idx = ent.index;
if (idx == null) {
checkLoadable(ent, estimateIndexSize(ent));
try {
idx = new DeltaIndex(buffer(ent));
} catch (OutOfMemoryError noMemory) {
@ -439,6 +449,8 @@ private byte[] buffer(DeltaWindowEntry ent) throws MissingObjectException,
IncorrectObjectTypeException, IOException, LargeObjectException {
byte[] buf = ent.buffer;
if (buf == null) {
checkLoadable(ent, ent.size());
buf = PackWriter.buffer(config, reader, ent.object);
if (0 < maxMemory)
loaded += buf.length;
@ -447,6 +459,18 @@ private byte[] buffer(DeltaWindowEntry ent) throws MissingObjectException,
return buf;
}
private void checkLoadable(DeltaWindowEntry ent, long need) {
int tail = next(resSlot);
while (maxMemory < loaded + need) {
DeltaWindowEntry cur = window[tail];
clear(cur);
if (cur == ent)
throw new LargeObjectException.ExceedsLimit(
maxMemory, loaded + need);
tail = next(tail);
}
}
private Deflater deflater() {
if (deflater == null)
deflater = new Deflater(config.getCompressionLevel());