From aa7cff43dd89e7a1f6e279da06341859aa3989ef Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 24 Dec 2019 10:30:42 -0800 Subject: [PATCH] Avoiding suspending BeefPerf thread --- BeefRT/dbg/gc.cpp | 35 ++++++++++++++++++++++++++++------- BeefRT/dbg/gc.h | 2 ++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/BeefRT/dbg/gc.cpp b/BeefRT/dbg/gc.cpp index 2e407131..e5f9fc03 100644 --- a/BeefRT/dbg/gc.cpp +++ b/BeefRT/dbg/gc.cpp @@ -216,6 +216,16 @@ BFGC::ThreadInfo::~ThreadInfo() BfpThread_Release(mThreadHandle); } +bool BFGC::ThreadInfo::WantsSuspend() +{ +#ifndef BP_DISABLED + BfpThreadId threadId = BpManager::Get()->mThreadId; + return threadId != (BfpThreadId)mThreadId; +#else + return true; +#endif +} + ////////////////////////////////////////////////////////////////////////// #ifdef BF_GC_LOG_ENABLED @@ -1371,7 +1381,7 @@ bool BFGC::ScanThreads() continue; } - BP_ZONE("ThreadCollect"); + BP_ZONE_F("ThreadCollect %d", thread->mThreadId); //Beefy::DebugTimeGuard suspendTimeGuard(10, "ThreadSuspend"); DWORD result = 0; @@ -1405,16 +1415,24 @@ bool BFGC::ScanThreads() BFLOG2(GCLog::EVENT_SCAN_THREAD, (intptr)thread, (intptr)thread->mThreadId); - for (auto obj : thread->mStackMarkableObjects) + // { - MarkMembers(obj); + BP_ZONE("StackMarkableObjects"); + for (auto obj : thread->mStackMarkableObjects) + { + MarkMembers(obj); + } } intptr regVals[64]; intptr stackPtr = 0; BfpThreadResult threadResult; int regValCount = 64; - BfpThread_GetIntRegisters(thread->mThreadHandle, &stackPtr, regVals, ®ValCount, &threadResult); + /// + { + BP_ZONE("BfpThread_GetIntRegisters"); + BfpThread_GetIntRegisters(thread->mThreadHandle, &stackPtr, regVals, ®ValCount, &threadResult); + } BF_ASSERT(threadResult == BfpThreadResult_Ok); void** threadLoadAddressMap = (void**)((_TEB*)thread->mTEB)->ThreadLocalStorage; @@ -1432,7 +1450,10 @@ bool BFGC::ScanThreads() int length = thread->mStackStart - stackPtr; AdjustStackPtr(stackPtr, length); - ConservativeScan((void*)stackPtr, length); + { + BP_ZONE("ConservativeScan stack"); + ConservativeScan((void*)stackPtr, length); + } mQueueMarkObjects = false; if (mDoStackDeepMark) @@ -2260,7 +2281,7 @@ void BFGC::SuspendThreads() auto curThreadId = GetCurrentThreadId(); for (auto thread : mThreadList) { - if ((thread->mThreadId != curThreadId) && (thread->mRunning)) + if ((thread->mThreadId != curThreadId) && (thread->mRunning) && (thread->WantsSuspend())) { // We must lock this before suspending so we can access mStackMarkableObjects // Otherwise we could deadlock @@ -2279,7 +2300,7 @@ void BFGC::ResumeThreads() auto curThreadId = GetCurrentThreadId(); for (auto thread : mThreadList) { - if ((thread->mThreadId != curThreadId) && (thread->mRunning)) + if ((thread->mThreadId != curThreadId) && (thread->mRunning) && (thread->WantsSuspend())) { // Previously locked in SuspendThreads thread->mCritSect.Unlock(); diff --git a/BeefRT/dbg/gc.h b/BeefRT/dbg/gc.h index 4a5cd243..cc43b8ca 100644 --- a/BeefRT/dbg/gc.h +++ b/BeefRT/dbg/gc.h @@ -186,6 +186,8 @@ public: } ~ThreadInfo(); + + bool WantsSuspend(); }; struct RawLeakInfo