| 465 | } |
| 466 | |
| 467 | static void profilerDataDumpRecurse(ProfilerData *data, char *buffer, U32 bufferLen, F64 totalTime) |
| 468 | { |
| 469 | // dump out this one: |
| 470 | Con::printf("%7.3f %7.3f %8d %s%s", |
| 471 | 100 * data->mTotalTime / totalTime, |
| 472 | 100 * (data->mTotalTime - data->mSubTime) / totalTime, |
| 473 | data->mInvokeCount, |
| 474 | buffer, |
| 475 | data->mRoot ? data->mRoot->mName : "ROOT" ); |
| 476 | data->mTotalTime = 0; |
| 477 | data->mSubTime = 0; |
| 478 | data->mInvokeCount = 0; |
| 479 | |
| 480 | buffer[bufferLen] = ' '; |
| 481 | buffer[bufferLen+1] = ' '; |
| 482 | buffer[bufferLen+2] = 0; |
| 483 | // sort data's children... |
| 484 | ProfilerData *list = NULL; |
| 485 | while(data->mFirstChild) |
| 486 | { |
| 487 | ProfilerData *ins = data->mFirstChild; |
| 488 | data->mFirstChild = ins->mNextSibling; |
| 489 | ProfilerData **walk = &list; |
| 490 | while(*walk && (*walk)->mTotalTime > ins->mTotalTime) |
| 491 | walk = &(*walk)->mNextSibling; |
| 492 | ins->mNextSibling = *walk; |
| 493 | *walk = ins; |
| 494 | } |
| 495 | data->mFirstChild = list; |
| 496 | while(list) |
| 497 | { |
| 498 | if(list->mInvokeCount) |
| 499 | profilerDataDumpRecurse(list, buffer, bufferLen + 2, totalTime); |
| 500 | list = list->mNextSibling; |
| 501 | } |
| 502 | buffer[bufferLen] = 0; |
| 503 | } |
| 504 | |
| 505 | static void profilerDataDumpRecurseFile(ProfilerData *data, char *buffer, U32 bufferLen, F64 totalTime, FileStream& fws) |
| 506 | { |