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); } }
public static void ClearFreeList(Allocator64* a) { for (int i = 0; i < 32; i++) { a->freeList[i] = 0; } }