| 636 | ////////////////////////////////////////////////////////////////////////// |
| 637 | |
| 638 | static void NTAPI FlsFreeFunc(void* ptr) |
| 639 | { |
| 640 | BpThreadInfo* threadInfo = (BpThreadInfo*)ptr; |
| 641 | |
| 642 | auto bpManager = BpManager::Get(); |
| 643 | AutoCrit autoCrit(bpManager->mCritSect); |
| 644 | |
| 645 | threadInfo->mHasTerminated = true; |
| 646 | threadInfo->RemoveThread(); |
| 647 | |
| 648 | if (!bpManager->mThreadRunning) |
| 649 | { |
| 650 | bpManager->mThreadInfos.Remove(threadInfo); |
| 651 | delete threadInfo; |
| 652 | |
| 653 | // It's possible that other thread-specific destructors will occur after this call, which may use BeefPerf, |
| 654 | // and in that case we will re-add this thread info |
| 655 | BpManager::sBpThreadInfo = NULL; |
| 656 | } |
| 657 | } |
| 658 | |
| 659 | BpManager::BpManager() : mShutdownEvent(true), mTLSDtor(&FlsFreeFunc) |
| 660 | { |
nothing calls this directly
no test coverage detected