1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Used cmpxchg for mCollectFailed failover marking during sweep

This commit is contained in:
Brian Fiete 2024-08-25 09:32:17 -04:00
parent f67eaa6d8a
commit c18e24d7e6

View file

@ -1098,7 +1098,13 @@ void BFGC::SweepSpan(tcmalloc_obj::Span* span, int expectedStartPage)
int markId = objectFlags & BF_OBJECTFLAG_MARK_ID_MASK; int markId = objectFlags & BF_OBJECTFLAG_MARK_ID_MASK;
if ((mCollectFailed) && (markId != mCurMarkId)) if ((mCollectFailed) && (markId != mCurMarkId))
{ {
obj->mObjectFlags = (BfObjectFlags)((obj->mObjectFlags & ~BF_OBJECTFLAG_MARK_ID_MASK) | mCurMarkId); while (true)
{
uintptr prevVal = (uintptr)obj->mClassVData;
uintptr newVal = (prevVal & ~BF_OBJECTFLAG_MARK_ID_MASK) | mCurMarkId;
if (::InterlockedCompareExchange((volatile uintptr*)&obj->mClassVData, newVal, prevVal) == prevVal)
break;
}
markId = mCurMarkId; markId = mCurMarkId;
} }