diff --git a/BeefRT/dbg/gc.cpp b/BeefRT/dbg/gc.cpp index 77de08c6..d9b6bef5 100644 --- a/BeefRT/dbg/gc.cpp +++ b/BeefRT/dbg/gc.cpp @@ -602,6 +602,7 @@ BFGC::BFGC() mPaused = false; mShutdown = false; mForceDecommit = false; + mCollectFailed = false; mLastCollectFrame = 0; mSkipMark = false; mGracelessShutdown = false; @@ -979,6 +980,11 @@ void BFGC::SweepSpan(tcmalloc_obj::Span* span, int expectedStartPage) mCurSweepFoundPermanentCount++; int markId = objectFlags & BF_OBJECTFLAG_MARK_ID_MASK; + if ((mCollectFailed) && (markId != mCurMarkId)) + { + obj->mObjectFlags = (BfObjectFlags)((obj->mObjectFlags & ~BF_OBJECTFLAG_MARK_ID_MASK) | mCurMarkId); + markId = mCurMarkId; + } BF_ASSERT(markId != invalidMarkId); @@ -1471,6 +1477,12 @@ bool BFGC::ScanThreads() BP_ZONE("BfpThread_GetIntRegisters"); BfpThread_GetIntRegisters(thread->mThreadHandle, &stackPtr, regVals, ®ValCount, &threadResult); } + if (threadResult != BfpThreadResult_Ok) + { + mCollectFailed = true; + return false; + } + BF_ASSERT(threadResult == BfpThreadResult_Ok); void** threadLoadAddressMap = (void**)((_TEB*)thread->mTEB)->ThreadLocalStorage; @@ -2388,6 +2400,7 @@ void BFGC::PerformCollection() #else Beefy::AutoCrit autoCrit(mCritSect); mAllocSinceLastGC = 0; + mCollectFailed = false; // This was old "emergency" debugging code to make sure we weren't doing a malloc in the GC code, // but it's a multi-threaded race condition diff --git a/BeefRT/dbg/gc.h b/BeefRT/dbg/gc.h index 15ccc2b5..cc36270b 100644 --- a/BeefRT/dbg/gc.h +++ b/BeefRT/dbg/gc.h @@ -288,6 +288,7 @@ public: bool mPaused; bool mShutdown; bool mWaitingForGC; // GC.Collect sets this + bool mCollectFailed; int mAllocSinceLastGC; // Added to on alloc and subtracted from on nursery cleanup int mFreeSinceLastGC; diff --git a/BeefySysLib/platform/win/Platform.cpp b/BeefySysLib/platform/win/Platform.cpp index ac306d16..793f2c80 100644 --- a/BeefySysLib/platform/win/Platform.cpp +++ b/BeefySysLib/platform/win/Platform.cpp @@ -2190,7 +2190,6 @@ BFP_EXPORT void BFP_CALLTYPE BfpThread_GetIntRegisters(BfpThread* thread, intptr if (!success) { int error = GetLastError(); - BF_DBG_FATAL("Failed BfpThread_GetIntRegisters"); OUTRESULT(BfpThreadResult_UnknownError); return; }