1 /*
  2  * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHHEAPREGIONCLOSURES_HPP
 26 #define SHARE_GC_SHENANDOAH_SHENANDOAHHEAPREGIONCLOSURES_HPP
 27 
 28 
 29 #include "gc/shenandoah/shenandoahHeap.hpp"
 30 #include "gc/shenandoah/shenandoahHeapRegion.inline.hpp"
 31 
 32 // Applies the given closure to all regions with the given affiliation
 33 template<ShenandoahAffiliation AFFILIATION>
 34 class ShenandoahIncludeRegionClosure : public ShenandoahHeapRegionClosure {
 35 private:
 36   ShenandoahHeapRegionClosure* _closure;
 37 
 38 public:
 39   explicit ShenandoahIncludeRegionClosure(ShenandoahHeapRegionClosure* closure): _closure(closure) {}
 40 
 41   void heap_region_do(ShenandoahHeapRegion* r) override {
 42     if (r->affiliation() == AFFILIATION) {
 43       _closure->heap_region_do(r);
 44     }
 45   }
 46 
 47   bool is_thread_safe() override {
 48     return _closure->is_thread_safe();
 49   }
 50 };
 51 
 52 // Applies the given closure to all regions without the given affiliation
 53 template<ShenandoahAffiliation AFFILIATION>
 54 class ShenandoahExcludeRegionClosure : public ShenandoahHeapRegionClosure {
 55 private:
 56   ShenandoahHeapRegionClosure* _closure;
 57 
 58 public:
 59   explicit ShenandoahExcludeRegionClosure(ShenandoahHeapRegionClosure* closure): _closure(closure) {}
 60 
 61   void heap_region_do(ShenandoahHeapRegion* r) override {
 62     if (r->affiliation() != AFFILIATION) {
 63       _closure->heap_region_do(r);
 64     }
 65   }
 66 
 67   bool is_thread_safe() override {
 68     return _closure->is_thread_safe();
 69   }
 70 };
 71 
 72 // Makes regions pinned or unpinned according to the region's pin count
 73 class ShenandoahSynchronizePinnedRegionStates : public ShenandoahHeapRegionClosure {
 74 private:
 75   ShenandoahHeapLock* const _lock;
 76 
 77 public:
 78   ShenandoahSynchronizePinnedRegionStates();
 79 
 80   void heap_region_do(ShenandoahHeapRegion* r) override;
 81   bool is_thread_safe() override { return true; }
 82 
 83   void synchronize_pin_count(ShenandoahHeapRegion* r);
 84 };
 85 
 86 class ShenandoahMarkingContext;
 87 
 88 // Synchronizes region pinned status, sets update watermark and adjust live data tally for regions
 89 class ShenandoahFinalMarkUpdateRegionStateClosure : public ShenandoahHeapRegionClosure {
 90 private:
 91   ShenandoahMarkingContext* const _ctx;
 92   ShenandoahSynchronizePinnedRegionStates _pins;
 93 public:
 94   explicit ShenandoahFinalMarkUpdateRegionStateClosure(ShenandoahMarkingContext* ctx);
 95 
 96   void heap_region_do(ShenandoahHeapRegion* r) override;
 97   bool is_thread_safe() override { return true; }
 98 };
 99 
100 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHHEAPREGIONCLOSURES_HPP