< prev index next >

src/share/vm/gc/g1/g1OopClosures.hpp

Print this page
rev 12513 : 8071278: Fix the closure mess in G1RemSet::refine_card()
Summary: Remove the use of many nested closure in the code to refine a card.
Reviewed-by: kbarrett, sjohanss

*** 1,7 **** /* ! * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 141,173 **** G1KlassScanClosure(G1ParCopyHelper* closure, bool process_only_dirty) : _process_only_dirty(process_only_dirty), _closure(closure), _count(0) {} void do_klass(Klass* klass); }; - class FilterIntoCSClosure: public OopClosure { - G1CollectedHeap* _g1; - OopClosure* _oc; - public: - FilterIntoCSClosure(G1CollectedHeap* g1, OopClosure* oc) : _g1(g1), _oc(oc) { } - - template <class T> void do_oop_work(T* p); - virtual void do_oop(oop* p) { do_oop_work(p); } - virtual void do_oop(narrowOop* p) { do_oop_work(p); } - }; - - class FilterOutOfRegionClosure: public ExtendedOopClosure { - HeapWord* _r_bottom; - HeapWord* _r_end; - OopClosure* _oc; - public: - FilterOutOfRegionClosure(HeapRegion* r, OopClosure* oc); - template <class T> void do_oop_nv(T* p); - virtual void do_oop(oop* p) { do_oop_nv(p); } - virtual void do_oop(narrowOop* p) { do_oop_nv(p); } - bool apply_to_weak_ref_discovered_field() { return true; } - }; - // Closure for iterating over object fields during concurrent marking class G1CMOopClosure : public MetadataAwareOopClosure { protected: G1ConcurrentMark* _cm; private: --- 141,150 ----
*** 191,268 **** template <class T> void do_oop_nv(T* p); virtual void do_oop( oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } }; ! // Closure that applies the given two closures in sequence. ! // Used by the RSet refinement code (when updating RSets ! // during an evacuation pause) to record cards containing ! // pointers into the collection set. ! ! class G1Mux2Closure : public OopClosure { ! OopClosure* _c1; ! OopClosure* _c2; ! public: ! G1Mux2Closure(OopClosure *c1, OopClosure *c2); ! template <class T> inline void do_oop_work(T* p); ! virtual inline void do_oop(oop* p); ! virtual inline void do_oop(narrowOop* p); ! }; ! ! // A closure that returns true if it is actually applied ! // to a reference ! ! class G1TriggerClosure : public OopClosure { ! bool _triggered; ! public: ! G1TriggerClosure(); ! bool triggered() const { return _triggered; } ! template <class T> inline void do_oop_work(T* p); ! virtual inline void do_oop(oop* p); ! virtual inline void do_oop(narrowOop* p); ! }; ! ! // A closure which uses a triggering closure to determine ! // whether to apply an oop closure. ! ! class G1InvokeIfNotTriggeredClosure: public OopClosure { ! G1TriggerClosure* _trigger_cl; ! OopClosure* _oop_cl; ! public: ! G1InvokeIfNotTriggeredClosure(G1TriggerClosure* t, OopClosure* oc); ! template <class T> inline void do_oop_work(T* p); ! virtual inline void do_oop(oop* p); ! virtual inline void do_oop(narrowOop* p); ! }; ! ! class G1UpdateRSOrPushRefOopClosure: public OopClosure { G1CollectedHeap* _g1; - G1RemSet* _g1_rem_set; HeapRegion* _from; G1ParPushHeapRSClosure* _push_ref_cl; bool _record_refs_into_cset; uint _worker_i; public: G1UpdateRSOrPushRefOopClosure(G1CollectedHeap* g1h, - G1RemSet* rs, G1ParPushHeapRSClosure* push_ref_cl, bool record_refs_into_cset, uint worker_i = 0); void set_from(HeapRegion* from) { assert(from != NULL, "from region must be non-NULL"); _from = from; } bool self_forwarded(oop obj) { markOop m = obj->mark(); bool result = (m->is_marked() && ((oop)m->decode_pointer() == obj)); return result; } ! template <class T> inline void do_oop_work(T* p); virtual inline void do_oop(narrowOop* p); virtual inline void do_oop(oop* p); }; #endif // SHARE_VM_GC_G1_G1OOPCLOSURES_HPP --- 168,207 ---- template <class T> void do_oop_nv(T* p); virtual void do_oop( oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } }; ! class G1UpdateRSOrPushRefOopClosure: public ExtendedOopClosure { G1CollectedHeap* _g1; HeapRegion* _from; G1ParPushHeapRSClosure* _push_ref_cl; bool _record_refs_into_cset; uint _worker_i; + bool _has_refs_into_cset; public: G1UpdateRSOrPushRefOopClosure(G1CollectedHeap* g1h, G1ParPushHeapRSClosure* push_ref_cl, bool record_refs_into_cset, uint worker_i = 0); void set_from(HeapRegion* from) { assert(from != NULL, "from region must be non-NULL"); _from = from; } + bool apply_to_weak_ref_discovered_field() { return true; } + bool self_forwarded(oop obj) { markOop m = obj->mark(); bool result = (m->is_marked() && ((oop)m->decode_pointer() == obj)); return result; } ! bool has_refs_into_cset() const { return _has_refs_into_cset; } ! ! template <class T> inline void do_oop_nv(T* p); virtual inline void do_oop(narrowOop* p); virtual inline void do_oop(oop* p); }; #endif // SHARE_VM_GC_G1_G1OOPCLOSURES_HPP
< prev index next >