void CFullGraphFinalizer::ForwardClassification (CFullGraphNode* node) { do { // add local classification MarkRoot (node); MarkCopySource (node); MarkWCRevisions (node); MarkHead (node); AddWCModification (node); // add path-based classification node->AddClassification ((*pathClassification)[node->GetPath()]); // recourse for ( const CFullGraphNode::CCopyTarget* copy = node->GetFirstCopyTarget() ; copy != NULL ; copy = copy->next()) { ForwardClassification (copy->value()); } node = node->GetNext(); } while (node != NULL); }
static size_t SingleStep() { switch (State) { case GCS_Pause: MarkRoot(); // Start a new collection return 0; case GCS_Propagate: if (Gray != NULL) { return PropagateMark(); } else { // no more gray objects Atomic(); // finish mark phase return 0; } case GCS_Sweep: { size_t old = AllocBytes; size_t finalize_count; SweepPos = SweepList(SweepPos, GCSWEEPMAX, &finalize_count); if (*SweepPos == NULL) { // Nothing more to sweep? State = GCS_Finalize; } assert(old >= AllocBytes); Estimate -= old - AllocBytes; return (GCSWEEPMAX - finalize_count) * GCSWEEPCOST + finalize_count * GCFINALIZECOST; } case GCS_Finalize: State = GCS_Pause; // end collection Dept = 0; return 0; default: assert(0); return 0; } }
void FullGC() { if (State <= GCS_Propagate) { // Reset sweep mark to sweep all elements (returning them to white) SweepPos = &Root; // Reset other collector lists Gray = NULL; State = GCS_Sweep; } // Finish any pending sweep phase while (State != GCS_Finalize) { SingleStep(); } MarkRoot(); while (State != GCS_Pause) { SingleStep(); } SetThreshold(); }