Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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();
            }
        }
Ejemplo n.º 3
0
        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
            {
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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
            {
            }
        }
Ejemplo n.º 6
0
 private static void RemoveObjectToCleanup(GCHeader *objHeaderPtr)
 {
     //try
     {
         ObjectToCleanup *currObjToCleanupPtr = CleanupList;
         while (currObjToCleanupPtr != null)
         {
             if (currObjToCleanupPtr->objHeaderPtr == objHeaderPtr)
             {
                 RemoveObjectToCleanup(currObjToCleanupPtr);
                 return;
             }
             currObjToCleanupPtr = currObjToCleanupPtr->prevPtr;
         }
     }
     //finally
     {
     }
 }
Ejemplo n.º 7
0
        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();
            }
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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
            {
            }
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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();
            }
        }
Ejemplo n.º 12
0
        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();
            }
        }