1/*
2 * Copyright (c) 2007, 2015, 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_VM_GC_CMS_PAROOPCLOSURES_HPP
26#define SHARE_VM_GC_CMS_PAROOPCLOSURES_HPP
27
28#include "gc/shared/genOopClosures.hpp"
29#include "gc/shared/taskqueue.hpp"
30#include "memory/padded.hpp"
31
32// Closures for ParNewGeneration
33
34class ParScanThreadState;
35class ParNewGeneration;
36typedef Padded<OopTaskQueue> ObjToScanQueue;
37typedef GenericTaskQueueSet<ObjToScanQueue, mtGC> ObjToScanQueueSet;
38class ParallelTaskTerminator;
39
40class ParScanClosure: public OopsInKlassOrGenClosure {
41 protected:
42  ParScanThreadState* _par_scan_state;
43  ParNewGeneration*   _g;
44  HeapWord*           _boundary;
45  template <class T> void inline par_do_barrier(T* p);
46  template <class T> void inline do_oop_work(T* p,
47                                             bool gc_barrier,
48                                             bool root_scan);
49 public:
50  ParScanClosure(ParNewGeneration* g, ParScanThreadState* par_scan_state);
51};
52
53class ParScanWithBarrierClosure: public ParScanClosure {
54 public:
55  ParScanWithBarrierClosure(ParNewGeneration* g,
56                            ParScanThreadState* par_scan_state) :
57    ParScanClosure(g, par_scan_state) {}
58  virtual void do_oop(oop* p);
59  virtual void do_oop(narrowOop* p);
60  inline void do_oop_nv(oop* p);
61  inline void do_oop_nv(narrowOop* p);
62};
63
64class ParScanWithoutBarrierClosure: public ParScanClosure {
65 public:
66  ParScanWithoutBarrierClosure(ParNewGeneration* g,
67                               ParScanThreadState* par_scan_state) :
68    ParScanClosure(g, par_scan_state) {}
69  virtual void do_oop(oop* p);
70  virtual void do_oop(narrowOop* p);
71  inline void do_oop_nv(oop* p);
72  inline void do_oop_nv(narrowOop* p);
73};
74
75class ParRootScanWithBarrierTwoGensClosure: public ParScanClosure {
76 public:
77  ParRootScanWithBarrierTwoGensClosure(ParNewGeneration* g,
78                                       ParScanThreadState* par_scan_state) :
79    ParScanClosure(g, par_scan_state) {}
80  virtual void do_oop(oop* p);
81  virtual void do_oop(narrowOop* p);
82};
83
84class ParRootScanWithoutBarrierClosure: public ParScanClosure {
85 public:
86  ParRootScanWithoutBarrierClosure(ParNewGeneration* g,
87                                   ParScanThreadState* par_scan_state) :
88    ParScanClosure(g, par_scan_state) {}
89  virtual void do_oop(oop* p);
90  virtual void do_oop(narrowOop* p);
91};
92
93class ParScanWeakRefClosure: public ScanWeakRefClosure {
94 protected:
95  ParScanThreadState* _par_scan_state;
96  template <class T> inline void do_oop_work(T* p);
97 public:
98  ParScanWeakRefClosure(ParNewGeneration* g,
99                        ParScanThreadState* par_scan_state);
100  virtual void do_oop(oop* p);
101  virtual void do_oop(narrowOop* p);
102  inline void do_oop_nv(oop* p);
103  inline void do_oop_nv(narrowOop* p);
104};
105
106class ParEvacuateFollowersClosure: public VoidClosure {
107 private:
108  ParScanThreadState* _par_scan_state;
109  ParScanThreadState* par_scan_state() { return _par_scan_state; }
110
111  // We want to preserve the specific types here (rather than "OopClosure")
112  // for later de-virtualization of do_oop calls.
113  ParScanWithoutBarrierClosure* _to_space_closure;
114  ParScanWithoutBarrierClosure* to_space_closure() {
115    return _to_space_closure;
116  }
117  ParRootScanWithoutBarrierClosure* _to_space_root_closure;
118  ParRootScanWithoutBarrierClosure* to_space_root_closure() {
119    return _to_space_root_closure;
120  }
121
122  ParScanWithBarrierClosure* _old_gen_closure;
123  ParScanWithBarrierClosure* old_gen_closure () {
124    return _old_gen_closure;
125  }
126  ParRootScanWithBarrierTwoGensClosure* _old_gen_root_closure;
127  ParRootScanWithBarrierTwoGensClosure* old_gen_root_closure () {
128    return _old_gen_root_closure;
129  }
130
131  ParNewGeneration* _par_gen;
132  ParNewGeneration* par_gen() { return _par_gen; }
133
134  ObjToScanQueueSet*  _task_queues;
135  ObjToScanQueueSet*  task_queues() { return _task_queues; }
136
137  ParallelTaskTerminator* _terminator;
138  ParallelTaskTerminator* terminator() { return _terminator; }
139 public:
140  ParEvacuateFollowersClosure(
141    ParScanThreadState* par_scan_state_,
142    ParScanWithoutBarrierClosure* to_space_closure_,
143    ParScanWithBarrierClosure* old_gen_closure_,
144    ParRootScanWithoutBarrierClosure* to_space_root_closure_,
145    ParNewGeneration* par_gen_,
146    ParRootScanWithBarrierTwoGensClosure* old_gen_root_closure_,
147    ObjToScanQueueSet* task_queues_,
148    ParallelTaskTerminator* terminator_);
149  virtual void do_void();
150};
151
152#endif // SHARE_VM_GC_CMS_PAROOPCLOSURES_HPP
153