|
|
|
@ -208,6 +208,11 @@ public class RowCollection implements Iterable<Row.Entry> {
|
|
|
|
|
return this.rowdef;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected final int maxIntFromLong(long val) {
|
|
|
|
|
if (val >= Integer.MAX_VALUE) return Integer.MAX_VALUE;
|
|
|
|
|
return (int) val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected final long neededSpaceForEnsuredSize(final int elements, final boolean forcegc) {
|
|
|
|
|
assert elements > 0 : "elements = " + elements;
|
|
|
|
|
final long needed = elements * rowdef.objectsize;
|
|
|
|
@ -224,12 +229,12 @@ public class RowCollection implements Iterable<Row.Entry> {
|
|
|
|
|
|
|
|
|
|
protected final void ensureSize(final int elements) throws RowSpaceExceededException {
|
|
|
|
|
if (elements == 0) return;
|
|
|
|
|
final long allocram = neededSpaceForEnsuredSize(elements, true);
|
|
|
|
|
final int allocram = maxIntFromLong(neededSpaceForEnsuredSize(elements, true));
|
|
|
|
|
if (allocram == 0) return;
|
|
|
|
|
assert allocram > chunkcache.length : "wrong alloc computation: allocram = " + allocram + ", chunkcache.length = " + chunkcache.length;
|
|
|
|
|
if (!MemoryControl.request(allocram, true)) throw new RowSpaceExceededException(allocram, "RowCollection grow");
|
|
|
|
|
try {
|
|
|
|
|
final byte[] newChunkcache = new byte[(int) allocram]; // increase space
|
|
|
|
|
final byte[] newChunkcache = new byte[allocram]; // increase space
|
|
|
|
|
System.arraycopy(chunkcache, 0, newChunkcache, 0, chunkcache.length);
|
|
|
|
|
chunkcache = newChunkcache;
|
|
|
|
|
} catch (OutOfMemoryError e) {
|
|
|
|
|