1 /*
2 * Copyright (c) 1997, 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 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/systemDictionary.hpp"
28 #include "gc/shared/collectedHeap.inline.hpp"
29 #include "gc/shared/genCollectedHeap.hpp"
30 #include "gc/shared/specialized_oop_closures.hpp"
31 #include "oops/instanceRefKlass.inline.hpp"
32 #include "oops/oop.inline.hpp"
33 #include "utilities/macros.hpp"
34 #include "utilities/preserveException.hpp"
35
36 void InstanceRefKlass::update_nonstatic_oop_maps(Klass* k) {
37 // Clear the nonstatic oop-map entries corresponding to referent
38 // and nextPending field. They are treated specially by the
39 // garbage collector.
40 // The discovered field is used only by the garbage collector
41 // and is also treated specially.
42 InstanceKlass* ik = InstanceKlass::cast(k);
43
44 // Check that we have the right class
45 debug_only(static bool first_time = true);
46 assert(k == SystemDictionary::Reference_klass() && first_time,
47 "Invalid update of maps");
48 debug_only(first_time = false);
49 assert(ik->nonstatic_oop_map_count() == 1, "just checking");
50
51 OopMapBlock* map = ik->start_of_nonstatic_oop_maps();
52
53 // Check that the current map is (2,4) - currently points at field with
54 // offset 2 (words) and has 4 map entries.
69 }
70 }
71
72
73 // Verification
74
75 void InstanceRefKlass::oop_verify_on(oop obj, outputStream* st) {
76 InstanceKlass::oop_verify_on(obj, st);
77 // Verify referent field
78 oop referent = java_lang_ref_Reference::referent(obj);
79 if (referent != NULL) {
80 guarantee(referent->is_oop(), "referent field heap failed");
81 }
82 // Verify next field
83 oop next = java_lang_ref_Reference::next(obj);
84 if (next != NULL) {
85 guarantee(next->is_oop(), "next field should be an oop");
86 guarantee(next->is_instance(), "next field should be an instance");
87 guarantee(InstanceKlass::cast(next->klass())->is_reference_instance_klass(), "next field verify failed");
88 }
89 }
90
91 bool InstanceRefKlass::owns_pending_list_lock(JavaThread* thread) {
92 if (java_lang_ref_Reference::pending_list_lock() == NULL) return false;
93 Handle h_lock(thread, java_lang_ref_Reference::pending_list_lock());
94 return ObjectSynchronizer::current_thread_holds_lock(thread, h_lock);
95 }
96
97 void InstanceRefKlass::acquire_pending_list_lock(BasicLock *pending_list_basic_lock) {
98 // we may enter this with pending exception set
99 PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument
100
101 // Create a HandleMark in case we retry a GC multiple times.
102 // Each time we attempt the GC, we allocate the handle below
103 // to hold the pending list lock. We want to free this handle.
104 HandleMark hm;
105
106 Handle h_lock(THREAD, java_lang_ref_Reference::pending_list_lock());
107 ObjectSynchronizer::fast_enter(h_lock, pending_list_basic_lock, false, THREAD);
108 assert(ObjectSynchronizer::current_thread_holds_lock(
109 JavaThread::current(), h_lock),
110 "Locking should have succeeded");
111 if (HAS_PENDING_EXCEPTION) CLEAR_PENDING_EXCEPTION;
112 }
113
114 void InstanceRefKlass::release_and_notify_pending_list_lock(
115 BasicLock *pending_list_basic_lock) {
116 // we may enter this with pending exception set
117 PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument
118
119 // Create a HandleMark in case we retry a GC multiple times.
120 // Each time we attempt the GC, we allocate the handle below
121 // to hold the pending list lock. We want to free this handle.
122 HandleMark hm;
123
124 Handle h_lock(THREAD, java_lang_ref_Reference::pending_list_lock());
125 assert(ObjectSynchronizer::current_thread_holds_lock(
126 JavaThread::current(), h_lock),
127 "Lock should be held");
128 // Notify waiters on pending lists lock if there is any reference.
129 if (java_lang_ref_Reference::pending_list() != NULL) {
130 ObjectSynchronizer::notifyall(h_lock, THREAD);
131 }
132 ObjectSynchronizer::fast_exit(h_lock(), pending_list_basic_lock, THREAD);
133 if (HAS_PENDING_EXCEPTION) CLEAR_PENDING_EXCEPTION;
134 }
|
1 /*
2 * Copyright (c) 1997, 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 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/systemDictionary.hpp"
28 #include "oops/instanceRefKlass.inline.hpp"
29 #include "oops/oop.inline.hpp"
30
31 void InstanceRefKlass::update_nonstatic_oop_maps(Klass* k) {
32 // Clear the nonstatic oop-map entries corresponding to referent
33 // and nextPending field. They are treated specially by the
34 // garbage collector.
35 // The discovered field is used only by the garbage collector
36 // and is also treated specially.
37 InstanceKlass* ik = InstanceKlass::cast(k);
38
39 // Check that we have the right class
40 debug_only(static bool first_time = true);
41 assert(k == SystemDictionary::Reference_klass() && first_time,
42 "Invalid update of maps");
43 debug_only(first_time = false);
44 assert(ik->nonstatic_oop_map_count() == 1, "just checking");
45
46 OopMapBlock* map = ik->start_of_nonstatic_oop_maps();
47
48 // Check that the current map is (2,4) - currently points at field with
49 // offset 2 (words) and has 4 map entries.
64 }
65 }
66
67
68 // Verification
69
70 void InstanceRefKlass::oop_verify_on(oop obj, outputStream* st) {
71 InstanceKlass::oop_verify_on(obj, st);
72 // Verify referent field
73 oop referent = java_lang_ref_Reference::referent(obj);
74 if (referent != NULL) {
75 guarantee(referent->is_oop(), "referent field heap failed");
76 }
77 // Verify next field
78 oop next = java_lang_ref_Reference::next(obj);
79 if (next != NULL) {
80 guarantee(next->is_oop(), "next field should be an oop");
81 guarantee(next->is_instance(), "next field should be an instance");
82 guarantee(InstanceKlass::cast(next->klass())->is_reference_instance_klass(), "next field verify failed");
83 }
84 }
|