src/hotspot/share/gc/z/zHeapIterator.cpp
changeset 55603 3868dde58ebb
parent 55311 d60b24a09900
child 57658 0022b39ae5ae
equal deleted inserted replaced
55602:73395f9cad54 55603:3868dde58ebb
    20  * or visit www.oracle.com if you need additional information or have any
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    21  * questions.
    22  */
    22  */
    23 
    23 
    24 #include "precompiled.hpp"
    24 #include "precompiled.hpp"
       
    25 #include "classfile/classLoaderData.hpp"
       
    26 #include "classfile/classLoaderDataGraph.hpp"
    25 #include "gc/z/zBarrier.inline.hpp"
    27 #include "gc/z/zBarrier.inline.hpp"
    26 #include "gc/z/zGlobals.hpp"
    28 #include "gc/z/zGlobals.hpp"
    27 #include "gc/z/zGranuleMap.inline.hpp"
    29 #include "gc/z/zGranuleMap.inline.hpp"
    28 #include "gc/z/zHeapIterator.hpp"
    30 #include "gc/z/zHeapIterator.hpp"
    29 #include "gc/z/zOop.inline.hpp"
    31 #include "gc/z/zOop.inline.hpp"
    81     ShouldNotReachHere();
    83     ShouldNotReachHere();
    82   }
    84   }
    83 };
    85 };
    84 
    86 
    85 template <bool VisitReferents>
    87 template <bool VisitReferents>
    86 class ZHeapIteratorOopClosure : public BasicOopIterateClosure {
    88 class ZHeapIteratorOopClosure : public ClaimMetadataVisitingOopIterateClosure {
    87 private:
    89 private:
    88   ZHeapIterator* const _iter;
    90   ZHeapIterator* const _iter;
    89   const oop            _base;
    91   const oop            _base;
    90 
    92 
    91   oop load_oop(oop* p) {
    93   oop load_oop(oop* p) {
    96     return HeapAccess<AS_NO_KEEPALIVE>::oop_load(p);
    98     return HeapAccess<AS_NO_KEEPALIVE>::oop_load(p);
    97   }
    99   }
    98 
   100 
    99 public:
   101 public:
   100   ZHeapIteratorOopClosure(ZHeapIterator* iter, oop base) :
   102   ZHeapIteratorOopClosure(ZHeapIterator* iter, oop base) :
       
   103       ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_other),
   101       _iter(iter),
   104       _iter(iter),
   102       _base(base) {}
   105       _base(base) {}
   103 
   106 
   104   virtual ReferenceIterationMode reference_iteration_mode() {
   107   virtual ReferenceIterationMode reference_iteration_mode() {
   105     return VisitReferents ? DO_FIELDS : DO_FIELDS_EXCEPT_REFERENT;
   108     return VisitReferents ? DO_FIELDS : DO_FIELDS_EXCEPT_REFERENT;
   128 ZHeapIterator::~ZHeapIterator() {
   131 ZHeapIterator::~ZHeapIterator() {
   129   ZVisitMapIterator iter(&_visit_map);
   132   ZVisitMapIterator iter(&_visit_map);
   130   for (ZHeapIteratorBitMap* map; iter.next(&map);) {
   133   for (ZHeapIteratorBitMap* map; iter.next(&map);) {
   131     delete map;
   134     delete map;
   132   }
   135   }
       
   136   ClassLoaderDataGraph::clear_claimed_marks(ClassLoaderData::_claim_other);
   133 }
   137 }
   134 
   138 
   135 static size_t object_index_max() {
   139 static size_t object_index_max() {
   136   return ZGranuleSize >> ZObjectAlignmentSmallShift;
   140   return ZGranuleSize >> ZObjectAlignmentSmallShift;
   137 }
   141 }
   182 void ZHeapIterator::push_fields(oop obj) {
   186 void ZHeapIterator::push_fields(oop obj) {
   183   ZHeapIteratorOopClosure<VisitReferents> cl(this, obj);
   187   ZHeapIteratorOopClosure<VisitReferents> cl(this, obj);
   184   obj->oop_iterate(&cl);
   188   obj->oop_iterate(&cl);
   185 }
   189 }
   186 
   190 
   187 template <bool VisitReferents>
   191 class ZHeapIterateConcurrentRootsIterator : public ZConcurrentRootsIterator {
       
   192 public:
       
   193   ZHeapIterateConcurrentRootsIterator() :
       
   194       ZConcurrentRootsIterator(ClassLoaderData::_claim_other) {}
       
   195 };
       
   196 
       
   197 template <bool VisitWeaks>
   188 void ZHeapIterator::objects_do(ObjectClosure* cl) {
   198 void ZHeapIterator::objects_do(ObjectClosure* cl) {
   189   ZStatTimerDisable disable;
   199   ZStatTimerDisable disable;
   190 
   200 
   191   // Push roots to visit
   201   // Push roots to visit
   192   push_roots<ZRootsIterator,               false /* Concurrent */, false /* Weak */>();
   202   push_roots<ZRootsIterator,                      false /* Concurrent */, false /* Weak */>();
   193   push_roots<ZConcurrentRootsIterator,     true  /* Concurrent */, false /* Weak */>();
   203   push_roots<ZHeapIterateConcurrentRootsIterator, true  /* Concurrent */, false /* Weak */>();
   194   push_roots<ZWeakRootsIterator,           false /* Concurrent */, true  /* Weak */>();
   204   if (VisitWeaks) {
   195   push_roots<ZConcurrentWeakRootsIterator, true  /* Concurrent */, true  /* Weak */>();
   205     push_roots<ZWeakRootsIterator,           false /* Concurrent */, true  /* Weak */>();
       
   206     push_roots<ZConcurrentWeakRootsIterator, true  /* Concurrent */, true  /* Weak */>();
       
   207   }
   196 
   208 
   197   // Drain stack
   209   // Drain stack
   198   while (!_visit_stack.is_empty()) {
   210   while (!_visit_stack.is_empty()) {
   199     const oop obj = _visit_stack.pop();
   211     const oop obj = _visit_stack.pop();
   200 
   212 
   201     // Visit object
   213     // Visit object
   202     cl->do_object(obj);
   214     cl->do_object(obj);
   203 
   215 
   204     // Push fields to visit
   216     // Push fields to visit
   205     push_fields<VisitReferents>(obj);
   217     push_fields<VisitWeaks>(obj);
   206   }
   218   }
   207 }
   219 }
   208 
   220 
   209 void ZHeapIterator::objects_do(ObjectClosure* cl, bool visit_referents) {
   221 void ZHeapIterator::objects_do(ObjectClosure* cl, bool visit_weaks) {
   210   if (visit_referents) {
   222   if (visit_weaks) {
   211     objects_do<true /* VisitReferents */>(cl);
   223     objects_do<true /* VisitWeaks */>(cl);
   212   } else {
   224   } else {
   213     objects_do<false /* VisitReferents */>(cl);
   225     objects_do<false /* VisitWeaks */>(cl);
   214   }
   226   }
   215 }
   227 }