/** * Called when the immix::GC object wishes to mark an object. * * @returns true if the object is not already marked, and in the Immix * space; otherwise false. */ inline bool mark_address(memory::Address addr, immix::MarkStack& ms, bool push = true) { Object* obj = addr.as<Object>(); if(obj->marked_p(object_memory_->mark())) return false; obj->mark(object_memory_, object_memory_->mark()); if(push) ms.push_back(addr); // If this is a young object, let the GC know not to try and mark // the block it's in. return obj->in_immix_p(); }
/** * Called when the immix::GC object wishes to mark an object. * * @returns true if the object is not already marked, and in the Immix * space; otherwise false. */ bool mark_address(memory::Address addr, immix::MarkStack& ms) { Object* obj = addr.as<Object>(); if(obj->marked_p(object_memory_->mark())) return false; obj->mark(object_memory_->mark()); gc_->inc_marked_objects(); ms.push_back(addr); if(obj->in_immix_p()) return true; // If this is a young object, let the GC know not to try and mark // the block it's in. return false; }
Object* call(Object* obj) { if(watched_p(obj)) { std::cout << "detected " << obj << " during unmarking.\n"; } if(obj->reference_p() && obj->marked_p(object_memory_->mark())) { obj->clear_mark(); stack_.push_back(obj); } return obj; }