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:
parent
f67eaa6d8a
commit
c18e24d7e6
1 changed files with 7 additions and 1 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue