1/*
2 * Copyright (c) 2007, 2019, 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_CMS_CMSOOPCLOSURES_INLINE_HPP
26#define SHARE_GC_CMS_CMSOOPCLOSURES_INLINE_HPP
27
28#include "gc/cms/cmsOopClosures.hpp"
29#include "gc/cms/concurrentMarkSweepGeneration.hpp"
30#include "gc/shared/taskqueue.inline.hpp"
31#include "oops/access.inline.hpp"
32#include "oops/compressedOops.inline.hpp"
33#include "oops/oop.inline.hpp"
34
35// MetadataVisitingOopIterateClosure and MetadataVisitingOopsInGenClosure are duplicated,
36// until we get rid of OopsInGenClosure.
37
38inline void MetadataVisitingOopsInGenClosure::do_klass(Klass* k) {
39 ClassLoaderData* cld = k->class_loader_data();
40 MetadataVisitingOopsInGenClosure::do_cld(cld);
41}
42
43inline void MetadataVisitingOopsInGenClosure::do_cld(ClassLoaderData* cld) {
44 cld->oops_do(this, ClassLoaderData::_claim_strong);
45}
46
47// Decode the oop and call do_oop on it.
48#define DO_OOP_WORK_IMPL(cls) \
49 template <class T> void cls::do_oop_work(T* p) { \
50 T heap_oop = RawAccess<>::oop_load(p); \
51 if (!CompressedOops::is_null(heap_oop)) { \
52 oop obj = CompressedOops::decode_not_null(heap_oop); \
53 do_oop(obj); \
54 } \
55 } \
56 inline void cls::do_oop(oop* p) { do_oop_work(p); } \
57 inline void cls::do_oop(narrowOop* p) { do_oop_work(p); }
58
59DO_OOP_WORK_IMPL(MarkRefsIntoClosure)
60DO_OOP_WORK_IMPL(ParMarkRefsIntoClosure)
61DO_OOP_WORK_IMPL(MarkRefsIntoVerifyClosure)
62DO_OOP_WORK_IMPL(PushAndMarkClosure)
63DO_OOP_WORK_IMPL(ParPushAndMarkClosure)
64DO_OOP_WORK_IMPL(MarkRefsIntoAndScanClosure)
65DO_OOP_WORK_IMPL(ParMarkRefsIntoAndScanClosure)
66
67// Trim our work_queue so its length is below max at return
68inline void ParMarkRefsIntoAndScanClosure::trim_queue(uint max) {
69 while (_work_queue->size() > max) {
70 oop newOop;
71 if (_work_queue->pop_local(newOop)) {
72 assert(oopDesc::is_oop(newOop), "Expected an oop");
73 assert(_bit_map->isMarked((HeapWord*)newOop),
74 "only grey objects on this stack");
75 // iterate over the oops in this oop, marking and pushing
76 // the ones in CMS heap (i.e. in _span).
77 newOop->oop_iterate(&_parPushAndMarkClosure);
78 }
79 }
80}
81
82DO_OOP_WORK_IMPL(PushOrMarkClosure)
83DO_OOP_WORK_IMPL(ParPushOrMarkClosure)
84DO_OOP_WORK_IMPL(CMSKeepAliveClosure)
85DO_OOP_WORK_IMPL(CMSInnerParMarkAndPushClosure)
86DO_OOP_WORK_IMPL(CMSParKeepAliveClosure)
87
88#endif // SHARE_GC_CMS_CMSOOPCLOSURES_INLINE_HPP
89