コード例 #1
0
        void CollectData64()
        {
            if (TranslatePointer(memHeader64->RootFuncInfoAddress) == null)
            {
                return;
            }
            ulong now = GetRdtsc();
            ThreadLocalData64 * item      = (ThreadLocalData64 *)TranslatePointer(memHeader64->LastThreadListItem);
            List <Stack <int> > stackList = new List <Stack <int> >();

            while (item != null)
            {
                StackEntry64 *entry   = (StackEntry64 *)TranslatePointer(item->Stack.Array);
                Stack <int>   itemIDs = new Stack <int>();
                while (entry != null && entry <= (StackEntry64 *)TranslatePointer(item->Stack.TopPointer))
                {
                    FunctionInfo *function = (FunctionInfo *)TranslatePointer(entry->Function);
                    itemIDs.Push(function->Id);
                    function->TimeSpent += now - entry->StartTime;
                    entry++;
                }
                stackList.Add(itemIDs);
                item = (ThreadLocalData64 *)TranslatePointer(item->Predecessor);
            }
            if (enableDC)
            {
                AddDataset(fullView.Pointer, memHeader64->NativeAddress + memHeader64->HeapOffset, memHeader64->Allocator.startPos - memHeader64->NativeAddress, memHeader64->Allocator.pos - memHeader64->Allocator.startPos, isFirstDC, memHeader64->RootFuncInfoAddress);
                isFirstDC = false;
            }
            ZeroMemory(new IntPtr(TranslatePointer(memHeader64->Allocator.startPos)), new IntPtr(memHeader64->Allocator.pos - memHeader64->Allocator.startPos));
            memHeader64->Allocator.pos = memHeader64->Allocator.startPos;
            Allocator64.ClearFreeList(&memHeader64->Allocator);
            FunctionInfo *root = CreateFunctionInfo(0, 0, stackList.Count);

            memHeader64->RootFuncInfoAddress = TranslatePointerBack64(root);
            item = (ThreadLocalData64 *)TranslatePointer(memHeader64->LastThreadListItem);
            now  = GetRdtsc();
            foreach (Stack <int> thread in stackList)
            {
                FunctionInfo *child = null;
                StackEntry64 *entry = (StackEntry64 *)TranslatePointer(item->Stack.TopPointer);
                while (thread.Count > 0)
                {
                    FunctionInfo *stackItem = CreateFunctionInfo(thread.Pop(), 0, child != null ? 1 : 0);
                    if (child != null)
                    {
                        FunctionInfo.AddOrUpdateChild64(stackItem, child, this);
                    }
                    entry->Function  = TranslatePointerBack64(stackItem);
                    entry->StartTime = now;
                    entry--;
                    child = stackItem;
                }
                if (child != null)
                {
                    FunctionInfo.AddOrUpdateChild64(root, child, this);
                }
                item = (ThreadLocalData64 *)TranslatePointer(item->Predecessor);
            }
        }
コード例 #2
0
		public static void ClearFreeList(Allocator64* a)
		{
			for (int i = 0; i < 32; i++) {
				a->freeList[i] = 0;
			}
		}