1 /*
   2  * Copyright (c) 2017, Oracle and/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_G1_G1FULLGCPREPARETASK_HPP
  26 #define SHARE_GC_G1_G1FULLGCPREPARETASK_HPP
  27 
  28 #include "gc/g1/g1FullGCCompactionPoint.hpp"
  29 #include "gc/g1/g1FullGCScope.hpp"
  30 #include "gc/g1/g1FullGCTask.hpp"
  31 #include "gc/g1/g1RootProcessor.hpp"
  32 #include "gc/g1/g1StringDedup.hpp"
  33 #include "gc/g1/heapRegionManager.hpp"
  34 #include "gc/shared/referenceProcessor.hpp"
  35 #include "utilities/ticks.hpp"
  36 
  37 class G1CMBitMap;
  38 
  39 class G1FullGCPrepareTask : public G1FullGCTask {
  40 protected:
  41   volatile bool     _freed_regions;
  42   HeapRegionClaimer _hrclaimer;
  43 
  44   void set_freed_regions();
  45 
  46 public:
  47   G1FullGCPrepareTask(G1FullCollector* collector);
  48   void work(uint worker_id);
  49   void prepare_serial_compaction();
  50   bool has_freed_regions();
  51 
  52 protected:
  53   class G1CalculatePointersClosure : public HeapRegionClosure {
  54   protected:
  55     G1CollectedHeap* _g1h;
  56     G1CMBitMap* _bitmap;
  57     G1FullGCCompactionPoint* _cp;
  58     uint _humongous_regions_removed;
  59 
  60     virtual void prepare_for_compaction(HeapRegion* hr);
  61     void prepare_for_compaction_work(G1FullGCCompactionPoint* cp, HeapRegion* hr);
  62     void free_humongous_region(HeapRegion* hr);
  63     void reset_region_metadata(HeapRegion* hr);
  64 
  65   public:
  66     G1CalculatePointersClosure(G1CMBitMap* bitmap,
  67                                G1FullGCCompactionPoint* cp);
  68 
  69     void update_sets();
  70     bool do_heap_region(HeapRegion* hr);
  71     bool freed_regions();
  72   };
  73 
  74   class G1PrepareCompactLiveClosure : public StackObj {
  75     G1FullGCCompactionPoint* _cp;
  76 
  77   public:
  78     G1PrepareCompactLiveClosure(G1FullGCCompactionPoint* cp);
  79     size_t apply(oop object);
  80   };
  81 
  82   class G1RePrepareClosure : public StackObj {
  83     G1FullGCCompactionPoint* _cp;
  84     HeapRegion* _current;
  85 
  86   public:
  87     G1RePrepareClosure(G1FullGCCompactionPoint* hrcp,
  88                        HeapRegion* hr) :
  89         _cp(hrcp),
  90         _current(hr) { }
  91 
  92     size_t apply(oop object);
  93   };
  94 };
  95 
  96 #endif // SHARE_GC_G1_G1FULLGCPREPARETASK_HPP