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_CMSOOPCLOSURES_INLINE_HPP
26 #define SHARE_VM_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/oop.inline.hpp"
32
33 // Trim our work_queue so its length is below max at return
34 inline void ParMarkRefsIntoAndScanClosure::trim_queue(uint max) {
35 while (_work_queue->size() > max) {
36 oop newOop;
37 if (_work_queue->pop_local(newOop)) {
38 assert(newOop->is_oop(), "Expected an oop");
39 assert(_bit_map->isMarked((HeapWord*)newOop),
40 "only grey objects on this stack");
41 // iterate over the oops in this oop, marking and pushing
42 // the ones in CMS heap (i.e. in _span).
43 newOop->oop_iterate(&_parPushAndMarkClosure);
44 }
45 }
46 }
47
48 // MetadataAwareOopClosure and MetadataAwareOopsInGenClosure are duplicated,
49 // until we get rid of OopsInGenClosure.
50
51 inline void MetadataAwareOopsInGenClosure::do_klass_nv(Klass* k) {
52 ClassLoaderData* cld = k->class_loader_data();
53 do_cld_nv(cld);
54 }
55 inline void MetadataAwareOopsInGenClosure::do_klass(Klass* k) { do_klass_nv(k); }
56
57 inline void MetadataAwareOopsInGenClosure::do_cld_nv(ClassLoaderData* cld) {
58 assert(_klass_closure._oop_closure == this, "Must be");
59
60 bool claim = true; // Must claim the class loader data before processing.
61 cld->oops_do(_klass_closure._oop_closure, &_klass_closure, claim);
62 }
63
64 #endif // SHARE_VM_GC_CMS_CMSOOPCLOSURES_INLINE_HPP
|
1 /*
2 * Copyright (c) 2007, 2016, 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_CMSOOPCLOSURES_INLINE_HPP
26 #define SHARE_VM_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/oop.inline.hpp"
32
33 // MetadataAwareOopClosure and MetadataAwareOopsInGenClosure are duplicated,
34 // until we get rid of OopsInGenClosure.
35
36 inline void MetadataAwareOopsInGenClosure::do_klass_nv(Klass* k) {
37 ClassLoaderData* cld = k->class_loader_data();
38 do_cld_nv(cld);
39 }
40 inline void MetadataAwareOopsInGenClosure::do_klass(Klass* k) { do_klass_nv(k); }
41
42 inline void MetadataAwareOopsInGenClosure::do_cld_nv(ClassLoaderData* cld) {
43 assert(_klass_closure._oop_closure == this, "Must be");
44
45 bool claim = true; // Must claim the class loader data before processing.
46 cld->oops_do(_klass_closure._oop_closure, &_klass_closure, claim);
47 }
48
49 // Decode the oop and call do_oop on it.
50 #define DO_OOP_WORK_IMPL(cls) \
51 template <class T> void cls::do_oop_work(T* p) { \
52 T heap_oop = oopDesc::load_heap_oop(p); \
53 if (!oopDesc::is_null(heap_oop)) { \
54 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); \
55 do_oop(obj); \
56 } \
57 }
58
59 #define DO_OOP_WORK_NV_IMPL(cls) \
60 DO_OOP_WORK_IMPL(cls) \
61 void cls::do_oop_nv(oop* p) { cls::do_oop_work(p); } \
62 void cls::do_oop_nv(narrowOop* p) { cls::do_oop_work(p); }
63
64 DO_OOP_WORK_IMPL(MarkRefsIntoClosure)
65 DO_OOP_WORK_IMPL(ParMarkRefsIntoClosure)
66 DO_OOP_WORK_IMPL(MarkRefsIntoVerifyClosure)
67 DO_OOP_WORK_NV_IMPL(PushAndMarkClosure)
68 DO_OOP_WORK_NV_IMPL(ParPushAndMarkClosure)
69 DO_OOP_WORK_NV_IMPL(MarkRefsIntoAndScanClosure)
70 DO_OOP_WORK_NV_IMPL(ParMarkRefsIntoAndScanClosure)
71
72 // Trim our work_queue so its length is below max at return
73 inline void ParMarkRefsIntoAndScanClosure::trim_queue(uint max) {
74 while (_work_queue->size() > max) {
75 oop newOop;
76 if (_work_queue->pop_local(newOop)) {
77 assert(newOop->is_oop(), "Expected an oop");
78 assert(_bit_map->isMarked((HeapWord*)newOop),
79 "only grey objects on this stack");
80 // iterate over the oops in this oop, marking and pushing
81 // the ones in CMS heap (i.e. in _span).
82 newOop->oop_iterate(&_parPushAndMarkClosure);
83 }
84 }
85 }
86
87 DO_OOP_WORK_NV_IMPL(PushOrMarkClosure)
88 DO_OOP_WORK_NV_IMPL(ParPushOrMarkClosure)
89 DO_OOP_WORK_NV_IMPL(CMSKeepAliveClosure)
90 DO_OOP_WORK_NV_IMPL(CMSInnerParMarkAndPushClosure)
91 DO_OOP_WORK_IMPL(CMSParKeepAliveClosure)
92
93 #endif // SHARE_VM_GC_CMS_CMSOOPCLOSURES_INLINE_HPP
|