1/*
2 * Copyright (c) 2001, 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_SHARED_SPECIALIZED_OOP_CLOSURES_HPP
26#define SHARE_VM_GC_SHARED_SPECIALIZED_OOP_CLOSURES_HPP
27
28#include "utilities/macros.hpp"
29#if INCLUDE_ALL_GCS
30#include "gc/g1/g1_specialized_oop_closures.hpp"
31#endif // INCLUDE_ALL_GCS
32
33// The following OopClosure types get specialized versions of
34// "oop_oop_iterate" that invoke the closures' do_oop methods
35// non-virtually, using a mechanism defined in this file.  Extend these
36// macros in the obvious way to add specializations for new closures.
37
38// Forward declarations.
39class OopClosure;
40class OopsInGenClosure;
41// DefNew
42class ScanClosure;
43class FastScanClosure;
44class FilteringClosure;
45// MarkSweep
46class MarkAndPushClosure;
47// ParNew
48class ParScanWithBarrierClosure;
49class ParScanWithoutBarrierClosure;
50// CMS
51class MarkRefsIntoAndScanClosure;
52class ParMarkRefsIntoAndScanClosure;
53class PushAndMarkClosure;
54class ParPushAndMarkClosure;
55class PushOrMarkClosure;
56class ParPushOrMarkClosure;
57class CMSKeepAliveClosure;
58class CMSInnerParMarkAndPushClosure;
59// Misc
60class NoHeaderExtendedOopClosure;
61
62// This macro applies an argument macro to all OopClosures for which we
63// want specialized bodies of "oop_oop_iterate".  The arguments to "f" are:
64//   "f(closureType, non_virtual)"
65// where "closureType" is the name of the particular subclass of ExtendedOopClosure,
66// and "non_virtual" will be the string "_nv" if the closure type should
67// have its "do_oop" method invoked non-virtually, or else the
68// string "_v".  ("ExtendedOopClosure" itself will be the only class in the latter
69// category.)
70
71// This is split into several because of a Visual C++ 6.0 compiler bug
72// where very long macros cause the compiler to crash
73
74#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_S(f)       \
75  f(ScanClosure,_nv)                                    \
76  f(FastScanClosure,_nv)                                \
77  f(FilteringClosure,_nv)
78
79#if INCLUDE_ALL_GCS
80#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_P(f)       \
81  f(ParScanWithBarrierClosure,_nv)                      \
82  f(ParScanWithoutBarrierClosure,_nv)
83#else  // INCLUDE_ALL_GCS
84#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_P(f)
85#endif // INCLUDE_ALL_GCS
86
87#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_1(f)       \
88  f(NoHeaderExtendedOopClosure,_nv)                     \
89  SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_S(f)             \
90  SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_P(f)
91
92#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_MS(f)      \
93  f(MarkAndPushClosure,_nv)
94
95#if INCLUDE_ALL_GCS
96#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_CMS(f)     \
97  f(MarkRefsIntoAndScanClosure,_nv)                     \
98  f(ParMarkRefsIntoAndScanClosure,_nv)                  \
99  f(PushAndMarkClosure,_nv)                             \
100  f(ParPushAndMarkClosure,_nv)                          \
101  f(PushOrMarkClosure,_nv)                              \
102  f(ParPushOrMarkClosure,_nv)                           \
103  f(CMSKeepAliveClosure,_nv)                            \
104  f(CMSInnerParMarkAndPushClosure,_nv)
105#endif
106
107#if INCLUDE_ALL_GCS
108#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_2(f)       \
109  SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_MS(f)            \
110  SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_CMS(f)           \
111  SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_G1(f)
112#else  // INCLUDE_ALL_GCS
113#define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_2(f)       \
114  SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_MS(f)
115#endif // INCLUDE_ALL_GCS
116
117
118// We separate these out, because sometime the general one has
119// a different definition from the specialized ones, and sometimes it
120// doesn't.
121
122#define ALL_OOP_OOP_ITERATE_CLOSURES_1(f)               \
123  f(ExtendedOopClosure,_v)                              \
124  SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_1(f)
125
126#define ALL_OOP_OOP_ITERATE_CLOSURES_2(f)               \
127  SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_2(f)
128
129#if INCLUDE_ALL_GCS
130// This macro applies an argument macro to all OopClosures for which we
131// want specialized bodies of a family of methods related to
132// "par_oop_iterate".  The arguments to f are the same as above.
133// The "root_class" is the most general class to define; this may be
134// "OopClosure" in some applications and "OopsInGenClosure" in others.
135
136#define SPECIALIZED_PAR_OOP_ITERATE_CLOSURES(f)        \
137  f(MarkRefsIntoAndScanClosure,_nv)                    \
138  f(PushAndMarkClosure,_nv)                            \
139  f(ParMarkRefsIntoAndScanClosure,_nv)                 \
140  f(ParPushAndMarkClosure,_nv)
141
142#define ALL_PAR_OOP_ITERATE_CLOSURES(f)                \
143  f(ExtendedOopClosure,_v)                             \
144  SPECIALIZED_PAR_OOP_ITERATE_CLOSURES(f)
145#endif // INCLUDE_ALL_GCS
146
147// This macro applies an argument macro to all OopClosures for which we
148// want specialized bodies of a family of methods related to
149// "oops_since_save_marks_do".  The arguments to f are the same as above.
150// The "root_class" is the most general class to define; this may be
151// "OopClosure" in some applications and "OopsInGenClosure" in others.
152
153#define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_S(f) \
154  f(ScanClosure,_nv)                                     \
155  f(FastScanClosure,_nv)
156
157#if INCLUDE_ALL_GCS
158#define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f) \
159  f(ParScanWithBarrierClosure,_nv)                       \
160  f(ParScanWithoutBarrierClosure,_nv)
161#else  // INCLUDE_ALL_GCS
162#define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f)
163#endif // INCLUDE_ALL_GCS
164
165#define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG(f)  \
166  SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_S(f)      \
167  SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG_P(f)
168
169#define SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(f)        \
170  SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES_YOUNG(f)
171
172// We separate these out, because sometime the general one has
173// a different definition from the specialized ones, and sometimes it
174// doesn't.
175
176#define ALL_SINCE_SAVE_MARKS_CLOSURES(f)                \
177  f(OopsInGenClosure,_v)                                \
178  SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(f)
179
180#endif // SHARE_VM_GC_SHARED_SPECIALIZED_OOP_CLOSURES_HPP
181