void ProcessMyGrayObjects(ref ThreadHeaderQueue.LocalList workList) { if (amMarkingForCoCo) { ProcessObjectsSlow(ref workList); } else { // hand-inlined from ConcurrentMSCollector. needed // to ensure that the VisitReferenceFields call gets // inlined. while (!ConcurrentMSCollector.killCollectorThreads && !workList.IsEmpty()) { // Pop the next value Object obj = workList.Pop(markedColor); if (CoCoBarrier.fVerifyToSpaceMark && !CoCoBarrier.instance.IsInToSpace(Magic.addressOf(obj))) { VTable.DebugBreak(); } // Visit Fields this.VisitReferenceFields(obj); } } }
//[NoBarriers] void ProcessObjectsSlow(ref ThreadHeaderQueue.LocalList workList) { while (!ConcurrentMSCollector.killCollectorThreads && !workList.IsEmpty()) { // Pop the next value Object obj = workList.Pop(markedColor); if (fVerbose) { VTable.DebugPrint("cms popped: "); VTable.DebugPrint((ulong)Magic.addressOf(obj)); VTable.DebugPrint("\n"); } // let CoCo do some stuff ScanHook(obj); // Visit Fields this.VisitReferenceFields(obj); } }