/** * Called for each object in the young generation that is seen during garbage * collection. An object is seen by scanning from the root objects to all * reachable objects. Therefore, only reachable objects will be seen, and * reachable objects may be seen more than once. * * @returns the new address for the object, so that the source reference can * be updated when the object has been moved. */ Object* BakerGC::saw_object(Object* obj) { Object* copy; #ifdef ENABLE_OBJECT_WATCH if(watched_p(obj)) { std::cout << "detected " << obj << " during baker collection\n"; } #endif if(!obj->reference_p()) return obj; if(!obj->young_object_p()) return obj; if(obj->forwarded_p()) return obj->forward(); // This object is already in the next space, we don't want to // copy it again! if(next->contains_p(obj)) return obj; if(unlikely(obj->inc_age() >= lifetime_)) { copy = object_memory_->promote_object(obj); promoted_push(copy); } else if(likely(next->enough_space_p( obj->size_in_bytes(object_memory_->state())))) { copy = next->move_object(object_memory_->state(), obj); total_objects++; } else { copy_spills_++; copy = object_memory_->promote_object(obj); promoted_push(copy); } #ifdef ENABLE_OBJECT_WATCH if(watched_p(copy)) { std::cout << "detected " << copy << " during baker collection (2)\n"; } #endif return copy; }
Object* BakerGC::saw_object(Object* obj) { Object* copy; if(watched_p(obj)) { std::cout << "detected " << obj << " during baker collection\n"; } if(!obj->reference_p()) return obj; if(obj->zone != YoungObjectZone) return obj; if(obj->forwarded_p()) return obj->forward(); // This object is already in the next space, we don't want to // copy it again! // TODO test this! if(next->contains_p(obj)) return obj; if(unlikely(obj->age++ >= lifetime)) { copy = object_memory->promote_object(obj); promoted_push(copy); } else if(likely(next->enough_space_p(obj->size_in_bytes(object_memory->state)))) { copy = next->copy_object(object_memory->state, obj); total_objects++; } else { copy = object_memory->promote_object(obj); promoted_push(copy); } if(watched_p(copy)) { std::cout << "detected " << copy << " during baker collection (2)\n"; } obj->set_forward(copy); return copy; }