void TaskTimer::printStats() { CharDoubleMap flatProfile; double total=0; printf("Tree Profile:\n Incl-Abs Incl-%% Self-Abs Self-%% Name\n"); #ifdef _OPENMP total = printThreadTreeInfo(flatProfile); #else TaskTimer *root = (stack.size()>0 ? stack.front() : 0); if (root) { total += root->value(); root->printStats(0, root->value(), flatProfile); } #endif printf("Flat Profile:\n Incl-Abs Incl-%% Self-Abs Self-%% Name\n"); for (CharDoubleMap::iterator it=flatProfile.begin(); it!=flatProfile.end(); ++it) { printf("% 10.1fms % 7.2f%% %10.1fms % 7.2f%% %s\n", it->second.incl, 100.0f*it->second.incl/total, it->second.self, 100.0f*it->second.self/total, it->first); } }
void TaskTimer::pushTask(const char *task) { #ifdef _OPENMP TaskStack &stack = thread_stacks[omp_get_thread_num()]; #endif if (stack.size() == 0) stack.push_back(new TaskTimer("Other/Idle")); stack.push_back(stack.back()->setTask(task)); }
void TaskTimer::popTask() { #ifdef _OPENMP TaskStack &stack = thread_stacks[omp_get_thread_num()]; #endif // it is forbidden to pop Root assert(stack.size()>1); stack.back()->stop(); stack.pop_back(); stack.back()->resume(); }
int cliStackInfo(const char ** argv) { int tid = 0; if (toInt(argv, 1, &tid) > 0) { int available = 0; int total = 0; switch(tid) { case MENU_TASK_INDEX: total = menusStack.size(); available = menusStack.available(); break; case MIXER_TASK_INDEX: total = mixerStack.size(); available = mixerStack.available(); break; case AUDIO_TASK_INDEX: total = audioStack.size(); available = audioStack.available(); break; case CLI_TASK_INDEX: total = cliStack.size(); available = cliStack.available(); break; case MAIN_TASK_INDEX: total = stackSize() * 4; available = stackAvailable(); break; default: break; } serialPrint("%d available (%d total)", available, total); } else { serialPrint("%s: Invalid argument \"%s\"", argv[0], argv[1]); } return 0; }