annotate src/share/vm/memory/gcLocker.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents ce8f6bb717c9
children 7848fc12602b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17876
diff changeset
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 196
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 196
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 196
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "memory/gcLocker.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "memory/sharedHeap.hpp"
20197
ce8f6bb717c9 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 17937
diff changeset
29 #include "runtime/thread.inline.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 volatile jint GC_locker::_jni_lock_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 volatile bool GC_locker::_needs_gc = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 volatile bool GC_locker::_doing_gc = false;
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
34
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
35 #ifdef ASSERT
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
36 volatile jint GC_locker::_debug_jni_lock_count = 0;
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
37 #endif
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
38
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
39
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
40 #ifdef ASSERT
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
41 void GC_locker::verify_critical_count() {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
42 if (SafepointSynchronize::is_at_safepoint()) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
43 assert(!needs_gc() || _debug_jni_lock_count == _jni_lock_count, "must agree");
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
44 int count = 0;
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
45 // Count the number of threads with critical operations in progress
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
46 for (JavaThread* thr = Threads::first(); thr; thr = thr->next()) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
47 if (thr->in_critical()) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
48 count++;
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
49 }
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
50 }
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
51 if (_jni_lock_count != count) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
52 tty->print_cr("critical counts don't match: %d != %d", _jni_lock_count, count);
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
53 for (JavaThread* thr = Threads::first(); thr; thr = thr->next()) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
54 if (thr->in_critical()) {
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17876
diff changeset
55 tty->print_cr(INTPTR_FORMAT " in_critical %d", p2i(thr), thr->in_critical());
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
56 }
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
57 }
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
58 }
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
59 assert(_jni_lock_count == count, "must be equal");
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
60 }
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
61 }
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
62 #endif
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
63
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
64 bool GC_locker::check_active_before_gc() {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
65 assert(SafepointSynchronize::is_at_safepoint(), "only read at safepoint");
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
66 if (is_active() && !_needs_gc) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
67 verify_critical_count();
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
68 _needs_gc = true;
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
69 if (PrintJNIGCStalls && PrintGCDetails) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
70 ResourceMark rm; // JavaThread::name() allocates to convert to UTF8
4944
09d00c18e323 7145537: minor tweaks to LogEvents
never
parents: 4873
diff changeset
71 gclog_or_tty->print_cr("%.3f: Setting _needs_gc. Thread \"%s\" %d locked.",
09d00c18e323 7145537: minor tweaks to LogEvents
never
parents: 4873
diff changeset
72 gclog_or_tty->time_stamp().seconds(), Thread::current()->name(), _jni_lock_count);
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
73 }
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
74
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
75 }
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
76 return is_active();
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
77 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 void GC_locker::stall_until_clear() {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 assert(!JavaThread::current()->in_critical(), "Would deadlock");
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
81 MutexLocker ml(JNICritical_lock);
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
82
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
83 if (needs_gc()) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
84 if (PrintJNIGCStalls && PrintGCDetails) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
85 ResourceMark rm; // JavaThread::name() allocates to convert to UTF8
4944
09d00c18e323 7145537: minor tweaks to LogEvents
never
parents: 4873
diff changeset
86 gclog_or_tty->print_cr("%.3f: Allocation failed. Thread \"%s\" is stalled by JNI critical section, %d locked.",
09d00c18e323 7145537: minor tweaks to LogEvents
never
parents: 4873
diff changeset
87 gclog_or_tty->time_stamp().seconds(), Thread::current()->name(), _jni_lock_count);
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
88 }
139
c0492d52d55b 6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents: 0
diff changeset
89 }
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
90
0
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // Wait for _needs_gc to be cleared
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
92 while (needs_gc()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
93 JNICritical_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
97 void GC_locker::jni_lock(JavaThread* thread) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
98 assert(!thread->in_critical(), "shouldn't currently be in a critical region");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 MutexLocker mu(JNICritical_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // Block entering threads if we know at least one thread is in a
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // JNI critical region and we need a GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // We check that at least one thread is in a critical region before
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // blocking because blocked threads are woken up by a thread exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // a JNI critical region.
17876
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
105 while (is_active_and_needs_gc() || _doing_gc) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
106 JNICritical_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
108 thread->enter_critical();
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
109 _jni_lock_count++;
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
110 increment_debug_jni_lock_count();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
113 void GC_locker::jni_unlock(JavaThread* thread) {
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
114 assert(thread->in_last_critical(), "should be exiting critical region");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
115 MutexLocker mu(JNICritical_lock);
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
116 _jni_lock_count--;
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
117 decrement_debug_jni_lock_count();
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
118 thread->exit_critical();
17876
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
119 if (needs_gc() && !is_active_internal()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // We're the last thread out. Cause a GC to occur.
17876
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
121 _doing_gc = true;
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
122 {
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
123 // Must give up the lock while at a safepoint
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
124 MutexUnlocker munlock(JNICritical_lock);
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
125 if (PrintJNIGCStalls && PrintGCDetails) {
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
126 ResourceMark rm; // JavaThread::name() allocates to convert to UTF8
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
127 gclog_or_tty->print_cr("%.3f: Thread \"%s\" is performing GC after exiting critical section, %d locked",
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
128 gclog_or_tty->time_stamp().seconds(), Thread::current()->name(), _jni_lock_count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
17876
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
130 Universe::heap()->collect(GCCause::_gc_locker);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
17876
9c3dc501b5eb 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
sjohanss
parents: 17467
diff changeset
132 _doing_gc = false;
4867
1a2723f7ad8e 7129164: JNI Get/ReleasePrimitiveArrayCritical doesn't scale
never
parents: 1972
diff changeset
133 _needs_gc = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
134 JNICritical_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // Implementation of No_GC_Verifier
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 No_GC_Verifier::No_GC_Verifier(bool verifygc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 _verifygc = verifygc;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (_verifygc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 CollectedHeap* h = Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
146 assert(!h->is_gc_active(), "GC active during No_GC_Verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
147 _old_invocations = h->total_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 No_GC_Verifier::~No_GC_Verifier() {
a61af66fc99e Initial load
duke
parents:
diff changeset
153 if (_verifygc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 CollectedHeap* h = Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
155 assert(!h->is_gc_active(), "GC active during No_GC_Verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
156 if (_old_invocations != h->total_collections()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 fatal("collection in a No_GC_Verifier secured function");
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 Pause_No_GC_Verifier::Pause_No_GC_Verifier(No_GC_Verifier * ngcv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 _ngcv = ngcv;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 if (_ngcv->_verifygc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // if we were verifying, then make sure that nothing is
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // wrong before we "pause" verification
a61af66fc99e Initial load
duke
parents:
diff changeset
167 CollectedHeap* h = Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
168 assert(!h->is_gc_active(), "GC active during No_GC_Verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
169 if (_ngcv->_old_invocations != h->total_collections()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 fatal("collection in a No_GC_Verifier secured function");
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 Pause_No_GC_Verifier::~Pause_No_GC_Verifier() {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 if (_ngcv->_verifygc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // if we were verifying before, then reenable verification
a61af66fc99e Initial load
duke
parents:
diff changeset
179 CollectedHeap* h = Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
180 assert(!h->is_gc_active(), "GC active during No_GC_Verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
181 _ngcv->_old_invocations = h->total_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // JRT_LEAF rules:
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // A JRT_LEAF method may not interfere with safepointing by
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // 1) acquiring or blocking on a Mutex or JavaLock - checked
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // 2) allocating heap memory - checked
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // 3) executing a VM operation - checked
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // 4) executing a system call (including malloc) that could block or grab a lock
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // 5) invoking GC
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // 6) reaching a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // 7) running too long
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Nor may any method it calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
196 JRT_Leaf_Verifier::JRT_Leaf_Verifier()
a61af66fc99e Initial load
duke
parents:
diff changeset
197 : No_Safepoint_Verifier(true, JRT_Leaf_Verifier::should_verify_GC())
a61af66fc99e Initial load
duke
parents:
diff changeset
198 {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 JRT_Leaf_Verifier::~JRT_Leaf_Verifier()
a61af66fc99e Initial load
duke
parents:
diff changeset
202 {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 bool JRT_Leaf_Verifier::should_verify_GC() {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 switch (JavaThread::current()->thread_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 case _thread_in_Java:
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // is in a leaf routine, there must be no safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
209 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
210 case _thread_in_native:
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // A native thread is not subject to safepoints.
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // Even while it is in a leaf routine, GC is ok
a61af66fc99e Initial load
duke
parents:
diff changeset
213 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
214 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Leaf routines cannot be called from other contexts.
a61af66fc99e Initial load
duke
parents:
diff changeset
216 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
217 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 #endif