CProfileIterator * CProfileManager::Get_Iterator( void ) { int threadIndex = btQuickprofGetCurrentThreadIndex2(); if (threadIndex<0) return 0; return new CProfileIterator( &gRoots[threadIndex]); }
CProfileIterator * CProfileManager::Get_Iterator( void ) { int threadIndex = btQuickprofGetCurrentThreadIndex2(); if ((threadIndex<0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT) return 0; return new CProfileIterator( &gRoots[threadIndex]); }
/*********************************************************************************************** * CProfileManager::Reset -- Reset the contents of the profiling system * * * * This resets everything except for the tree structure. All of the timing data is reset. * *=============================================================================================*/ void CProfileManager::Reset( void ) { gProfileClock.reset(); int threadIndex = btQuickprofGetCurrentThreadIndex2(); if (threadIndex<0) return; gRoots[threadIndex].Reset(); gRoots[threadIndex].Call(); FrameCounter = 0; Profile_Get_Ticks(&ResetTime); }
/*********************************************************************************************** * CProfileManager::Reset -- Reset the contents of the profiling system * * * * This resets everything except for the tree structure. All of the timing data is reset. * *=============================================================================================*/ void CProfileManager::Reset( void ) { gProfileClock.reset(); int threadIndex = btQuickprofGetCurrentThreadIndex2(); if ((threadIndex<0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT) return; gRoots[threadIndex].Reset(); gRoots[threadIndex].Call(); FrameCounter = 0; Profile_Get_Ticks(&ResetTime); }
/*********************************************************************************************** * CProfileManager::Stop_Profile -- Stop timing and record the results. * *=============================================================================================*/ void CProfileManager::Stop_Profile( void ) { int threadIndex = btQuickprofGetCurrentThreadIndex2(); if (threadIndex<0) return; // Return will indicate whether we should back up to our parent (we may // be profiling a recursive function) if (gCurrentNodes[threadIndex]->Return()) { gCurrentNodes[threadIndex] = gCurrentNodes[threadIndex]->Get_Parent(); } }
/*********************************************************************************************** * CProfileManager::Start_Profile -- Begin a named profile * * * * Steps one level deeper into the tree, if a child already exists with the specified name * * then it accumulates the profiling; otherwise a new child node is added to the profile tree. * * * * INPUT: * * name - name of this profiling record * * * * WARNINGS: * * The string used is assumed to be a static string; pointer compares are used throughout * * the profiling code for efficiency. * *=============================================================================================*/ void CProfileManager::Start_Profile( const char * name ) { int threadIndex = btQuickprofGetCurrentThreadIndex2(); if (threadIndex<0) return; if (name != gCurrentNodes[threadIndex]->Get_Name()) { gCurrentNodes[threadIndex] = gCurrentNodes[threadIndex]->Get_Sub_Node( name ); } gCurrentNodes[threadIndex]->Call(); }
/*********************************************************************************************** * CProfileManager::Start_Profile -- Begin a named profile * * * * Steps one level deeper into the tree, if a child already exists with the specified name * * then it accumulates the profiling; otherwise a new child node is added to the profile tree. * * * * INPUT: * * name - name of this profiling record * * * * WARNINGS: * * The string used is assumed to be a static string; pointer compares are used throughout * * the profiling code for efficiency. * *=============================================================================================*/ void CProfileManager::Start_Profile( const char * name ) { int threadIndex = btQuickprofGetCurrentThreadIndex2(); if ((threadIndex<0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT) return; if (name != gCurrentNodes[threadIndex]->Get_Name()) { gCurrentNodes[threadIndex] = gCurrentNodes[threadIndex]->Get_Sub_Node( name ); } gCurrentNodes[threadIndex]->Call(); }
void MyLeaveProfileZoneFunc() { if (gProfileDisabled) return; #ifndef BT_NO_PROFILE int threadId = btQuickprofGetCurrentThreadIndex2(); if (threadId < 0 || threadId >= BT_QUICKPROF_MAX_THREAD_COUNT) return; if (gStackDepths[threadId] <= 0) { return; } gStackDepths[threadId]--; const char* name = gFuncNames[threadId][gStackDepths[threadId]]; unsigned long long int startTime = gStartTimes[threadId][gStackDepths[threadId]]; unsigned long long int endTime = clk.getTimeNanoseconds(); gTimings[threadId].addTiming(name, threadId, startTime, endTime); #endif //BT_NO_PROFILE }
void MyEnterProfileZoneFunc(const char* msg) { if (gProfileDisabled) return; #ifndef BT_NO_PROFILE int threadId = btQuickprofGetCurrentThreadIndex2(); if (threadId < 0 || threadId >= BT_QUICKPROF_MAX_THREAD_COUNT) return; if (gStackDepths[threadId] >= MAX_NESTING) { btAssert(0); return; } gFuncNames[threadId][gStackDepths[threadId]] = msg; gStartTimes[threadId][gStackDepths[threadId]] = clk.getTimeNanoseconds(); if (gStartTimes[threadId][gStackDepths[threadId]] <= gStartTimes[threadId][gStackDepths[threadId] - 1]) { gStartTimes[threadId][gStackDepths[threadId]] = 1 + gStartTimes[threadId][gStackDepths[threadId] - 1]; } gStackDepths[threadId]++; #endif }