Warning: session_start(): open(/var/lib/php/sessions/sess_m3rqc0g2h5s1r4haenagmqfb1s, 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
sclass ManagedIntObjects_v1_Collector implements IManagedObjectCollector {
ManagedIntObjects_v1 mem;
CompactTreeSet objects = new(intRangeComparatorByStart());
new Set pointers;
IntIntHashMap relocationMap;
new MultiMap> relocationCallbacks;
bool discardFreeListEarly; // saves memory, but ironically makes original memory unusable when compacting fails because of OOM
*(ManagedIntObjects_v1 *mem) {}
// notify collector that there is an object in a location
public void noteObject(int start, int size, IVF1 updateAddress default null) {
objects.add(intRange(start, start+size));
if (updateAddress != null)
relocationCallbacks.add(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);
for i to n:
notePointer(start+1+i);
}
int sizeNeeded() {
ret totalIntRangesLength_int(objects);
}
void collectAndCompact() {
int sizeNeeded = sizeNeeded();
if (mem.size() == sizeNeeded) ret;
if (discardFreeListEarly) mem.freeList.clear();
// reserve new memory
int freePtr = mem.reservedSpaceAtBeginning();
int[] newMem = new[freePtr+sizeNeeded];
// copy all the objects, fill relocationMap
for (IntRange r : objects) {
int oldPtr = r.start, newPtr = freePtr;
if (oldPtr != newPtr) {
relocationMap.put(oldPtr, newPtr);
for (IVF1 f : relocationCallbacks.get(oldPtr))
f.get(freePtr);
}
arraycopy(mem.mem, r.start, newMem, freePtr, r.length());
freePtr += r.length();
}
// update the pointers
for (int pointerAddr : pointers) {
// find enclosing object
IntRange obj = objects.floor(IntRange(pointerAddr, pointerAddr));
if (obj == null) continue 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) continue;
int newTarget = relocationMap.getIfAbsent(target, -1);
if (newTarget >= 0)
newMem[newPointerAddr] = newTarget;
}
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);
}
}