Warning: session_start(): open(/var/lib/php/sessions/sess_cmvdg08a9dt0h011203nn1646o, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!include once #1027304 // Eclipse Collections
// Note: Pointers can't point _inside_ of objects
sclass ManagedIntObjects_v1_Collector implements IManagedObjectCollector {
ManagedIntObjects_v1 mem;
CompactTreeSet objects = new(intRangeComparatorByStart());
new IntHashSet pointers;
new LongHashSet pointerRanges; // IntRanges as longs
new IntIntHashMap relocationMap;
int[] newMem;
new Map> relocationCallbacks;
bool discardFreeListEarly; // saves memory, but ironically makes original memory unusable when compacting fails because of OOM
bool verbose = true;
*(ManagedIntObjects_v1 *mem) {}
// notify collector that there is an object in a location
public void noteObject(int start, int size, IVF1 updateAddress default null) {
printVars("noteObject", +start, +size);
objects.add(intRange(start, start+size));
if (updateAddress != null)
relocationCallbacks.put(start, updateAddress);
}
// notify collector that there is a pointer in a location
public void notePointer(int addr) {
if (addr != 0)
pointers.add(addr);
}
// notify collector that there is a pointer array in a location
public void notePointerArray(int start) {
if (start == 0) ret;
int n = mem.get(start);
noteObject(start, n+1);
notePointerRange(IntRange(start+1, start+1+n));
}
// notify collector that there is an int array in a location
public void noteIntArray(int start) {
if (start == 0) ret;
int n = mem.get(start);
noteObject(start, n+1);
}
void notePointerRange(IntRange r) {
pointerRanges.add(intRangeToLong(r));
}
int sizeNeeded() {
ret mem.reservedSpaceAtBeginning()+totalIntRangesLength_int(objects);
}
void collectAndCompact() {
int sizeNeeded = sizeNeeded();
if (mem.size() == sizeNeeded) ret;
if (discardFreeListEarly) mem.freeList.clear();
// reserve new memory
print("Reserving " + toM(sizeNeeded*(long) mem.wordSizeInBytes()) + " MB");
newMem = new int[sizeNeeded];
// copy all the objects, fill relocationMap
print("Copying " + nObjects(objects) + " (" + n2(relocationCallbacks, "callback") + ")");
int freePtr = mem.reservedSpaceAtBeginning();
for (IntRange r : objects) {
int oldPtr = r.start, newPtr = freePtr;
if (oldPtr != newPtr) {
relocationMap.put(oldPtr, newPtr);
callF(relocationCallbacks.get(oldPtr), freePtr);
}
arraycopy(mem.mem, r.start, newMem, freePtr, r.length());
freePtr += r.length();
}
relocationCallbacks.clear();
// update the pointers
print("Updating " + n2(pointers.size(), "pointer"));
IntIterator itPointers = pointers.intIterator();
while (itPointers.hasNext())
movePointer(itPointers.next());
print("Updating " + n2(pointerRanges.size(), "pointer range"));
var itPointerRanges = pointerRanges.longIterator();
while (itPointerRanges.hasNext()) {
IntRange r = longToIntRange(itPointerRanges.next());
for (int i = r.start; i < r.end; i++)
movePointer(i);
}
print("Managed GC done");
mem.mem = newMem;
if (!discardFreeListEarly) mem.freeList.clear();
}
// call after collectAndCompact to get new location of objects
public int getNewLocation(int addr) {
ret relocationMap.getIfAbsent(addr, addr);
}
void movePointer(int pointerAddr) {
// find enclosing object
IntRange obj = objects.floor(IntRange(pointerAddr, pointerAddr));
if (obj == null) ret with print("Pointer without object");
int newObjAddr = relocationMap.getIfAbsent(obj.start, obj.start);
int newPointerAddr = newObjAddr-obj.start+pointerAddr;
// find target, update pointer
int target = mem.get(pointerAddr);
if (target == 0) ret;
int newTarget = relocationMap.getIfAbsent(target, -1);
if (newTarget >= 0)
newMem[newPointerAddr] = newTarget;
}
public void noteString(int addr, IVF1 updateAddress default null) {
if (addr == 0) ret;
int n = (mem.get(addr)+3)/4;
noteObject(addr, n+1, updateAddress);
}
}