private static void RemoveObjectToCleanup(ObjectToCleanup *objToCleanupPtr) { ObjectToCleanup *prevPtr = objToCleanupPtr->prevPtr; ObjectToCleanup *nextPtr = objToCleanupPtr->nextPtr; if (prevPtr != null) { prevPtr->nextPtr = nextPtr; } nextPtr->prevPtr = prevPtr; if (CleanupList == objToCleanupPtr) { if (prevPtr != null) { CleanupList = prevPtr; } else { CleanupList = nextPtr; } } Heap.Free(objToCleanupPtr); }
private static void AddObjectToCleanup(GCHeader *objHeaderPtr, void *objPtr) { EnterCritical("AddObjectToCleanup"); try { ObjectToCleanup *newObjToCleanupPtr = (ObjectToCleanup *)Heap.AllocZeroed((uint)sizeof(ObjectToCleanup), "GC : AddObjectToCleanup"); newObjToCleanupPtr->objHeaderPtr = objHeaderPtr; newObjToCleanupPtr->objPtr = objPtr; if (CleanupList != null) { newObjToCleanupPtr->prevPtr = CleanupList; CleanupList->nextPtr = newObjToCleanupPtr; } else { newObjToCleanupPtr->prevPtr = null; newObjToCleanupPtr->nextPtr = null; } CleanupList = newObjToCleanupPtr; } finally { ExitCritical(); } }
public static void Cleanup() { if (!Enabled /*|| InsideGC*/) { return; } //try { InsideGC = true; #if GC_TRACE int startNumObjs = NumObjs; int startNumStrings = NumStrings; #endif ObjectToCleanup *currObjToCleanupPtr = CleanupList; ObjectToCleanup *prevObjToCleanupPtr = null; while (currObjToCleanupPtr != null) { GCHeader *objHeaderPtr = currObjToCleanupPtr->objHeaderPtr; void * objPtr = currObjToCleanupPtr->objPtr; if (objHeaderPtr->RefCount <= 0) { Testing2.Object obj = (Testing2.Object)Utilities.ObjectUtilities.GetObject(objPtr); if (obj is Testing2.String) { NumStrings--; } Heap.Free(objHeaderPtr); NumObjs--; } prevObjToCleanupPtr = currObjToCleanupPtr; currObjToCleanupPtr = currObjToCleanupPtr->prevPtr; RemoveObjectToCleanup(prevObjToCleanupPtr); } InsideGC = false; #if GC_TRACE PrintCleanupData(startNumObjs, startNumStrings); #endif } //finally { } }
private static void RemoveObjectToCleanup(ObjectToCleanup *objToCleanupPtr) { ObjectToCleanup *prevPtr = objToCleanupPtr->prevPtr; ObjectToCleanup *nextPtr = objToCleanupPtr->nextPtr; prevPtr->nextPtr = nextPtr; nextPtr->prevPtr = prevPtr; if (CleanupList == objToCleanupPtr) { CleanupList = prevPtr; } Heap.Free(objToCleanupPtr); }
private static void AddObjectToCleanup(GCHeader *objHeaderPtr, void *objPtr) { //try { ObjectToCleanup *newObjToCleanupPtr = (ObjectToCleanup *)Heap.Alloc((uint)sizeof(ObjectToCleanup), "GC : AddObjectToCleanup"); newObjToCleanupPtr->objHeaderPtr = objHeaderPtr; newObjToCleanupPtr->objPtr = objPtr; newObjToCleanupPtr->prevPtr = CleanupList; CleanupList->nextPtr = newObjToCleanupPtr; CleanupList = newObjToCleanupPtr; } //finally { } }
private static void RemoveObjectToCleanup(GCHeader *objHeaderPtr) { //try { ObjectToCleanup *currObjToCleanupPtr = CleanupList; while (currObjToCleanupPtr != null) { if (currObjToCleanupPtr->objHeaderPtr == objHeaderPtr) { RemoveObjectToCleanup(currObjToCleanupPtr); return; } currObjToCleanupPtr = currObjToCleanupPtr->prevPtr; } } //finally { } }
private static void RemoveObjectToCleanup(GCHeader *objHeaderPtr) { EnterCritical("RemoveObjectToCleanup"); try { ObjectToCleanup *currObjToCleanupPtr = CleanupList; while (currObjToCleanupPtr != null) { if (currObjToCleanupPtr->objHeaderPtr == objHeaderPtr) { RemoveObjectToCleanup(currObjToCleanupPtr); return; } currObjToCleanupPtr = currObjToCleanupPtr->prevPtr; } } finally { ExitCritical(); } }
private static void RemoveObjectToCleanup(ObjectToCleanup* objToCleanupPtr) { ObjectToCleanup* prevPtr = objToCleanupPtr->prevPtr; ObjectToCleanup* nextPtr = objToCleanupPtr->nextPtr; prevPtr->nextPtr = nextPtr; nextPtr->prevPtr = prevPtr; if(CleanupList == objToCleanupPtr) { CleanupList = prevPtr; } Heap.Free(objToCleanupPtr); }
private static void AddObjectToCleanup(GCHeader* objHeaderPtr, void* objPtr) { //try { ObjectToCleanup* newObjToCleanupPtr = (ObjectToCleanup*)Heap.Alloc((uint)sizeof(ObjectToCleanup), "GC : AddObjectToCleanup"); newObjToCleanupPtr->objHeaderPtr = objHeaderPtr; newObjToCleanupPtr->objPtr = objPtr; newObjToCleanupPtr->prevPtr = CleanupList; CleanupList->nextPtr = newObjToCleanupPtr; CleanupList = newObjToCleanupPtr; } //finally { } }
private static void RemoveObjectToCleanup(ObjectToCleanup* objToCleanupPtr) { ObjectToCleanup* prevPtr = objToCleanupPtr->prevPtr; ObjectToCleanup* nextPtr = objToCleanupPtr->nextPtr; if (prevPtr != null) { prevPtr->nextPtr = nextPtr; } nextPtr->prevPtr = prevPtr; if(CleanupList == objToCleanupPtr) { if (prevPtr != null) { CleanupList = prevPtr; } else { CleanupList = nextPtr; } } Heap.Free(objToCleanupPtr); }
private static void AddObjectToCleanup(GCHeader* objHeaderPtr, void* objPtr) { EnterCritical("AddObjectToCleanup"); try { ObjectToCleanup* newObjToCleanupPtr = (ObjectToCleanup*)Heap.AllocZeroed((uint)sizeof(ObjectToCleanup), "GC : AddObjectToCleanup"); newObjToCleanupPtr->objHeaderPtr = objHeaderPtr; newObjToCleanupPtr->objPtr = objPtr; if (CleanupList != null) { newObjToCleanupPtr->prevPtr = CleanupList; CleanupList->nextPtr = newObjToCleanupPtr; } else { newObjToCleanupPtr->prevPtr = null; newObjToCleanupPtr->nextPtr = null; } CleanupList = newObjToCleanupPtr; } finally { ExitCritical(); } }
public static void Cleanup() { if (!Enabled /*|| InsideGC*/) { return; } EnterCritical("Cleanup"); try { InsideGC = true; #if GC_TRACE int startNumObjs = NumObjs; int startNumStrings = NumStrings; #endif if (OutputTrace) { BasicConsole.WriteLine(" > Inside GC & Cleaning..."); } ObjectToCleanup *currObjToCleanupPtr = CleanupList; ObjectToCleanup *prevObjToCleanupPtr = null; if (OutputTrace) { BasicConsole.WriteLine(" > Got list..."); } while (currObjToCleanupPtr != null) { if (OutputTrace) { BasicConsole.WriteLine(" > Item not null."); FOS_System.String str1 = " > Item: 0x "; FOS_System.String str2 = " > Prev: 0x "; ExceptionMethods.FillString((uint)currObjToCleanupPtr, 18, str1); ExceptionMethods.FillString((uint)currObjToCleanupPtr->prevPtr, 18, str2); BasicConsole.WriteLine(str1); BasicConsole.WriteLine(str2); } GCHeader *objHeaderPtr = currObjToCleanupPtr->objHeaderPtr; void * objPtr = currObjToCleanupPtr->objPtr; if (OutputTrace) { BasicConsole.WriteLine(" > Got object handles."); } if (objHeaderPtr->RefCount <= 0) { if (OutputTrace) { BasicConsole.WriteLine(" > Ref count zero or lower."); } FOS_System.Object obj = (FOS_System.Object)Utilities.ObjectUtilities.GetObject(objPtr); if (OutputTrace) { BasicConsole.WriteLine(" > Got object."); } if (obj is FOS_System.String) { if (OutputTrace) { BasicConsole.WriteLine(" > (It's a string)."); } NumStrings--; } else { if (OutputTrace) { BasicConsole.WriteLine(" > (It's NOT a string)."); } NumObjs--; } if (OutputTrace) { BasicConsole.WriteLine(" > About to free object..."); } Heap.Free(objHeaderPtr); if (OutputTrace) { BasicConsole.WriteLine(" > Object freed."); } if (OutputTrace) { BasicConsole.WriteLine(" > Done."); } } if (OutputTrace) { BasicConsole.WriteLine(" > Shifting to next item..."); } prevObjToCleanupPtr = currObjToCleanupPtr; currObjToCleanupPtr = currObjToCleanupPtr->prevPtr; if (OutputTrace) { BasicConsole.WriteLine(" > Removing object to cleanup..."); } RemoveObjectToCleanup(prevObjToCleanupPtr); if (OutputTrace) { BasicConsole.WriteLine(" > Done."); BasicConsole.WriteLine(" > Loop back..."); } } InsideGC = false; #if GC_TRACE if (OutputTrace) { PrintCleanupData(startNumObjs, startNumStrings); } #endif } finally { ExitCritical(); } }