Просмотр исходного кода

Allow BfpThread_GetIntRegisters to fail without crashing

Brian Fiete 4 лет назад
Родитель
Сommit
3adf9a144e
3 измененных файлов с 14 добавлено и 1 удалено
  1. 13 0
      BeefRT/dbg/gc.cpp
  2. 1 0
      BeefRT/dbg/gc.h
  3. 0 1
      BeefySysLib/platform/win/Platform.cpp

+ 13 - 0
BeefRT/dbg/gc.cpp

@@ -602,6 +602,7 @@ BFGC::BFGC()
 	mPaused = false;
 	mPaused = false;
 	mShutdown = false;
 	mShutdown = false;
 	mForceDecommit = false;
 	mForceDecommit = false;
+	mCollectFailed = false;
 	mLastCollectFrame = 0;
 	mLastCollectFrame = 0;
 	mSkipMark = false;	
 	mSkipMark = false;	
 	mGracelessShutdown = false;
 	mGracelessShutdown = false;
@@ -979,6 +980,11 @@ void BFGC::SweepSpan(tcmalloc_obj::Span* span, int expectedStartPage)
 				mCurSweepFoundPermanentCount++;
 				mCurSweepFoundPermanentCount++;
             
             
 			int markId = objectFlags & BF_OBJECTFLAG_MARK_ID_MASK;
 			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);
 			BF_ASSERT(markId != invalidMarkId);
 
 
@@ -1471,6 +1477,12 @@ bool BFGC::ScanThreads()
 			BP_ZONE("BfpThread_GetIntRegisters");
 			BP_ZONE("BfpThread_GetIntRegisters");
 			BfpThread_GetIntRegisters(thread->mThreadHandle, &stackPtr, regVals, &regValCount, &threadResult);
 			BfpThread_GetIntRegisters(thread->mThreadHandle, &stackPtr, regVals, &regValCount, &threadResult);
 		}
 		}
+		if (threadResult != BfpThreadResult_Ok)
+		{
+			mCollectFailed = true;
+			return false;
+		}
+
 		BF_ASSERT(threadResult == BfpThreadResult_Ok);
 		BF_ASSERT(threadResult == BfpThreadResult_Ok);
 		
 		
 		void** threadLoadAddressMap = (void**)((_TEB*)thread->mTEB)->ThreadLocalStorage;
 		void** threadLoadAddressMap = (void**)((_TEB*)thread->mTEB)->ThreadLocalStorage;
@@ -2388,6 +2400,7 @@ void BFGC::PerformCollection()
 #else
 #else
 	Beefy::AutoCrit autoCrit(mCritSect);
 	Beefy::AutoCrit autoCrit(mCritSect);
 	mAllocSinceLastGC = 0;
 	mAllocSinceLastGC = 0;
+	mCollectFailed = false;
 
 
 	// This was old "emergency" debugging code to make sure we weren't doing a malloc in the GC code,
 	// 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
 	//  but it's a multi-threaded race condition

+ 1 - 0
BeefRT/dbg/gc.h

@@ -288,6 +288,7 @@ public:
 	bool mPaused;
 	bool mPaused;
 	bool mShutdown;
 	bool mShutdown;
 	bool mWaitingForGC; // GC.Collect sets this		
 	bool mWaitingForGC; // GC.Collect sets this		
+	bool mCollectFailed;
 	int mAllocSinceLastGC; // Added to on alloc and subtracted from on nursery cleanup
 	int mAllocSinceLastGC; // Added to on alloc and subtracted from on nursery cleanup
 	int mFreeSinceLastGC;
 	int mFreeSinceLastGC;
 
 

+ 0 - 1
BeefySysLib/platform/win/Platform.cpp

@@ -2190,7 +2190,6 @@ BFP_EXPORT void BFP_CALLTYPE BfpThread_GetIntRegisters(BfpThread* thread, intptr
 	if (!success)
 	if (!success)
 	{
 	{
 		int error = GetLastError();
 		int error = GetLastError();
-		BF_DBG_FATAL("Failed BfpThread_GetIntRegisters");
 		OUTRESULT(BfpThreadResult_UnknownError);
 		OUTRESULT(BfpThreadResult_UnknownError);
 		return;
 		return;
 	}
 	}