Bug Summary

File:jdk/src/hotspot/share/runtime/objectMonitor.cpp
Warning:line 1959, column 7
Value stored to 'prv' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name objectMonitor.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -mthread-model posix -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/libjvm/objs/precompiled -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS -D _GNU_SOURCE -D _REENTRANT -D LIBC=gnu -D LINUX -D VM_LITTLE_ENDIAN -D _LP64=1 -D ASSERT -D CHECK_UNHANDLED_OOPS -D TARGET_ARCH_x86 -D INCLUDE_SUFFIX_OS=_linux -D INCLUDE_SUFFIX_CPU=_x86 -D INCLUDE_SUFFIX_COMPILER=_gcc -D TARGET_COMPILER_gcc -D AMD64 -D HOTSPOT_LIB_ARCH="amd64" -D COMPILER1 -D COMPILER2 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/adfiles -I /home/daniel/Projects/java/jdk/src/hotspot/share -I /home/daniel/Projects/java/jdk/src/hotspot/os/linux -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix -I /home/daniel/Projects/java/jdk/src/hotspot/cpu/x86 -I /home/daniel/Projects/java/jdk/src/hotspot/os_cpu/linux_x86 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc -I /home/daniel/Projects/java/jdk/src/hotspot/share/precompiled -I /home/daniel/Projects/java/jdk/src/hotspot/share/include -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix/include -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base/linux -I /home/daniel/Projects/java/jdk/src/java.base/share/native/libjimage -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/adfiles -I /home/daniel/Projects/java/jdk/src/hotspot/share -I /home/daniel/Projects/java/jdk/src/hotspot/os/linux -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix -I /home/daniel/Projects/java/jdk/src/hotspot/cpu/x86 -I /home/daniel/Projects/java/jdk/src/hotspot/os_cpu/linux_x86 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc -D _FORTIFY_SOURCE=2 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/x86_64-linux-gnu/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/x86_64-linux-gnu/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/c++/7.5.0/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -Wno-format-zero-length -Wno-unused-parameter -Wno-unused -Wno-parentheses -Wno-comment -Wno-unknown-pragmas -Wno-address -Wno-delete-non-virtual-dtor -Wno-char-subscripts -Wno-array-bounds -Wno-int-in-bool-context -Wno-ignored-qualifiers -Wno-missing-field-initializers -Wno-implicit-fallthrough -Wno-empty-body -Wno-strict-overflow -Wno-sequence-point -Wno-maybe-uninitialized -Wno-misleading-indentation -Wno-cast-function-type -Wno-shift-negative-value -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /home/daniel/Projects/java/jdk/make/hotspot -ferror-limit 19 -fmessage-length 0 -fvisibility hidden -stack-protector 1 -fno-rtti -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -o /home/daniel/Projects/java/scan/2021-12-21-193737-8510-1 -x c++ /home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp
1/*
2 * Copyright (c) 1998, 2021, 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/vmSymbols.hpp"
27#include "gc/shared/oopStorage.hpp"
28#include "gc/shared/oopStorageSet.hpp"
29#include "jfr/jfrEvents.hpp"
30#include "jfr/support/jfrThreadId.hpp"
31#include "logging/log.hpp"
32#include "logging/logStream.hpp"
33#include "memory/allocation.inline.hpp"
34#include "memory/resourceArea.hpp"
35#include "oops/markWord.hpp"
36#include "oops/oop.inline.hpp"
37#include "oops/oopHandle.inline.hpp"
38#include "oops/weakHandle.inline.hpp"
39#include "prims/jvmtiDeferredUpdates.hpp"
40#include "prims/jvmtiExport.hpp"
41#include "runtime/atomic.hpp"
42#include "runtime/handles.inline.hpp"
43#include "runtime/interfaceSupport.inline.hpp"
44#include "runtime/mutexLocker.hpp"
45#include "runtime/objectMonitor.hpp"
46#include "runtime/objectMonitor.inline.hpp"
47#include "runtime/orderAccess.hpp"
48#include "runtime/osThread.hpp"
49#include "runtime/perfData.hpp"
50#include "runtime/safefetch.inline.hpp"
51#include "runtime/safepointMechanism.inline.hpp"
52#include "runtime/sharedRuntime.hpp"
53#include "runtime/thread.inline.hpp"
54#include "services/threadService.hpp"
55#include "utilities/dtrace.hpp"
56#include "utilities/macros.hpp"
57#include "utilities/preserveException.hpp"
58#if INCLUDE_JFR1
59#include "jfr/support/jfrFlush.hpp"
60#endif
61
62#ifdef DTRACE_ENABLED
63
64// Only bother with this argument setup if dtrace is available
65// TODO-FIXME: probes should not fire when caller is _blocked. assert() accordingly.
66
67
68#define DTRACE_MONITOR_PROBE_COMMON(obj, thread) \
69 char* bytes = NULL__null; \
70 int len = 0; \
71 jlong jtid = SharedRuntime::get_java_tid(thread); \
72 Symbol* klassname = obj->klass()->name(); \
73 if (klassname != NULL__null) { \
74 bytes = (char*)klassname->bytes(); \
75 len = klassname->utf8_length(); \
76 }
77
78#define DTRACE_MONITOR_WAIT_PROBE(monitor, obj, thread, millis){;} \
79 { \
80 if (DTraceMonitorProbes) { \
81 DTRACE_MONITOR_PROBE_COMMON(obj, thread); \
82 HOTSPOT_MONITOR_WAIT(jtid, \
83 (monitor), bytes, len, (millis)); \
84 } \
85 }
86
87#define HOTSPOT_MONITOR_contended__enter HOTSPOT_MONITOR_CONTENDED_ENTER
88#define HOTSPOT_MONITOR_contended__entered HOTSPOT_MONITOR_CONTENDED_ENTERED
89#define HOTSPOT_MONITOR_contended__exit HOTSPOT_MONITOR_CONTENDED_EXIT
90#define HOTSPOT_MONITOR_notify HOTSPOT_MONITOR_NOTIFY
91#define HOTSPOT_MONITOR_notifyAll HOTSPOT_MONITOR_NOTIFYALL
92
93#define DTRACE_MONITOR_PROBE(probe, monitor, obj, thread){;} \
94 { \
95 if (DTraceMonitorProbes) { \
96 DTRACE_MONITOR_PROBE_COMMON(obj, thread); \
97 HOTSPOT_MONITOR_##probe(jtid, \
98 (uintptr_t)(monitor), bytes, len); \
99 } \
100 }
101
102#else // ndef DTRACE_ENABLED
103
104#define DTRACE_MONITOR_WAIT_PROBE(obj, thread, millis, mon){;} {;}
105#define DTRACE_MONITOR_PROBE(probe, obj, thread, mon){;} {;}
106
107#endif // ndef DTRACE_ENABLED
108
109// Tunables ...
110// The knob* variables are effectively final. Once set they should
111// never be modified hence. Consider using __read_mostly with GCC.
112
113int ObjectMonitor::Knob_SpinLimit = 5000; // derived by an external tool -
114
115static int Knob_Bonus = 100; // spin success bonus
116static int Knob_BonusB = 100; // spin success bonus
117static int Knob_Penalty = 200; // spin failure penalty
118static int Knob_Poverty = 1000;
119static int Knob_FixedSpin = 0;
120static int Knob_PreSpin = 10; // 20-100 likely better
121
122DEBUG_ONLY(static volatile bool InitDone = false;)static volatile bool InitDone = false;
123
124OopStorage* ObjectMonitor::_oop_storage = NULL__null;
125
126// -----------------------------------------------------------------------------
127// Theory of operations -- Monitors lists, thread residency, etc:
128//
129// * A thread acquires ownership of a monitor by successfully
130// CAS()ing the _owner field from null to non-null.
131//
132// * Invariant: A thread appears on at most one monitor list --
133// cxq, EntryList or WaitSet -- at any one time.
134//
135// * Contending threads "push" themselves onto the cxq with CAS
136// and then spin/park.
137//
138// * After a contending thread eventually acquires the lock it must
139// dequeue itself from either the EntryList or the cxq.
140//
141// * The exiting thread identifies and unparks an "heir presumptive"
142// tentative successor thread on the EntryList. Critically, the
143// exiting thread doesn't unlink the successor thread from the EntryList.
144// After having been unparked, the wakee will recontend for ownership of
145// the monitor. The successor (wakee) will either acquire the lock or
146// re-park itself.
147//
148// Succession is provided for by a policy of competitive handoff.
149// The exiting thread does _not_ grant or pass ownership to the
150// successor thread. (This is also referred to as "handoff" succession").
151// Instead the exiting thread releases ownership and possibly wakes
152// a successor, so the successor can (re)compete for ownership of the lock.
153// If the EntryList is empty but the cxq is populated the exiting
154// thread will drain the cxq into the EntryList. It does so by
155// by detaching the cxq (installing null with CAS) and folding
156// the threads from the cxq into the EntryList. The EntryList is
157// doubly linked, while the cxq is singly linked because of the
158// CAS-based "push" used to enqueue recently arrived threads (RATs).
159//
160// * Concurrency invariants:
161//
162// -- only the monitor owner may access or mutate the EntryList.
163// The mutex property of the monitor itself protects the EntryList
164// from concurrent interference.
165// -- Only the monitor owner may detach the cxq.
166//
167// * The monitor entry list operations avoid locks, but strictly speaking
168// they're not lock-free. Enter is lock-free, exit is not.
169// For a description of 'Methods and apparatus providing non-blocking access
170// to a resource,' see U.S. Pat. No. 7844973.
171//
172// * The cxq can have multiple concurrent "pushers" but only one concurrent
173// detaching thread. This mechanism is immune from the ABA corruption.
174// More precisely, the CAS-based "push" onto cxq is ABA-oblivious.
175//
176// * Taken together, the cxq and the EntryList constitute or form a
177// single logical queue of threads stalled trying to acquire the lock.
178// We use two distinct lists to improve the odds of a constant-time
179// dequeue operation after acquisition (in the ::enter() epilogue) and
180// to reduce heat on the list ends. (c.f. Michael Scott's "2Q" algorithm).
181// A key desideratum is to minimize queue & monitor metadata manipulation
182// that occurs while holding the monitor lock -- that is, we want to
183// minimize monitor lock holds times. Note that even a small amount of
184// fixed spinning will greatly reduce the # of enqueue-dequeue operations
185// on EntryList|cxq. That is, spinning relieves contention on the "inner"
186// locks and monitor metadata.
187//
188// Cxq points to the set of Recently Arrived Threads attempting entry.
189// Because we push threads onto _cxq with CAS, the RATs must take the form of
190// a singly-linked LIFO. We drain _cxq into EntryList at unlock-time when
191// the unlocking thread notices that EntryList is null but _cxq is != null.
192//
193// The EntryList is ordered by the prevailing queue discipline and
194// can be organized in any convenient fashion, such as a doubly-linked list or
195// a circular doubly-linked list. Critically, we want insert and delete operations
196// to operate in constant-time. If we need a priority queue then something akin
197// to Solaris' sleepq would work nicely. Viz.,
198// http://agg.eng/ws/on10_nightly/source/usr/src/uts/common/os/sleepq.c.
199// Queue discipline is enforced at ::exit() time, when the unlocking thread
200// drains the cxq into the EntryList, and orders or reorders the threads on the
201// EntryList accordingly.
202//
203// Barring "lock barging", this mechanism provides fair cyclic ordering,
204// somewhat similar to an elevator-scan.
205//
206// * The monitor synchronization subsystem avoids the use of native
207// synchronization primitives except for the narrow platform-specific
208// park-unpark abstraction. See the comments in os_solaris.cpp regarding
209// the semantics of park-unpark. Put another way, this monitor implementation
210// depends only on atomic operations and park-unpark. The monitor subsystem
211// manages all RUNNING->BLOCKED and BLOCKED->READY transitions while the
212// underlying OS manages the READY<->RUN transitions.
213//
214// * Waiting threads reside on the WaitSet list -- wait() puts
215// the caller onto the WaitSet.
216//
217// * notify() or notifyAll() simply transfers threads from the WaitSet to
218// either the EntryList or cxq. Subsequent exit() operations will
219// unpark the notifyee. Unparking a notifee in notify() is inefficient -
220// it's likely the notifyee would simply impale itself on the lock held
221// by the notifier.
222//
223// * An interesting alternative is to encode cxq as (List,LockByte) where
224// the LockByte is 0 iff the monitor is owned. _owner is simply an auxiliary
225// variable, like _recursions, in the scheme. The threads or Events that form
226// the list would have to be aligned in 256-byte addresses. A thread would
227// try to acquire the lock or enqueue itself with CAS, but exiting threads
228// could use a 1-0 protocol and simply STB to set the LockByte to 0.
229// Note that is is *not* word-tearing, but it does presume that full-word
230// CAS operations are coherent with intermix with STB operations. That's true
231// on most common processors.
232//
233// * See also http://blogs.sun.com/dave
234
235
236void* ObjectMonitor::operator new (size_t size) throw() {
237 return AllocateHeap(size, mtInternal);
238}
239void* ObjectMonitor::operator new[] (size_t size) throw() {
240 return operator new (size);
241}
242void ObjectMonitor::operator delete(void* p) {
243 FreeHeap(p);
244}
245void ObjectMonitor::operator delete[] (void *p) {
246 operator delete(p);
247}
248
249// Check that object() and set_object() are called from the right context:
250static void check_object_context() {
251#ifdef ASSERT1
252 Thread* self = Thread::current();
253 if (self->is_Java_thread()) {
254 // Mostly called from JavaThreads so sanity check the thread state.
255 JavaThread* jt = JavaThread::cast(self);
256 switch (jt->thread_state()) {
257 case _thread_in_vm: // the usual case
258 case _thread_in_Java: // during deopt
259 break;
260 default:
261 fatal("called from an unsafe thread state")do { (*g_assert_poison) = 'X';; report_fatal(INTERNAL_ERROR, "/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 261, "called from an unsafe thread state"); ::breakpoint();
} while (0)
;
262 }
263 assert(jt->is_active_Java_thread(), "must be active JavaThread")do { if (!(jt->is_active_Java_thread())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 263, "assert(" "jt->is_active_Java_thread()" ") failed",
"must be active JavaThread"); ::breakpoint(); } } while (0)
;
264 } else {
265 // However, ThreadService::get_current_contended_monitor()
266 // can call here via the VMThread so sanity check it.
267 assert(self->is_VM_thread(), "must be")do { if (!(self->is_VM_thread())) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 267, "assert(" "self->is_VM_thread()" ") failed", "must be"
); ::breakpoint(); } } while (0)
;
268 }
269#endif // ASSERT
270}
271
272ObjectMonitor::ObjectMonitor(oop object) :
273 _header(markWord::zero()),
274 _object(_oop_storage, object),
275 _owner(NULL__null),
276 _previous_owner_tid(0),
277 _next_om(NULL__null),
278 _recursions(0),
279 _EntryList(NULL__null),
280 _cxq(NULL__null),
281 _succ(NULL__null),
282 _Responsible(NULL__null),
283 _Spinner(0),
284 _SpinDuration(ObjectMonitor::Knob_SpinLimit),
285 _contentions(0),
286 _WaitSet(NULL__null),
287 _waiters(0),
288 _WaitSetLock(0)
289{ }
290
291ObjectMonitor::~ObjectMonitor() {
292 _object.release(_oop_storage);
293}
294
295oop ObjectMonitor::object() const {
296 check_object_context();
297 if (_object.is_null()) {
298 return NULL__null;
299 }
300 return _object.resolve();
301}
302
303oop ObjectMonitor::object_peek() const {
304 if (_object.is_null()) {
305 return NULL__null;
306 }
307 return _object.peek();
308}
309
310void ObjectMonitor::ExitOnSuspend::operator()(JavaThread* current) {
311 if (current->is_suspended()) {
312 _om->_recursions = 0;
313 _om->_succ = NULL__null;
314 // Don't need a full fence after clearing successor here because of the call to exit().
315 _om->exit(current, false /* not_suspended */);
316 _om_exited = true;
317
318 current->set_current_pending_monitor(_om);
319 }
320}
321
322void ObjectMonitor::ClearSuccOnSuspend::operator()(JavaThread* current) {
323 if (current->is_suspended()) {
324 if (_om->_succ == current) {
325 _om->_succ = NULL__null;
326 OrderAccess::fence(); // always do a full fence when successor is cleared
327 }
328 }
329}
330
331// -----------------------------------------------------------------------------
332// Enter support
333
334bool ObjectMonitor::enter(JavaThread* current) {
335 // The following code is ordered to check the most common cases first
336 // and to reduce RTS->RTO cache line upgrades on SPARC and IA32 processors.
337
338 void* cur = try_set_owner_from(NULL__null, current);
339 if (cur == NULL__null) {
340 assert(_recursions == 0, "invariant")do { if (!(_recursions == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 340, "assert(" "_recursions == 0" ") failed", "invariant");
::breakpoint(); } } while (0)
;
341 return true;
342 }
343
344 if (cur == current) {
345 // TODO-FIXME: check for integer overflow! BUGID 6557169.
346 _recursions++;
347 return true;
348 }
349
350 if (current->is_lock_owned((address)cur)) {
351 assert(_recursions == 0, "internal state error")do { if (!(_recursions == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 351, "assert(" "_recursions == 0" ") failed", "internal state error"
); ::breakpoint(); } } while (0)
;
352 _recursions = 1;
353 set_owner_from_BasicLock(cur, current); // Convert from BasicLock* to Thread*.
354 return true;
355 }
356
357 // We've encountered genuine contention.
358 assert(current->_Stalled == 0, "invariant")do { if (!(current->_Stalled == 0)) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 358, "assert(" "current->_Stalled == 0" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
359 current->_Stalled = intptr_t(this);
360
361 // Try one round of spinning *before* enqueueing current
362 // and before going through the awkward and expensive state
363 // transitions. The following spin is strictly optional ...
364 // Note that if we acquire the monitor from an initial spin
365 // we forgo posting JVMTI events and firing DTRACE probes.
366 if (TrySpin(current) > 0) {
367 assert(owner_raw() == current, "must be current: owner=" INTPTR_FORMAT, p2i(owner_raw()))do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 367, "assert(" "owner_raw() == current" ") failed", "must be current: owner="
"0x%016" "l" "x", p2i(owner_raw())); ::breakpoint(); } } while
(0)
;
368 assert(_recursions == 0, "must be 0: recursions=" INTX_FORMAT, _recursions)do { if (!(_recursions == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 368, "assert(" "_recursions == 0" ") failed", "must be 0: recursions="
"%" "l" "d", _recursions); ::breakpoint(); } } while (0)
;
369 assert(object()->mark() == markWord::encode(this),do { if (!(object()->mark() == markWord::encode(this))) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 372, "assert(" "object()->mark() == markWord::encode(this)"
") failed", "object mark must match encoded this: mark=" "0x%016"
"l" "x" ", encoded this=" "0x%016" "l" "x", object()->mark
().value(), markWord::encode(this).value()); ::breakpoint(); }
} while (0)
370 "object mark must match encoded this: mark=" INTPTR_FORMATdo { if (!(object()->mark() == markWord::encode(this))) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 372, "assert(" "object()->mark() == markWord::encode(this)"
") failed", "object mark must match encoded this: mark=" "0x%016"
"l" "x" ", encoded this=" "0x%016" "l" "x", object()->mark
().value(), markWord::encode(this).value()); ::breakpoint(); }
} while (0)
371 ", encoded this=" INTPTR_FORMAT, object()->mark().value(),do { if (!(object()->mark() == markWord::encode(this))) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 372, "assert(" "object()->mark() == markWord::encode(this)"
") failed", "object mark must match encoded this: mark=" "0x%016"
"l" "x" ", encoded this=" "0x%016" "l" "x", object()->mark
().value(), markWord::encode(this).value()); ::breakpoint(); }
} while (0)
372 markWord::encode(this).value())do { if (!(object()->mark() == markWord::encode(this))) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 372, "assert(" "object()->mark() == markWord::encode(this)"
") failed", "object mark must match encoded this: mark=" "0x%016"
"l" "x" ", encoded this=" "0x%016" "l" "x", object()->mark
().value(), markWord::encode(this).value()); ::breakpoint(); }
} while (0)
;
373 current->_Stalled = 0;
374 return true;
375 }
376
377 assert(owner_raw() != current, "invariant")do { if (!(owner_raw() != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 377, "assert(" "owner_raw() != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
378 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 378, "assert(" "_succ != current" ") failed", "invariant");
::breakpoint(); } } while (0)
;
379 assert(!SafepointSynchronize::is_at_safepoint(), "invariant")do { if (!(!SafepointSynchronize::is_at_safepoint())) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 379, "assert(" "!SafepointSynchronize::is_at_safepoint()" ") failed"
, "invariant"); ::breakpoint(); } } while (0)
;
380 assert(current->thread_state() != _thread_blocked, "invariant")do { if (!(current->thread_state() != _thread_blocked)) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 380, "assert(" "current->thread_state() != _thread_blocked"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
381
382 // Keep track of contention for JVM/TI and M&M queries.
383 add_to_contentions(1);
384 if (is_being_async_deflated()) {
385 // Async deflation is in progress and our contentions increment
386 // above lost the race to async deflation. Undo the work and
387 // force the caller to retry.
388 const oop l_object = object();
389 if (l_object != NULL__null) {
390 // Attempt to restore the header/dmw to the object's header so that
391 // we only retry once if the deflater thread happens to be slow.
392 install_displaced_markword_in_object(l_object);
393 }
394 current->_Stalled = 0;
395 add_to_contentions(-1);
396 return false;
397 }
398
399 JFR_ONLY(JfrConditionalFlushWithStacktrace<EventJavaMonitorEnter> flush(current);)JfrConditionalFlushWithStacktrace<EventJavaMonitorEnter>
flush(current);
400 EventJavaMonitorEnter event;
401 if (event.is_started()) {
402 event.set_monitorClass(object()->klass());
403 // Set an address that is 'unique enough', such that events close in
404 // time and with the same address are likely (but not guaranteed) to
405 // belong to the same object.
406 event.set_address((uintptr_t)this);
407 }
408
409 { // Change java thread status to indicate blocked on monitor enter.
410 JavaThreadBlockedOnMonitorEnterState jtbmes(current, this);
411
412 assert(current->current_pending_monitor() == NULL, "invariant")do { if (!(current->current_pending_monitor() == __null)) {
(*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 412, "assert(" "current->current_pending_monitor() == __null"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
413 current->set_current_pending_monitor(this);
414
415 DTRACE_MONITOR_PROBE(contended__enter, this, object(), current){;};
416 if (JvmtiExport::should_post_monitor_contended_enter()) {
417 JvmtiExport::post_monitor_contended_enter(current, this);
418
419 // The current thread does not yet own the monitor and does not
420 // yet appear on any queues that would get it made the successor.
421 // This means that the JVMTI_EVENT_MONITOR_CONTENDED_ENTER event
422 // handler cannot accidentally consume an unpark() meant for the
423 // ParkEvent associated with this ObjectMonitor.
424 }
425
426 OSThreadContendState osts(current->osthread());
427
428 assert(current->thread_state() == _thread_in_vm, "invariant")do { if (!(current->thread_state() == _thread_in_vm)) { (*
g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 428, "assert(" "current->thread_state() == _thread_in_vm"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
429
430 for (;;) {
431 ExitOnSuspend eos(this);
432 {
433 ThreadBlockInVMPreprocess<ExitOnSuspend> tbivs(current, eos, true /* allow_suspend */);
434 EnterI(current);
435 current->set_current_pending_monitor(NULL__null);
436 // We can go to a safepoint at the end of this block. If we
437 // do a thread dump during that safepoint, then this thread will show
438 // as having "-locked" the monitor, but the OS and java.lang.Thread
439 // states will still report that the thread is blocked trying to
440 // acquire it.
441 // If there is a suspend request, ExitOnSuspend will exit the OM
442 // and set the OM as pending.
443 }
444 if (!eos.exited()) {
445 // ExitOnSuspend did not exit the OM
446 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 446, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
447 break;
448 }
449 }
450
451 // We've just gotten past the enter-check-for-suspend dance and we now own
452 // the monitor free and clear.
453 }
454
455 add_to_contentions(-1);
456 assert(contentions() >= 0, "must not be negative: contentions=%d", contentions())do { if (!(contentions() >= 0)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 456, "assert(" "contentions() >= 0" ") failed", "must not be negative: contentions=%d"
, contentions()); ::breakpoint(); } } while (0)
;
457 current->_Stalled = 0;
458
459 // Must either set _recursions = 0 or ASSERT _recursions == 0.
460 assert(_recursions == 0, "invariant")do { if (!(_recursions == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 460, "assert(" "_recursions == 0" ") failed", "invariant");
::breakpoint(); } } while (0)
;
461 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 461, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
462 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 462, "assert(" "_succ != current" ") failed", "invariant");
::breakpoint(); } } while (0)
;
463 assert(object()->mark() == markWord::encode(this), "invariant")do { if (!(object()->mark() == markWord::encode(this))) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 463, "assert(" "object()->mark() == markWord::encode(this)"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
464
465 // The thread -- now the owner -- is back in vm mode.
466 // Report the glorious news via TI,DTrace and jvmstat.
467 // The probe effect is non-trivial. All the reportage occurs
468 // while we hold the monitor, increasing the length of the critical
469 // section. Amdahl's parallel speedup law comes vividly into play.
470 //
471 // Another option might be to aggregate the events (thread local or
472 // per-monitor aggregation) and defer reporting until a more opportune
473 // time -- such as next time some thread encounters contention but has
474 // yet to acquire the lock. While spinning that thread could
475 // spinning we could increment JVMStat counters, etc.
476
477 DTRACE_MONITOR_PROBE(contended__entered, this, object(), current){;};
478 if (JvmtiExport::should_post_monitor_contended_entered()) {
479 JvmtiExport::post_monitor_contended_entered(current, this);
480
481 // The current thread already owns the monitor and is not going to
482 // call park() for the remainder of the monitor enter protocol. So
483 // it doesn't matter if the JVMTI_EVENT_MONITOR_CONTENDED_ENTERED
484 // event handler consumed an unpark() issued by the thread that
485 // just exited the monitor.
486 }
487 if (event.should_commit()) {
488 event.set_previousOwner(_previous_owner_tid);
489 event.commit();
490 }
491 OM_PERFDATA_OP(ContendedLockAttempts, inc())do { if (ObjectMonitor::_sync_ContendedLockAttempts != __null
&& PerfDataManager::has_PerfData()) { ObjectMonitor::
_sync_ContendedLockAttempts->inc(); } } while (0)
;
492 return true;
493}
494
495// Caveat: TryLock() is not necessarily serializing if it returns failure.
496// Callers must compensate as needed.
497
498int ObjectMonitor::TryLock(JavaThread* current) {
499 void* own = owner_raw();
500 if (own != NULL__null) return 0;
501 if (try_set_owner_from(NULL__null, current) == NULL__null) {
502 assert(_recursions == 0, "invariant")do { if (!(_recursions == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 502, "assert(" "_recursions == 0" ") failed", "invariant");
::breakpoint(); } } while (0)
;
503 return 1;
504 }
505 // The lock had been free momentarily, but we lost the race to the lock.
506 // Interference -- the CAS failed.
507 // We can either return -1 or retry.
508 // Retry doesn't make as much sense because the lock was just acquired.
509 return -1;
510}
511
512// Deflate the specified ObjectMonitor if not in-use. Returns true if it
513// was deflated and false otherwise.
514//
515// The async deflation protocol sets owner to DEFLATER_MARKER and
516// makes contentions negative as signals to contending threads that
517// an async deflation is in progress. There are a number of checks
518// as part of the protocol to make sure that the calling thread has
519// not lost the race to a contending thread.
520//
521// The ObjectMonitor has been successfully async deflated when:
522// (contentions < 0)
523// Contending threads that see that condition know to retry their operation.
524//
525bool ObjectMonitor::deflate_monitor() {
526 if (is_busy()) {
527 // Easy checks are first - the ObjectMonitor is busy so no deflation.
528 return false;
529 }
530
531 if (ObjectSynchronizer::is_final_audit() && owner_is_DEFLATER_MARKER()) {
532 // The final audit can see an already deflated ObjectMonitor on the
533 // in-use list because MonitorList::unlink_deflated() might have
534 // blocked for the final safepoint before unlinking all the deflated
535 // monitors.
536 assert(contentions() < 0, "must be negative: contentions=%d", contentions())do { if (!(contentions() < 0)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 536, "assert(" "contentions() < 0" ") failed", "must be negative: contentions=%d"
, contentions()); ::breakpoint(); } } while (0)
;
537 // Already returned 'true' when it was originally deflated.
538 return false;
539 }
540
541 const oop obj = object_peek();
542
543 if (obj == NULL__null) {
544 // If the object died, we can recycle the monitor without racing with
545 // Java threads. The GC already broke the association with the object.
546 set_owner_from(NULL__null, DEFLATER_MARKERreinterpret_cast<void*>(-1));
547 assert(contentions() >= 0, "must be non-negative: contentions=%d", contentions())do { if (!(contentions() >= 0)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 547, "assert(" "contentions() >= 0" ") failed", "must be non-negative: contentions=%d"
, contentions()); ::breakpoint(); } } while (0)
;
548 _contentions = INT_MIN(-2147483647 -1); // minimum negative int
549 } else {
550 // Attempt async deflation protocol.
551
552 // Set a NULL owner to DEFLATER_MARKER to force any contending thread
553 // through the slow path. This is just the first part of the async
554 // deflation dance.
555 if (try_set_owner_from(NULL__null, DEFLATER_MARKERreinterpret_cast<void*>(-1)) != NULL__null) {
556 // The owner field is no longer NULL so we lost the race since the
557 // ObjectMonitor is now busy.
558 return false;
559 }
560
561 if (contentions() > 0 || _waiters != 0) {
562 // Another thread has raced to enter the ObjectMonitor after
563 // is_busy() above or has already entered and waited on
564 // it which makes it busy so no deflation. Restore owner to
565 // NULL if it is still DEFLATER_MARKER.
566 if (try_set_owner_from(DEFLATER_MARKERreinterpret_cast<void*>(-1), NULL__null) != DEFLATER_MARKERreinterpret_cast<void*>(-1)) {
567 // Deferred decrement for the JT EnterI() that cancelled the async deflation.
568 add_to_contentions(-1);
569 }
570 return false;
571 }
572
573 // Make a zero contentions field negative to force any contending threads
574 // to retry. This is the second part of the async deflation dance.
575 if (Atomic::cmpxchg(&_contentions, 0, INT_MIN(-2147483647 -1)) != 0) {
576 // Contentions was no longer 0 so we lost the race since the
577 // ObjectMonitor is now busy. Restore owner to NULL if it is
578 // still DEFLATER_MARKER:
579 if (try_set_owner_from(DEFLATER_MARKERreinterpret_cast<void*>(-1), NULL__null) != DEFLATER_MARKERreinterpret_cast<void*>(-1)) {
580 // Deferred decrement for the JT EnterI() that cancelled the async deflation.
581 add_to_contentions(-1);
582 }
583 return false;
584 }
585 }
586
587 // Sanity checks for the races:
588 guarantee(owner_is_DEFLATER_MARKER(), "must be deflater marker")do { if (!(owner_is_DEFLATER_MARKER())) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 588, "guarantee(" "owner_is_DEFLATER_MARKER()" ") failed", "must be deflater marker"
); ::breakpoint(); } } while (0)
;
589 guarantee(contentions() < 0, "must be negative: contentions=%d",do { if (!(contentions() < 0)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 590, "guarantee(" "contentions() < 0" ") failed", "must be negative: contentions=%d"
, contentions()); ::breakpoint(); } } while (0)
590 contentions())do { if (!(contentions() < 0)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 590, "guarantee(" "contentions() < 0" ") failed", "must be negative: contentions=%d"
, contentions()); ::breakpoint(); } } while (0)
;
591 guarantee(_waiters == 0, "must be 0: waiters=%d", _waiters)do { if (!(_waiters == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 591, "guarantee(" "_waiters == 0" ") failed", "must be 0: waiters=%d"
, _waiters); ::breakpoint(); } } while (0)
;
592 guarantee(_cxq == NULL, "must be no contending threads: cxq="do { if (!(_cxq == __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 593, "guarantee(" "_cxq == NULL" ") failed", "must be no contending threads: cxq="
"0x%016" "l" "x", p2i(_cxq)); ::breakpoint(); } } while (0)
593 INTPTR_FORMAT, p2i(_cxq))do { if (!(_cxq == __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 593, "guarantee(" "_cxq == NULL" ") failed", "must be no contending threads: cxq="
"0x%016" "l" "x", p2i(_cxq)); ::breakpoint(); } } while (0)
;
594 guarantee(_EntryList == NULL,do { if (!(_EntryList == __null)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 596, "guarantee(" "_EntryList == NULL" ") failed", "must be no entering threads: EntryList="
"0x%016" "l" "x", p2i(_EntryList)); ::breakpoint(); } } while
(0)
595 "must be no entering threads: EntryList=" INTPTR_FORMAT,do { if (!(_EntryList == __null)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 596, "guarantee(" "_EntryList == NULL" ") failed", "must be no entering threads: EntryList="
"0x%016" "l" "x", p2i(_EntryList)); ::breakpoint(); } } while
(0)
596 p2i(_EntryList))do { if (!(_EntryList == __null)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 596, "guarantee(" "_EntryList == NULL" ") failed", "must be no entering threads: EntryList="
"0x%016" "l" "x", p2i(_EntryList)); ::breakpoint(); } } while
(0)
;
597
598 if (obj != NULL__null) {
599 if (log_is_enabled(Trace, monitorinflation)(LogImpl<(LogTag::_monitorinflation), (LogTag::__NO_TAG), (
LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag
::__NO_TAG)>::is_level(LogLevel::Trace))
) {
600 ResourceMark rm;
601 log_trace(monitorinflation)(!(LogImpl<(LogTag::_monitorinflation), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG),
(LogTag::__NO_TAG)>::is_level(LogLevel::Trace))) ? (void)
0 : LogImpl<(LogTag::_monitorinflation), (LogTag::__NO_TAG
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG)>::write<LogLevel::Trace>
("deflate_monitor: object=" INTPTR_FORMAT"0x%016" "l" "x"
602 ", mark=" INTPTR_FORMAT"0x%016" "l" "x" ", type='%s'",
603 p2i(obj), obj->mark().value(),
604 obj->klass()->external_name());
605 }
606
607 // Install the old mark word if nobody else has already done it.
608 install_displaced_markword_in_object(obj);
609 }
610
611 // We leave owner == DEFLATER_MARKER and contentions < 0
612 // to force any racing threads to retry.
613 return true; // Success, ObjectMonitor has been deflated.
614}
615
616// Install the displaced mark word (dmw) of a deflating ObjectMonitor
617// into the header of the object associated with the monitor. This
618// idempotent method is called by a thread that is deflating a
619// monitor and by other threads that have detected a race with the
620// deflation process.
621void ObjectMonitor::install_displaced_markword_in_object(const oop obj) {
622 // This function must only be called when (owner == DEFLATER_MARKER
623 // && contentions <= 0), but we can't guarantee that here because
624 // those values could change when the ObjectMonitor gets moved from
625 // the global free list to a per-thread free list.
626
627 guarantee(obj != NULL, "must be non-NULL")do { if (!(obj != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 627, "guarantee(" "obj != NULL" ") failed", "must be non-NULL"
); ::breakpoint(); } } while (0)
;
628
629 // Separate loads in is_being_async_deflated(), which is almost always
630 // called before this function, from the load of dmw/header below.
631
632 // _contentions and dmw/header may get written by different threads.
633 // Make sure to observe them in the same order when having several observers.
634 OrderAccess::loadload_for_IRIW();
635
636 const oop l_object = object_peek();
637 if (l_object == NULL__null) {
638 // ObjectMonitor's object ref has already been cleared by async
639 // deflation or GC so we're done here.
640 return;
641 }
642 assert(l_object == obj, "object=" INTPTR_FORMAT " must equal obj="do { if (!(l_object == obj)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 643, "assert(" "l_object == obj" ") failed", "object=" "0x%016"
"l" "x" " must equal obj=" "0x%016" "l" "x", p2i(l_object), p2i
(obj)); ::breakpoint(); } } while (0)
643 INTPTR_FORMAT, p2i(l_object), p2i(obj))do { if (!(l_object == obj)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 643, "assert(" "l_object == obj" ") failed", "object=" "0x%016"
"l" "x" " must equal obj=" "0x%016" "l" "x", p2i(l_object), p2i
(obj)); ::breakpoint(); } } while (0)
;
644
645 markWord dmw = header();
646 // The dmw has to be neutral (not NULL, not locked and not marked).
647 assert(dmw.is_neutral(), "must be neutral: dmw=" INTPTR_FORMAT, dmw.value())do { if (!(dmw.is_neutral())) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 647, "assert(" "dmw.is_neutral()" ") failed", "must be neutral: dmw="
"0x%016" "l" "x", dmw.value()); ::breakpoint(); } } while (0
)
;
648
649 // Install displaced mark word if the object's header still points
650 // to this ObjectMonitor. More than one racing caller to this function
651 // can rarely reach this point, but only one can win.
652 markWord res = obj->cas_set_mark(dmw, markWord::encode(this));
653 if (res != markWord::encode(this)) {
654 // This should be rare so log at the Info level when it happens.
655 log_info(monitorinflation)(!(LogImpl<(LogTag::_monitorinflation), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG),
(LogTag::__NO_TAG)>::is_level(LogLevel::Info))) ? (void)0
: LogImpl<(LogTag::_monitorinflation), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG),
(LogTag::__NO_TAG)>::write<LogLevel::Info>
("install_displaced_markword_in_object: "
656 "failed cas_set_mark: new_mark=" INTPTR_FORMAT"0x%016" "l" "x"
657 ", old_mark=" INTPTR_FORMAT"0x%016" "l" "x" ", res=" INTPTR_FORMAT"0x%016" "l" "x",
658 dmw.value(), markWord::encode(this).value(),
659 res.value());
660 }
661
662 // Note: It does not matter which thread restored the header/dmw
663 // into the object's header. The thread deflating the monitor just
664 // wanted the object's header restored and it is. The threads that
665 // detected a race with the deflation process also wanted the
666 // object's header restored before they retry their operation and
667 // because it is restored they will only retry once.
668}
669
670// Convert the fields used by is_busy() to a string that can be
671// used for diagnostic output.
672const char* ObjectMonitor::is_busy_to_string(stringStream* ss) {
673 ss->print("is_busy: waiters=%d, ", _waiters);
674 if (contentions() > 0) {
675 ss->print("contentions=%d, ", contentions());
676 } else {
677 ss->print("contentions=0");
678 }
679 if (!owner_is_DEFLATER_MARKER()) {
680 ss->print("owner=" INTPTR_FORMAT"0x%016" "l" "x", p2i(owner_raw()));
681 } else {
682 // We report NULL instead of DEFLATER_MARKER here because is_busy()
683 // ignores DEFLATER_MARKER values.
684 ss->print("owner=" INTPTR_FORMAT"0x%016" "l" "x", NULL__null);
685 }
686 ss->print(", cxq=" INTPTR_FORMAT"0x%016" "l" "x" ", EntryList=" INTPTR_FORMAT"0x%016" "l" "x", p2i(_cxq),
687 p2i(_EntryList));
688 return ss->base();
689}
690
691#define MAX_RECHECK_INTERVAL1000 1000
692
693void ObjectMonitor::EnterI(JavaThread* current) {
694 assert(current->thread_state() == _thread_blocked, "invariant")do { if (!(current->thread_state() == _thread_blocked)) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 694, "assert(" "current->thread_state() == _thread_blocked"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
695
696 // Try the lock - TATAS
697 if (TryLock (current) > 0) {
698 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 698, "assert(" "_succ != current" ") failed", "invariant");
::breakpoint(); } } while (0)
;
699 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 699, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
700 assert(_Responsible != current, "invariant")do { if (!(_Responsible != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 700, "assert(" "_Responsible != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
701 return;
702 }
703
704 if (try_set_owner_from(DEFLATER_MARKERreinterpret_cast<void*>(-1), current) == DEFLATER_MARKERreinterpret_cast<void*>(-1)) {
705 // Cancelled the in-progress async deflation by changing owner from
706 // DEFLATER_MARKER to current. As part of the contended enter protocol,
707 // contentions was incremented to a positive value before EnterI()
708 // was called and that prevents the deflater thread from winning the
709 // last part of the 2-part async deflation protocol. After EnterI()
710 // returns to enter(), contentions is decremented because the caller
711 // now owns the monitor. We bump contentions an extra time here to
712 // prevent the deflater thread from winning the last part of the
713 // 2-part async deflation protocol after the regular decrement
714 // occurs in enter(). The deflater thread will decrement contentions
715 // after it recognizes that the async deflation was cancelled.
716 add_to_contentions(1);
717 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 717, "assert(" "_succ != current" ") failed", "invariant");
::breakpoint(); } } while (0)
;
718 assert(_Responsible != current, "invariant")do { if (!(_Responsible != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 718, "assert(" "_Responsible != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
719 return;
720 }
721
722 assert(InitDone, "Unexpectedly not initialized")do { if (!(InitDone)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 722, "assert(" "InitDone" ") failed", "Unexpectedly not initialized"
); ::breakpoint(); } } while (0)
;
723
724 // We try one round of spinning *before* enqueueing current.
725 //
726 // If the _owner is ready but OFFPROC we could use a YieldTo()
727 // operation to donate the remainder of this thread's quantum
728 // to the owner. This has subtle but beneficial affinity
729 // effects.
730
731 if (TrySpin(current) > 0) {
732 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 732, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
733 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 733, "assert(" "_succ != current" ") failed", "invariant");
::breakpoint(); } } while (0)
;
734 assert(_Responsible != current, "invariant")do { if (!(_Responsible != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 734, "assert(" "_Responsible != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
735 return;
736 }
737
738 // The Spin failed -- Enqueue and park the thread ...
739 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 739, "assert(" "_succ != current" ") failed", "invariant");
::breakpoint(); } } while (0)
;
740 assert(owner_raw() != current, "invariant")do { if (!(owner_raw() != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 740, "assert(" "owner_raw() != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
741 assert(_Responsible != current, "invariant")do { if (!(_Responsible != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 741, "assert(" "_Responsible != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
742
743 // Enqueue "current" on ObjectMonitor's _cxq.
744 //
745 // Node acts as a proxy for current.
746 // As an aside, if were to ever rewrite the synchronization code mostly
747 // in Java, WaitNodes, ObjectMonitors, and Events would become 1st-class
748 // Java objects. This would avoid awkward lifecycle and liveness issues,
749 // as well as eliminate a subset of ABA issues.
750 // TODO: eliminate ObjectWaiter and enqueue either Threads or Events.
751
752 ObjectWaiter node(current);
753 current->_ParkEvent->reset();
754 node._prev = (ObjectWaiter*) 0xBAD;
755 node.TState = ObjectWaiter::TS_CXQ;
756
757 // Push "current" onto the front of the _cxq.
758 // Once on cxq/EntryList, current stays on-queue until it acquires the lock.
759 // Note that spinning tends to reduce the rate at which threads
760 // enqueue and dequeue on EntryList|cxq.
761 ObjectWaiter* nxt;
762 for (;;) {
763 node._next = nxt = _cxq;
764 if (Atomic::cmpxchg(&_cxq, nxt, &node) == nxt) break;
765
766 // Interference - the CAS failed because _cxq changed. Just retry.
767 // As an optional optimization we retry the lock.
768 if (TryLock (current) > 0) {
769 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 769, "assert(" "_succ != current" ") failed", "invariant");
::breakpoint(); } } while (0)
;
770 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 770, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
771 assert(_Responsible != current, "invariant")do { if (!(_Responsible != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 771, "assert(" "_Responsible != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
772 return;
773 }
774 }
775
776 // Check for cxq|EntryList edge transition to non-null. This indicates
777 // the onset of contention. While contention persists exiting threads
778 // will use a ST:MEMBAR:LD 1-1 exit protocol. When contention abates exit
779 // operations revert to the faster 1-0 mode. This enter operation may interleave
780 // (race) a concurrent 1-0 exit operation, resulting in stranding, so we
781 // arrange for one of the contending thread to use a timed park() operations
782 // to detect and recover from the race. (Stranding is form of progress failure
783 // where the monitor is unlocked but all the contending threads remain parked).
784 // That is, at least one of the contended threads will periodically poll _owner.
785 // One of the contending threads will become the designated "Responsible" thread.
786 // The Responsible thread uses a timed park instead of a normal indefinite park
787 // operation -- it periodically wakes and checks for and recovers from potential
788 // strandings admitted by 1-0 exit operations. We need at most one Responsible
789 // thread per-monitor at any given moment. Only threads on cxq|EntryList may
790 // be responsible for a monitor.
791 //
792 // Currently, one of the contended threads takes on the added role of "Responsible".
793 // A viable alternative would be to use a dedicated "stranding checker" thread
794 // that periodically iterated over all the threads (or active monitors) and unparked
795 // successors where there was risk of stranding. This would help eliminate the
796 // timer scalability issues we see on some platforms as we'd only have one thread
797 // -- the checker -- parked on a timer.
798
799 if (nxt == NULL__null && _EntryList == NULL__null) {
800 // Try to assume the role of responsible thread for the monitor.
801 // CONSIDER: ST vs CAS vs { if (Responsible==null) Responsible=current }
802 Atomic::replace_if_null(&_Responsible, current);
803 }
804
805 // The lock might have been released while this thread was occupied queueing
806 // itself onto _cxq. To close the race and avoid "stranding" and
807 // progress-liveness failure we must resample-retry _owner before parking.
808 // Note the Dekker/Lamport duality: ST cxq; MEMBAR; LD Owner.
809 // In this case the ST-MEMBAR is accomplished with CAS().
810 //
811 // TODO: Defer all thread state transitions until park-time.
812 // Since state transitions are heavy and inefficient we'd like
813 // to defer the state transitions until absolutely necessary,
814 // and in doing so avoid some transitions ...
815
816 int nWakeups = 0;
817 int recheckInterval = 1;
818
819 for (;;) {
820
821 if (TryLock(current) > 0) break;
822 assert(owner_raw() != current, "invariant")do { if (!(owner_raw() != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 822, "assert(" "owner_raw() != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
823
824 // park self
825 if (_Responsible == current) {
826 current->_ParkEvent->park((jlong) recheckInterval);
827 // Increase the recheckInterval, but clamp the value.
828 recheckInterval *= 8;
829 if (recheckInterval > MAX_RECHECK_INTERVAL1000) {
830 recheckInterval = MAX_RECHECK_INTERVAL1000;
831 }
832 } else {
833 current->_ParkEvent->park();
834 }
835
836 if (TryLock(current) > 0) break;
837
838 if (try_set_owner_from(DEFLATER_MARKERreinterpret_cast<void*>(-1), current) == DEFLATER_MARKERreinterpret_cast<void*>(-1)) {
839 // Cancelled the in-progress async deflation by changing owner from
840 // DEFLATER_MARKER to current. As part of the contended enter protocol,
841 // contentions was incremented to a positive value before EnterI()
842 // was called and that prevents the deflater thread from winning the
843 // last part of the 2-part async deflation protocol. After EnterI()
844 // returns to enter(), contentions is decremented because the caller
845 // now owns the monitor. We bump contentions an extra time here to
846 // prevent the deflater thread from winning the last part of the
847 // 2-part async deflation protocol after the regular decrement
848 // occurs in enter(). The deflater thread will decrement contentions
849 // after it recognizes that the async deflation was cancelled.
850 add_to_contentions(1);
851 break;
852 }
853
854 // The lock is still contested.
855 // Keep a tally of the # of futile wakeups.
856 // Note that the counter is not protected by a lock or updated by atomics.
857 // That is by design - we trade "lossy" counters which are exposed to
858 // races during updates for a lower probe effect.
859
860 // This PerfData object can be used in parallel with a safepoint.
861 // See the work around in PerfDataManager::destroy().
862 OM_PERFDATA_OP(FutileWakeups, inc())do { if (ObjectMonitor::_sync_FutileWakeups != __null &&
PerfDataManager::has_PerfData()) { ObjectMonitor::_sync_FutileWakeups
->inc(); } } while (0)
;
863 ++nWakeups;
864
865 // Assuming this is not a spurious wakeup we'll normally find _succ == current.
866 // We can defer clearing _succ until after the spin completes
867 // TrySpin() must tolerate being called with _succ == current.
868 // Try yet another round of adaptive spinning.
869 if (TrySpin(current) > 0) break;
870
871 // We can find that we were unpark()ed and redesignated _succ while
872 // we were spinning. That's harmless. If we iterate and call park(),
873 // park() will consume the event and return immediately and we'll
874 // just spin again. This pattern can repeat, leaving _succ to simply
875 // spin on a CPU.
876
877 if (_succ == current) _succ = NULL__null;
878
879 // Invariant: after clearing _succ a thread *must* retry _owner before parking.
880 OrderAccess::fence();
881 }
882
883 // Egress :
884 // current has acquired the lock -- Unlink current from the cxq or EntryList.
885 // Normally we'll find current on the EntryList .
886 // From the perspective of the lock owner (this thread), the
887 // EntryList is stable and cxq is prepend-only.
888 // The head of cxq is volatile but the interior is stable.
889 // In addition, current.TState is stable.
890
891 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 891, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
892
893 UnlinkAfterAcquire(current, &node);
894 if (_succ == current) _succ = NULL__null;
895
896 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 896, "assert(" "_succ != current" ") failed", "invariant");
::breakpoint(); } } while (0)
;
897 if (_Responsible == current) {
898 _Responsible = NULL__null;
899 OrderAccess::fence(); // Dekker pivot-point
900
901 // We may leave threads on cxq|EntryList without a designated
902 // "Responsible" thread. This is benign. When this thread subsequently
903 // exits the monitor it can "see" such preexisting "old" threads --
904 // threads that arrived on the cxq|EntryList before the fence, above --
905 // by LDing cxq|EntryList. Newly arrived threads -- that is, threads
906 // that arrive on cxq after the ST:MEMBAR, above -- will set Responsible
907 // non-null and elect a new "Responsible" timer thread.
908 //
909 // This thread executes:
910 // ST Responsible=null; MEMBAR (in enter epilogue - here)
911 // LD cxq|EntryList (in subsequent exit)
912 //
913 // Entering threads in the slow/contended path execute:
914 // ST cxq=nonnull; MEMBAR; LD Responsible (in enter prolog)
915 // The (ST cxq; MEMBAR) is accomplished with CAS().
916 //
917 // The MEMBAR, above, prevents the LD of cxq|EntryList in the subsequent
918 // exit operation from floating above the ST Responsible=null.
919 }
920
921 // We've acquired ownership with CAS().
922 // CAS is serializing -- it has MEMBAR/FENCE-equivalent semantics.
923 // But since the CAS() this thread may have also stored into _succ,
924 // EntryList, cxq or Responsible. These meta-data updates must be
925 // visible __before this thread subsequently drops the lock.
926 // Consider what could occur if we didn't enforce this constraint --
927 // STs to monitor meta-data and user-data could reorder with (become
928 // visible after) the ST in exit that drops ownership of the lock.
929 // Some other thread could then acquire the lock, but observe inconsistent
930 // or old monitor meta-data and heap data. That violates the JMM.
931 // To that end, the 1-0 exit() operation must have at least STST|LDST
932 // "release" barrier semantics. Specifically, there must be at least a
933 // STST|LDST barrier in exit() before the ST of null into _owner that drops
934 // the lock. The barrier ensures that changes to monitor meta-data and data
935 // protected by the lock will be visible before we release the lock, and
936 // therefore before some other thread (CPU) has a chance to acquire the lock.
937 // See also: http://gee.cs.oswego.edu/dl/jmm/cookbook.html.
938 //
939 // Critically, any prior STs to _succ or EntryList must be visible before
940 // the ST of null into _owner in the *subsequent* (following) corresponding
941 // monitorexit. Recall too, that in 1-0 mode monitorexit does not necessarily
942 // execute a serializing instruction.
943
944 return;
945}
946
947// ReenterI() is a specialized inline form of the latter half of the
948// contended slow-path from EnterI(). We use ReenterI() only for
949// monitor reentry in wait().
950//
951// In the future we should reconcile EnterI() and ReenterI().
952
953void ObjectMonitor::ReenterI(JavaThread* current, ObjectWaiter* currentNode) {
954 assert(current != NULL, "invariant")do { if (!(current != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 954, "assert(" "current != __null" ") failed", "invariant")
; ::breakpoint(); } } while (0)
;
955 assert(currentNode != NULL, "invariant")do { if (!(currentNode != __null)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 955, "assert(" "currentNode != __null" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
956 assert(currentNode->_thread == current, "invariant")do { if (!(currentNode->_thread == current)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 956, "assert(" "currentNode->_thread == current" ") failed"
, "invariant"); ::breakpoint(); } } while (0)
;
957 assert(_waiters > 0, "invariant")do { if (!(_waiters > 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 957, "assert(" "_waiters > 0" ") failed", "invariant"); ::
breakpoint(); } } while (0)
;
958 assert(object()->mark() == markWord::encode(this), "invariant")do { if (!(object()->mark() == markWord::encode(this))) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 958, "assert(" "object()->mark() == markWord::encode(this)"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
959
960 assert(current->thread_state() != _thread_blocked, "invariant")do { if (!(current->thread_state() != _thread_blocked)) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 960, "assert(" "current->thread_state() != _thread_blocked"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
961
962 int nWakeups = 0;
963 for (;;) {
964 ObjectWaiter::TStates v = currentNode->TState;
965 guarantee(v == ObjectWaiter::TS_ENTER || v == ObjectWaiter::TS_CXQ, "invariant")do { if (!(v == ObjectWaiter::TS_ENTER || v == ObjectWaiter::
TS_CXQ)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 965, "guarantee(" "v == ObjectWaiter::TS_ENTER || v == ObjectWaiter::TS_CXQ"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
966 assert(owner_raw() != current, "invariant")do { if (!(owner_raw() != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 966, "assert(" "owner_raw() != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
967
968 if (TryLock(current) > 0) break;
969 if (TrySpin(current) > 0) break;
970
971 {
972 OSThreadContendState osts(current->osthread());
973
974 assert(current->thread_state() == _thread_in_vm, "invariant")do { if (!(current->thread_state() == _thread_in_vm)) { (*
g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 974, "assert(" "current->thread_state() == _thread_in_vm"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
975
976 {
977 ClearSuccOnSuspend csos(this);
978 ThreadBlockInVMPreprocess<ClearSuccOnSuspend> tbivs(current, csos, true /* allow_suspend */);
979 current->_ParkEvent->park();
980 }
981 }
982
983 // Try again, but just so we distinguish between futile wakeups and
984 // successful wakeups. The following test isn't algorithmically
985 // necessary, but it helps us maintain sensible statistics.
986 if (TryLock(current) > 0) break;
987
988 // The lock is still contested.
989 // Keep a tally of the # of futile wakeups.
990 // Note that the counter is not protected by a lock or updated by atomics.
991 // That is by design - we trade "lossy" counters which are exposed to
992 // races during updates for a lower probe effect.
993 ++nWakeups;
994
995 // Assuming this is not a spurious wakeup we'll normally
996 // find that _succ == current.
997 if (_succ == current) _succ = NULL__null;
998
999 // Invariant: after clearing _succ a contending thread
1000 // *must* retry _owner before parking.
1001 OrderAccess::fence();
1002
1003 // This PerfData object can be used in parallel with a safepoint.
1004 // See the work around in PerfDataManager::destroy().
1005 OM_PERFDATA_OP(FutileWakeups, inc())do { if (ObjectMonitor::_sync_FutileWakeups != __null &&
PerfDataManager::has_PerfData()) { ObjectMonitor::_sync_FutileWakeups
->inc(); } } while (0)
;
1006 }
1007
1008 // current has acquired the lock -- Unlink current from the cxq or EntryList .
1009 // Normally we'll find current on the EntryList.
1010 // Unlinking from the EntryList is constant-time and atomic-free.
1011 // From the perspective of the lock owner (this thread), the
1012 // EntryList is stable and cxq is prepend-only.
1013 // The head of cxq is volatile but the interior is stable.
1014 // In addition, current.TState is stable.
1015
1016 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1016, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1017 assert(object()->mark() == markWord::encode(this), "invariant")do { if (!(object()->mark() == markWord::encode(this))) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1017, "assert(" "object()->mark() == markWord::encode(this)"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
1018 UnlinkAfterAcquire(current, currentNode);
1019 if (_succ == current) _succ = NULL__null;
1020 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1020, "assert(" "_succ != current" ") failed", "invariant")
; ::breakpoint(); } } while (0)
;
1021 currentNode->TState = ObjectWaiter::TS_RUN;
1022 OrderAccess::fence(); // see comments at the end of EnterI()
1023}
1024
1025// By convention we unlink a contending thread from EntryList|cxq immediately
1026// after the thread acquires the lock in ::enter(). Equally, we could defer
1027// unlinking the thread until ::exit()-time.
1028
1029void ObjectMonitor::UnlinkAfterAcquire(JavaThread* current, ObjectWaiter* currentNode) {
1030 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1030, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1031 assert(currentNode->_thread == current, "invariant")do { if (!(currentNode->_thread == current)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1031, "assert(" "currentNode->_thread == current" ") failed"
, "invariant"); ::breakpoint(); } } while (0)
;
1032
1033 if (currentNode->TState == ObjectWaiter::TS_ENTER) {
1034 // Normal case: remove current from the DLL EntryList .
1035 // This is a constant-time operation.
1036 ObjectWaiter* nxt = currentNode->_next;
1037 ObjectWaiter* prv = currentNode->_prev;
1038 if (nxt != NULL__null) nxt->_prev = prv;
1039 if (prv != NULL__null) prv->_next = nxt;
1040 if (currentNode == _EntryList) _EntryList = nxt;
1041 assert(nxt == NULL || nxt->TState == ObjectWaiter::TS_ENTER, "invariant")do { if (!(nxt == __null || nxt->TState == ObjectWaiter::TS_ENTER
)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1041, "assert(" "nxt == __null || nxt->TState == ObjectWaiter::TS_ENTER"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
1042 assert(prv == NULL || prv->TState == ObjectWaiter::TS_ENTER, "invariant")do { if (!(prv == __null || prv->TState == ObjectWaiter::TS_ENTER
)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1042, "assert(" "prv == __null || prv->TState == ObjectWaiter::TS_ENTER"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
1043 } else {
1044 assert(currentNode->TState == ObjectWaiter::TS_CXQ, "invariant")do { if (!(currentNode->TState == ObjectWaiter::TS_CXQ)) {
(*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1044, "assert(" "currentNode->TState == ObjectWaiter::TS_CXQ"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
1045 // Inopportune interleaving -- current is still on the cxq.
1046 // This usually means the enqueue of self raced an exiting thread.
1047 // Normally we'll find current near the front of the cxq, so
1048 // dequeueing is typically fast. If needbe we can accelerate
1049 // this with some MCS/CHL-like bidirectional list hints and advisory
1050 // back-links so dequeueing from the interior will normally operate
1051 // in constant-time.
1052 // Dequeue current from either the head (with CAS) or from the interior
1053 // with a linear-time scan and normal non-atomic memory operations.
1054 // CONSIDER: if current is on the cxq then simply drain cxq into EntryList
1055 // and then unlink current from EntryList. We have to drain eventually,
1056 // so it might as well be now.
1057
1058 ObjectWaiter* v = _cxq;
1059 assert(v != NULL, "invariant")do { if (!(v != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1059, "assert(" "v != __null" ") failed", "invariant"); ::breakpoint
(); } } while (0)
;
1060 if (v != currentNode || Atomic::cmpxchg(&_cxq, v, currentNode->_next) != v) {
1061 // The CAS above can fail from interference IFF a "RAT" arrived.
1062 // In that case current must be in the interior and can no longer be
1063 // at the head of cxq.
1064 if (v == currentNode) {
1065 assert(_cxq != v, "invariant")do { if (!(_cxq != v)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1065, "assert(" "_cxq != v" ") failed", "invariant"); ::breakpoint
(); } } while (0)
;
1066 v = _cxq; // CAS above failed - start scan at head of list
1067 }
1068 ObjectWaiter* p;
1069 ObjectWaiter* q = NULL__null;
1070 for (p = v; p != NULL__null && p != currentNode; p = p->_next) {
1071 q = p;
1072 assert(p->TState == ObjectWaiter::TS_CXQ, "invariant")do { if (!(p->TState == ObjectWaiter::TS_CXQ)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1072, "assert(" "p->TState == ObjectWaiter::TS_CXQ" ") failed"
, "invariant"); ::breakpoint(); } } while (0)
;
1073 }
1074 assert(v != currentNode, "invariant")do { if (!(v != currentNode)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1074, "assert(" "v != currentNode" ") failed", "invariant")
; ::breakpoint(); } } while (0)
;
1075 assert(p == currentNode, "Node not found on cxq")do { if (!(p == currentNode)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1075, "assert(" "p == currentNode" ") failed", "Node not found on cxq"
); ::breakpoint(); } } while (0)
;
1076 assert(p != _cxq, "invariant")do { if (!(p != _cxq)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1076, "assert(" "p != _cxq" ") failed", "invariant"); ::breakpoint
(); } } while (0)
;
1077 assert(q != NULL, "invariant")do { if (!(q != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1077, "assert(" "q != __null" ") failed", "invariant"); ::breakpoint
(); } } while (0)
;
1078 assert(q->_next == p, "invariant")do { if (!(q->_next == p)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1078, "assert(" "q->_next == p" ") failed", "invariant")
; ::breakpoint(); } } while (0)
;
1079 q->_next = p->_next;
1080 }
1081 }
1082
1083#ifdef ASSERT1
1084 // Diagnostic hygiene ...
1085 currentNode->_prev = (ObjectWaiter*) 0xBAD;
1086 currentNode->_next = (ObjectWaiter*) 0xBAD;
1087 currentNode->TState = ObjectWaiter::TS_RUN;
1088#endif
1089}
1090
1091// -----------------------------------------------------------------------------
1092// Exit support
1093//
1094// exit()
1095// ~~~~~~
1096// Note that the collector can't reclaim the objectMonitor or deflate
1097// the object out from underneath the thread calling ::exit() as the
1098// thread calling ::exit() never transitions to a stable state.
1099// This inhibits GC, which in turn inhibits asynchronous (and
1100// inopportune) reclamation of "this".
1101//
1102// We'd like to assert that: (THREAD->thread_state() != _thread_blocked) ;
1103// There's one exception to the claim above, however. EnterI() can call
1104// exit() to drop a lock if the acquirer has been externally suspended.
1105// In that case exit() is called with _thread_state == _thread_blocked,
1106// but the monitor's _contentions field is > 0, which inhibits reclamation.
1107//
1108// 1-0 exit
1109// ~~~~~~~~
1110// ::exit() uses a canonical 1-1 idiom with a MEMBAR although some of
1111// the fast-path operators have been optimized so the common ::exit()
1112// operation is 1-0, e.g., see macroAssembler_x86.cpp: fast_unlock().
1113// The code emitted by fast_unlock() elides the usual MEMBAR. This
1114// greatly improves latency -- MEMBAR and CAS having considerable local
1115// latency on modern processors -- but at the cost of "stranding". Absent the
1116// MEMBAR, a thread in fast_unlock() can race a thread in the slow
1117// ::enter() path, resulting in the entering thread being stranding
1118// and a progress-liveness failure. Stranding is extremely rare.
1119// We use timers (timed park operations) & periodic polling to detect
1120// and recover from stranding. Potentially stranded threads periodically
1121// wake up and poll the lock. See the usage of the _Responsible variable.
1122//
1123// The CAS() in enter provides for safety and exclusion, while the CAS or
1124// MEMBAR in exit provides for progress and avoids stranding. 1-0 locking
1125// eliminates the CAS/MEMBAR from the exit path, but it admits stranding.
1126// We detect and recover from stranding with timers.
1127//
1128// If a thread transiently strands it'll park until (a) another
1129// thread acquires the lock and then drops the lock, at which time the
1130// exiting thread will notice and unpark the stranded thread, or, (b)
1131// the timer expires. If the lock is high traffic then the stranding latency
1132// will be low due to (a). If the lock is low traffic then the odds of
1133// stranding are lower, although the worst-case stranding latency
1134// is longer. Critically, we don't want to put excessive load in the
1135// platform's timer subsystem. We want to minimize both the timer injection
1136// rate (timers created/sec) as well as the number of timers active at
1137// any one time. (more precisely, we want to minimize timer-seconds, which is
1138// the integral of the # of active timers at any instant over time).
1139// Both impinge on OS scalability. Given that, at most one thread parked on
1140// a monitor will use a timer.
1141//
1142// There is also the risk of a futile wake-up. If we drop the lock
1143// another thread can reacquire the lock immediately, and we can
1144// then wake a thread unnecessarily. This is benign, and we've
1145// structured the code so the windows are short and the frequency
1146// of such futile wakups is low.
1147
1148void ObjectMonitor::exit(JavaThread* current, bool not_suspended) {
1149 void* cur = owner_raw();
1150 if (current != cur) {
1151 if (current->is_lock_owned((address)cur)) {
1152 assert(_recursions == 0, "invariant")do { if (!(_recursions == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1152, "assert(" "_recursions == 0" ") failed", "invariant")
; ::breakpoint(); } } while (0)
;
1153 set_owner_from_BasicLock(cur, current); // Convert from BasicLock* to Thread*.
1154 _recursions = 0;
1155 } else {
1156 // Apparent unbalanced locking ...
1157 // Naively we'd like to throw IllegalMonitorStateException.
1158 // As a practical matter we can neither allocate nor throw an
1159 // exception as ::exit() can be called from leaf routines.
1160 // see x86_32.ad Fast_Unlock() and the I1 and I2 properties.
1161 // Upon deeper reflection, however, in a properly run JVM the only
1162 // way we should encounter this situation is in the presence of
1163 // unbalanced JNI locking. TODO: CheckJNICalls.
1164 // See also: CR4414101
1165#ifdef ASSERT1
1166 LogStreamHandle(Error, monitorinflation)LogStreamTemplate<LogLevel::Error, (LogTag::_monitorinflation
), (LogTag::__NO_TAG), (LogTag::__NO_TAG), (LogTag::__NO_TAG)
, (LogTag::__NO_TAG), (LogTag::__NO_TAG)>
lsh;
1167 lsh.print_cr("ERROR: ObjectMonitor::exit(): thread=" INTPTR_FORMAT"0x%016" "l" "x"
1168 " is exiting an ObjectMonitor it does not own.", p2i(current));
1169 lsh.print_cr("The imbalance is possibly caused by JNI locking.");
1170 print_debug_style_on(&lsh);
1171 assert(false, "Non-balanced monitor enter/exit!")do { if (!(false)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1171, "assert(" "false" ") failed", "Non-balanced monitor enter/exit!"
); ::breakpoint(); } } while (0)
;
1172#endif
1173 return;
1174 }
1175 }
1176
1177 if (_recursions != 0) {
1178 _recursions--; // this is simple recursive enter
1179 return;
1180 }
1181
1182 // Invariant: after setting Responsible=null an thread must execute
1183 // a MEMBAR or other serializing instruction before fetching EntryList|cxq.
1184 _Responsible = NULL__null;
1185
1186#if INCLUDE_JFR1
1187 // get the owner's thread id for the MonitorEnter event
1188 // if it is enabled and the thread isn't suspended
1189 if (not_suspended && EventJavaMonitorEnter::is_enabled()) {
1190 _previous_owner_tid = JFR_THREAD_ID(current)((current)->jfr_thread_local()->thread_id());
1191 }
1192#endif
1193
1194 for (;;) {
1195 assert(current == owner_raw(), "invariant")do { if (!(current == owner_raw())) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1195, "assert(" "current == owner_raw()" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1196
1197 // Drop the lock.
1198 // release semantics: prior loads and stores from within the critical section
1199 // must not float (reorder) past the following store that drops the lock.
1200 // Uses a storeload to separate release_store(owner) from the
1201 // successor check. The try_set_owner() below uses cmpxchg() so
1202 // we get the fence down there.
1203 release_clear_owner(current);
1204 OrderAccess::storeload();
1205
1206 if ((intptr_t(_EntryList)|intptr_t(_cxq)) == 0 || _succ != NULL__null) {
1207 return;
1208 }
1209 // Other threads are blocked trying to acquire the lock.
1210
1211 // Normally the exiting thread is responsible for ensuring succession,
1212 // but if other successors are ready or other entering threads are spinning
1213 // then this thread can simply store NULL into _owner and exit without
1214 // waking a successor. The existence of spinners or ready successors
1215 // guarantees proper succession (liveness). Responsibility passes to the
1216 // ready or running successors. The exiting thread delegates the duty.
1217 // More precisely, if a successor already exists this thread is absolved
1218 // of the responsibility of waking (unparking) one.
1219 //
1220 // The _succ variable is critical to reducing futile wakeup frequency.
1221 // _succ identifies the "heir presumptive" thread that has been made
1222 // ready (unparked) but that has not yet run. We need only one such
1223 // successor thread to guarantee progress.
1224 // See http://www.usenix.org/events/jvm01/full_papers/dice/dice.pdf
1225 // section 3.3 "Futile Wakeup Throttling" for details.
1226 //
1227 // Note that spinners in Enter() also set _succ non-null.
1228 // In the current implementation spinners opportunistically set
1229 // _succ so that exiting threads might avoid waking a successor.
1230 // Another less appealing alternative would be for the exiting thread
1231 // to drop the lock and then spin briefly to see if a spinner managed
1232 // to acquire the lock. If so, the exiting thread could exit
1233 // immediately without waking a successor, otherwise the exiting
1234 // thread would need to dequeue and wake a successor.
1235 // (Note that we'd need to make the post-drop spin short, but no
1236 // shorter than the worst-case round-trip cache-line migration time.
1237 // The dropped lock needs to become visible to the spinner, and then
1238 // the acquisition of the lock by the spinner must become visible to
1239 // the exiting thread).
1240
1241 // It appears that an heir-presumptive (successor) must be made ready.
1242 // Only the current lock owner can manipulate the EntryList or
1243 // drain _cxq, so we need to reacquire the lock. If we fail
1244 // to reacquire the lock the responsibility for ensuring succession
1245 // falls to the new owner.
1246 //
1247 if (try_set_owner_from(NULL__null, current) != NULL__null) {
1248 return;
1249 }
1250
1251 guarantee(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1251, "guarantee(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1252
1253 ObjectWaiter* w = NULL__null;
1254
1255 w = _EntryList;
1256 if (w != NULL__null) {
1257 // I'd like to write: guarantee (w->_thread != current).
1258 // But in practice an exiting thread may find itself on the EntryList.
1259 // Let's say thread T1 calls O.wait(). Wait() enqueues T1 on O's waitset and
1260 // then calls exit(). Exit release the lock by setting O._owner to NULL.
1261 // Let's say T1 then stalls. T2 acquires O and calls O.notify(). The
1262 // notify() operation moves T1 from O's waitset to O's EntryList. T2 then
1263 // release the lock "O". T2 resumes immediately after the ST of null into
1264 // _owner, above. T2 notices that the EntryList is populated, so it
1265 // reacquires the lock and then finds itself on the EntryList.
1266 // Given all that, we have to tolerate the circumstance where "w" is
1267 // associated with current.
1268 assert(w->TState == ObjectWaiter::TS_ENTER, "invariant")do { if (!(w->TState == ObjectWaiter::TS_ENTER)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1268, "assert(" "w->TState == ObjectWaiter::TS_ENTER" ") failed"
, "invariant"); ::breakpoint(); } } while (0)
;
1269 ExitEpilog(current, w);
1270 return;
1271 }
1272
1273 // If we find that both _cxq and EntryList are null then just
1274 // re-run the exit protocol from the top.
1275 w = _cxq;
1276 if (w == NULL__null) continue;
1277
1278 // Drain _cxq into EntryList - bulk transfer.
1279 // First, detach _cxq.
1280 // The following loop is tantamount to: w = swap(&cxq, NULL)
1281 for (;;) {
1282 assert(w != NULL, "Invariant")do { if (!(w != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1282, "assert(" "w != __null" ") failed", "Invariant"); ::breakpoint
(); } } while (0)
;
1283 ObjectWaiter* u = Atomic::cmpxchg(&_cxq, w, (ObjectWaiter*)NULL__null);
1284 if (u == w) break;
1285 w = u;
1286 }
1287
1288 assert(w != NULL, "invariant")do { if (!(w != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1288, "assert(" "w != __null" ") failed", "invariant"); ::breakpoint
(); } } while (0)
;
1289 assert(_EntryList == NULL, "invariant")do { if (!(_EntryList == __null)) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1289, "assert(" "_EntryList == __null" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1290
1291 // Convert the LIFO SLL anchored by _cxq into a DLL.
1292 // The list reorganization step operates in O(LENGTH(w)) time.
1293 // It's critical that this step operate quickly as
1294 // "current" still holds the outer-lock, restricting parallelism
1295 // and effectively lengthening the critical section.
1296 // Invariant: s chases t chases u.
1297 // TODO-FIXME: consider changing EntryList from a DLL to a CDLL so
1298 // we have faster access to the tail.
1299
1300 _EntryList = w;
1301 ObjectWaiter* q = NULL__null;
1302 ObjectWaiter* p;
1303 for (p = w; p != NULL__null; p = p->_next) {
1304 guarantee(p->TState == ObjectWaiter::TS_CXQ, "Invariant")do { if (!(p->TState == ObjectWaiter::TS_CXQ)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1304, "guarantee(" "p->TState == ObjectWaiter::TS_CXQ" ") failed"
, "Invariant"); ::breakpoint(); } } while (0)
;
1305 p->TState = ObjectWaiter::TS_ENTER;
1306 p->_prev = q;
1307 q = p;
1308 }
1309
1310 // In 1-0 mode we need: ST EntryList; MEMBAR #storestore; ST _owner = NULL
1311 // The MEMBAR is satisfied by the release_store() operation in ExitEpilog().
1312
1313 // See if we can abdicate to a spinner instead of waking a thread.
1314 // A primary goal of the implementation is to reduce the
1315 // context-switch rate.
1316 if (_succ != NULL__null) continue;
1317
1318 w = _EntryList;
1319 if (w != NULL__null) {
1320 guarantee(w->TState == ObjectWaiter::TS_ENTER, "invariant")do { if (!(w->TState == ObjectWaiter::TS_ENTER)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1320, "guarantee(" "w->TState == ObjectWaiter::TS_ENTER"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
1321 ExitEpilog(current, w);
1322 return;
1323 }
1324 }
1325}
1326
1327void ObjectMonitor::ExitEpilog(JavaThread* current, ObjectWaiter* Wakee) {
1328 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1328, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1329
1330 // Exit protocol:
1331 // 1. ST _succ = wakee
1332 // 2. membar #loadstore|#storestore;
1333 // 2. ST _owner = NULL
1334 // 3. unpark(wakee)
1335
1336 _succ = Wakee->_thread;
1337 ParkEvent * Trigger = Wakee->_event;
1338
1339 // Hygiene -- once we've set _owner = NULL we can't safely dereference Wakee again.
1340 // The thread associated with Wakee may have grabbed the lock and "Wakee" may be
1341 // out-of-scope (non-extant).
1342 Wakee = NULL__null;
1343
1344 // Drop the lock.
1345 // Uses a fence to separate release_store(owner) from the LD in unpark().
1346 release_clear_owner(current);
1347 OrderAccess::fence();
1348
1349 DTRACE_MONITOR_PROBE(contended__exit, this, object(), current){;};
1350 Trigger->unpark();
1351
1352 // Maintain stats and report events to JVMTI
1353 OM_PERFDATA_OP(Parks, inc())do { if (ObjectMonitor::_sync_Parks != __null && PerfDataManager
::has_PerfData()) { ObjectMonitor::_sync_Parks->inc(); } }
while (0)
;
1354}
1355
1356
1357// -----------------------------------------------------------------------------
1358// Class Loader deadlock handling.
1359//
1360// complete_exit exits a lock returning recursion count
1361// complete_exit/reenter operate as a wait without waiting
1362// complete_exit requires an inflated monitor
1363// The _owner field is not always the Thread addr even with an
1364// inflated monitor, e.g. the monitor can be inflated by a non-owning
1365// thread due to contention.
1366intx ObjectMonitor::complete_exit(JavaThread* current) {
1367 assert(InitDone, "Unexpectedly not initialized")do { if (!(InitDone)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1367, "assert(" "InitDone" ") failed", "Unexpectedly not initialized"
); ::breakpoint(); } } while (0)
;
1368
1369 void* cur = owner_raw();
1370 if (current != cur) {
1371 if (current->is_lock_owned((address)cur)) {
1372 assert(_recursions == 0, "internal state error")do { if (!(_recursions == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1372, "assert(" "_recursions == 0" ") failed", "internal state error"
); ::breakpoint(); } } while (0)
;
1373 set_owner_from_BasicLock(cur, current); // Convert from BasicLock* to Thread*.
1374 _recursions = 0;
1375 }
1376 }
1377
1378 guarantee(current == owner_raw(), "complete_exit not owner")do { if (!(current == owner_raw())) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1378, "guarantee(" "current == owner_raw()" ") failed", "complete_exit not owner"
); ::breakpoint(); } } while (0)
;
1379 intx save = _recursions; // record the old recursion count
1380 _recursions = 0; // set the recursion level to be 0
1381 exit(current); // exit the monitor
1382 guarantee(owner_raw() != current, "invariant")do { if (!(owner_raw() != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1382, "guarantee(" "owner_raw() != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1383 return save;
1384}
1385
1386// reenter() enters a lock and sets recursion count
1387// complete_exit/reenter operate as a wait without waiting
1388bool ObjectMonitor::reenter(intx recursions, JavaThread* current) {
1389
1390 guarantee(owner_raw() != current, "reenter already owner")do { if (!(owner_raw() != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1390, "guarantee(" "owner_raw() != current" ") failed", "reenter already owner"
); ::breakpoint(); } } while (0)
;
1391 if (!enter(current)) {
1392 return false;
1393 }
1394 // Entered the monitor.
1395 guarantee(_recursions == 0, "reenter recursion")do { if (!(_recursions == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1395, "guarantee(" "_recursions == 0" ") failed", "reenter recursion"
); ::breakpoint(); } } while (0)
;
1396 _recursions = recursions;
1397 return true;
1398}
1399
1400// Checks that the current THREAD owns this monitor and causes an
1401// immediate return if it doesn't. We don't use the CHECK macro
1402// because we want the IMSE to be the only exception that is thrown
1403// from the call site when false is returned. Any other pending
1404// exception is ignored.
1405#define CHECK_OWNER()do { if (!check_owner(__the_thread__)) { do { if (!((((ThreadShadow
*)__the_thread__)->has_pending_exception()))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1405, "assert(" "(((ThreadShadow*)__the_thread__)->has_pending_exception())"
") failed", "expected a pending IMSE here."); ::breakpoint()
; } } while (0); return; } } while (false)
\
1406 do { \
1407 if (!check_owner(THREAD__the_thread__)) { \
1408 assert(HAS_PENDING_EXCEPTION, "expected a pending IMSE here.")do { if (!((((ThreadShadow*)__the_thread__)->has_pending_exception
()))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1408, "assert(" "(((ThreadShadow*)__the_thread__)->has_pending_exception())"
") failed", "expected a pending IMSE here."); ::breakpoint()
; } } while (0)
; \
1409 return; \
1410 } \
1411 } while (false)
1412
1413// Returns true if the specified thread owns the ObjectMonitor.
1414// Otherwise returns false and throws IllegalMonitorStateException
1415// (IMSE). If there is a pending exception and the specified thread
1416// is not the owner, that exception will be replaced by the IMSE.
1417bool ObjectMonitor::check_owner(TRAPSJavaThread* __the_thread__) {
1418 JavaThread* current = THREAD__the_thread__;
1419 void* cur = owner_raw();
1420 if (cur == current) {
1421 return true;
1422 }
1423 if (current->is_lock_owned((address)cur)) {
1424 set_owner_from_BasicLock(cur, current); // Convert from BasicLock* to Thread*.
1425 _recursions = 0;
1426 return true;
1427 }
1428 THROW_MSG_(vmSymbols::java_lang_IllegalMonitorStateException(),{ Exceptions::_throw_msg(__the_thread__, "/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1429, vmSymbols::java_lang_IllegalMonitorStateException(), "current thread is not owner"
); return false; }
1429 "current thread is not owner", false){ Exceptions::_throw_msg(__the_thread__, "/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1429, vmSymbols::java_lang_IllegalMonitorStateException(), "current thread is not owner"
); return false; }
;
1430}
1431
1432static void post_monitor_wait_event(EventJavaMonitorWait* event,
1433 ObjectMonitor* monitor,
1434 uint64_t notifier_tid,
1435 jlong timeout,
1436 bool timedout) {
1437 assert(event != NULL, "invariant")do { if (!(event != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1437, "assert(" "event != __null" ") failed", "invariant");
::breakpoint(); } } while (0)
;
1438 assert(monitor != NULL, "invariant")do { if (!(monitor != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1438, "assert(" "monitor != __null" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1439 event->set_monitorClass(monitor->object()->klass());
1440 event->set_timeout(timeout);
1441 // Set an address that is 'unique enough', such that events close in
1442 // time and with the same address are likely (but not guaranteed) to
1443 // belong to the same object.
1444 event->set_address((uintptr_t)monitor);
1445 event->set_notifier(notifier_tid);
1446 event->set_timedOut(timedout);
1447 event->commit();
1448}
1449
1450// -----------------------------------------------------------------------------
1451// Wait/Notify/NotifyAll
1452//
1453// Note: a subset of changes to ObjectMonitor::wait()
1454// will need to be replicated in complete_exit
1455void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPSJavaThread* __the_thread__) {
1456 JavaThread* current = THREAD__the_thread__;
1457
1458 assert(InitDone, "Unexpectedly not initialized")do { if (!(InitDone)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1458, "assert(" "InitDone" ") failed", "Unexpectedly not initialized"
); ::breakpoint(); } } while (0)
;
1459
1460 CHECK_OWNER()do { if (!check_owner(__the_thread__)) { do { if (!((((ThreadShadow
*)__the_thread__)->has_pending_exception()))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1460, "assert(" "(((ThreadShadow*)__the_thread__)->has_pending_exception())"
") failed", "expected a pending IMSE here."); ::breakpoint()
; } } while (0); return; } } while (false)
; // Throws IMSE if not owner.
1461
1462 EventJavaMonitorWait event;
1463
1464 // check for a pending interrupt
1465 if (interruptible && current->is_interrupted(true) && !HAS_PENDING_EXCEPTION(((ThreadShadow*)__the_thread__)->has_pending_exception())) {
1466 // post monitor waited event. Note that this is past-tense, we are done waiting.
1467 if (JvmtiExport::should_post_monitor_waited()) {
1468 // Note: 'false' parameter is passed here because the
1469 // wait was not timed out due to thread interrupt.
1470 JvmtiExport::post_monitor_waited(current, this, false);
1471
1472 // In this short circuit of the monitor wait protocol, the
1473 // current thread never drops ownership of the monitor and
1474 // never gets added to the wait queue so the current thread
1475 // cannot be made the successor. This means that the
1476 // JVMTI_EVENT_MONITOR_WAITED event handler cannot accidentally
1477 // consume an unpark() meant for the ParkEvent associated with
1478 // this ObjectMonitor.
1479 }
1480 if (event.should_commit()) {
1481 post_monitor_wait_event(&event, this, 0, millis, false);
1482 }
1483 THROW(vmSymbols::java_lang_InterruptedException()){ Exceptions::_throw_msg(__the_thread__, "/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1483, vmSymbols::java_lang_InterruptedException(), __null);
return; }
;
1484 return;
1485 }
1486
1487 assert(current->_Stalled == 0, "invariant")do { if (!(current->_Stalled == 0)) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1487, "assert(" "current->_Stalled == 0" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1488 current->_Stalled = intptr_t(this);
1489 current->set_current_waiting_monitor(this);
1490
1491 // create a node to be put into the queue
1492 // Critically, after we reset() the event but prior to park(), we must check
1493 // for a pending interrupt.
1494 ObjectWaiter node(current);
1495 node.TState = ObjectWaiter::TS_WAIT;
1496 current->_ParkEvent->reset();
1497 OrderAccess::fence(); // ST into Event; membar ; LD interrupted-flag
1498
1499 // Enter the waiting queue, which is a circular doubly linked list in this case
1500 // but it could be a priority queue or any data structure.
1501 // _WaitSetLock protects the wait queue. Normally the wait queue is accessed only
1502 // by the the owner of the monitor *except* in the case where park()
1503 // returns because of a timeout of interrupt. Contention is exceptionally rare
1504 // so we use a simple spin-lock instead of a heavier-weight blocking lock.
1505
1506 Thread::SpinAcquire(&_WaitSetLock, "WaitSet - add");
1507 AddWaiter(&node);
1508 Thread::SpinRelease(&_WaitSetLock);
1509
1510 _Responsible = NULL__null;
1511
1512 intx save = _recursions; // record the old recursion count
1513 _waiters++; // increment the number of waiters
1514 _recursions = 0; // set the recursion level to be 1
1515 exit(current); // exit the monitor
1516 guarantee(owner_raw() != current, "invariant")do { if (!(owner_raw() != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1516, "guarantee(" "owner_raw() != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1517
1518 // The thread is on the WaitSet list - now park() it.
1519 // On MP systems it's conceivable that a brief spin before we park
1520 // could be profitable.
1521 //
1522 // TODO-FIXME: change the following logic to a loop of the form
1523 // while (!timeout && !interrupted && _notified == 0) park()
1524
1525 int ret = OS_OK;
1526 int WasNotified = 0;
1527
1528 // Need to check interrupt state whilst still _thread_in_vm
1529 bool interrupted = interruptible && current->is_interrupted(false);
1530
1531 { // State transition wrappers
1532 OSThread* osthread = current->osthread();
1533 OSThreadWaitState osts(osthread, true);
1534
1535 assert(current->thread_state() == _thread_in_vm, "invariant")do { if (!(current->thread_state() == _thread_in_vm)) { (*
g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1535, "assert(" "current->thread_state() == _thread_in_vm"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
1536
1537 {
1538 ClearSuccOnSuspend csos(this);
1539 ThreadBlockInVMPreprocess<ClearSuccOnSuspend> tbivs(current, csos, true /* allow_suspend */);
1540 if (interrupted || HAS_PENDING_EXCEPTION(((ThreadShadow*)__the_thread__)->has_pending_exception())) {
1541 // Intentionally empty
1542 } else if (node._notified == 0) {
1543 if (millis <= 0) {
1544 current->_ParkEvent->park();
1545 } else {
1546 ret = current->_ParkEvent->park(millis);
1547 }
1548 }
1549 }
1550
1551 // Node may be on the WaitSet, the EntryList (or cxq), or in transition
1552 // from the WaitSet to the EntryList.
1553 // See if we need to remove Node from the WaitSet.
1554 // We use double-checked locking to avoid grabbing _WaitSetLock
1555 // if the thread is not on the wait queue.
1556 //
1557 // Note that we don't need a fence before the fetch of TState.
1558 // In the worst case we'll fetch a old-stale value of TS_WAIT previously
1559 // written by the is thread. (perhaps the fetch might even be satisfied
1560 // by a look-aside into the processor's own store buffer, although given
1561 // the length of the code path between the prior ST and this load that's
1562 // highly unlikely). If the following LD fetches a stale TS_WAIT value
1563 // then we'll acquire the lock and then re-fetch a fresh TState value.
1564 // That is, we fail toward safety.
1565
1566 if (node.TState == ObjectWaiter::TS_WAIT) {
1567 Thread::SpinAcquire(&_WaitSetLock, "WaitSet - unlink");
1568 if (node.TState == ObjectWaiter::TS_WAIT) {
1569 DequeueSpecificWaiter(&node); // unlink from WaitSet
1570 assert(node._notified == 0, "invariant")do { if (!(node._notified == 0)) { (*g_assert_poison) = 'X';;
report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1570, "assert(" "node._notified == 0" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1571 node.TState = ObjectWaiter::TS_RUN;
1572 }
1573 Thread::SpinRelease(&_WaitSetLock);
1574 }
1575
1576 // The thread is now either on off-list (TS_RUN),
1577 // on the EntryList (TS_ENTER), or on the cxq (TS_CXQ).
1578 // The Node's TState variable is stable from the perspective of this thread.
1579 // No other threads will asynchronously modify TState.
1580 guarantee(node.TState != ObjectWaiter::TS_WAIT, "invariant")do { if (!(node.TState != ObjectWaiter::TS_WAIT)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1580, "guarantee(" "node.TState != ObjectWaiter::TS_WAIT" ") failed"
, "invariant"); ::breakpoint(); } } while (0)
;
1581 OrderAccess::loadload();
1582 if (_succ == current) _succ = NULL__null;
1583 WasNotified = node._notified;
1584
1585 // Reentry phase -- reacquire the monitor.
1586 // re-enter contended monitor after object.wait().
1587 // retain OBJECT_WAIT state until re-enter successfully completes
1588 // Thread state is thread_in_vm and oop access is again safe,
1589 // although the raw address of the object may have changed.
1590 // (Don't cache naked oops over safepoints, of course).
1591
1592 // post monitor waited event. Note that this is past-tense, we are done waiting.
1593 if (JvmtiExport::should_post_monitor_waited()) {
1594 JvmtiExport::post_monitor_waited(current, this, ret == OS_TIMEOUT);
1595
1596 if (node._notified != 0 && _succ == current) {
1597 // In this part of the monitor wait-notify-reenter protocol it
1598 // is possible (and normal) for another thread to do a fastpath
1599 // monitor enter-exit while this thread is still trying to get
1600 // to the reenter portion of the protocol.
1601 //
1602 // The ObjectMonitor was notified and the current thread is
1603 // the successor which also means that an unpark() has already
1604 // been done. The JVMTI_EVENT_MONITOR_WAITED event handler can
1605 // consume the unpark() that was done when the successor was
1606 // set because the same ParkEvent is shared between Java
1607 // monitors and JVM/TI RawMonitors (for now).
1608 //
1609 // We redo the unpark() to ensure forward progress, i.e., we
1610 // don't want all pending threads hanging (parked) with none
1611 // entering the unlocked monitor.
1612 node._event->unpark();
1613 }
1614 }
1615
1616 if (event.should_commit()) {
1617 post_monitor_wait_event(&event, this, node._notifier_tid, millis, ret == OS_TIMEOUT);
1618 }
1619
1620 OrderAccess::fence();
1621
1622 assert(current->_Stalled != 0, "invariant")do { if (!(current->_Stalled != 0)) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1622, "assert(" "current->_Stalled != 0" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1623 current->_Stalled = 0;
1624
1625 assert(owner_raw() != current, "invariant")do { if (!(owner_raw() != current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1625, "assert(" "owner_raw() != current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1626 ObjectWaiter::TStates v = node.TState;
1627 if (v == ObjectWaiter::TS_RUN) {
1628 enter(current);
1629 } else {
1630 guarantee(v == ObjectWaiter::TS_ENTER || v == ObjectWaiter::TS_CXQ, "invariant")do { if (!(v == ObjectWaiter::TS_ENTER || v == ObjectWaiter::
TS_CXQ)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1630, "guarantee(" "v == ObjectWaiter::TS_ENTER || v == ObjectWaiter::TS_CXQ"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
1631 ReenterI(current, &node);
1632 node.wait_reenter_end(this);
1633 }
1634
1635 // current has reacquired the lock.
1636 // Lifecycle - the node representing current must not appear on any queues.
1637 // Node is about to go out-of-scope, but even if it were immortal we wouldn't
1638 // want residual elements associated with this thread left on any lists.
1639 guarantee(node.TState == ObjectWaiter::TS_RUN, "invariant")do { if (!(node.TState == ObjectWaiter::TS_RUN)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1639, "guarantee(" "node.TState == ObjectWaiter::TS_RUN" ") failed"
, "invariant"); ::breakpoint(); } } while (0)
;
1640 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1640, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1641 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1641, "assert(" "_succ != current" ") failed", "invariant")
; ::breakpoint(); } } while (0)
;
1642 } // OSThreadWaitState()
1643
1644 current->set_current_waiting_monitor(NULL__null);
1645
1646 guarantee(_recursions == 0, "invariant")do { if (!(_recursions == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1646, "guarantee(" "_recursions == 0" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1647 _recursions = save // restore the old recursion count
1648 + JvmtiDeferredUpdates::get_and_reset_relock_count_after_wait(current); // increased by the deferred relock count
1649 _waiters--; // decrement the number of waiters
1650
1651 // Verify a few postconditions
1652 assert(owner_raw() == current, "invariant")do { if (!(owner_raw() == current)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1652, "assert(" "owner_raw() == current" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1653 assert(_succ != current, "invariant")do { if (!(_succ != current)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1653, "assert(" "_succ != current" ") failed", "invariant")
; ::breakpoint(); } } while (0)
;
1654 assert(object()->mark() == markWord::encode(this), "invariant")do { if (!(object()->mark() == markWord::encode(this))) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1654, "assert(" "object()->mark() == markWord::encode(this)"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
1655
1656 // check if the notification happened
1657 if (!WasNotified) {
1658 // no, it could be timeout or Thread.interrupt() or both
1659 // check for interrupt event, otherwise it is timeout
1660 if (interruptible && current->is_interrupted(true) && !HAS_PENDING_EXCEPTION(((ThreadShadow*)__the_thread__)->has_pending_exception())) {
1661 THROW(vmSymbols::java_lang_InterruptedException()){ Exceptions::_throw_msg(__the_thread__, "/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1661, vmSymbols::java_lang_InterruptedException(), __null);
return; }
;
1662 }
1663 }
1664
1665 // NOTE: Spurious wake up will be consider as timeout.
1666 // Monitor notify has precedence over thread interrupt.
1667}
1668
1669
1670// Consider:
1671// If the lock is cool (cxq == null && succ == null) and we're on an MP system
1672// then instead of transferring a thread from the WaitSet to the EntryList
1673// we might just dequeue a thread from the WaitSet and directly unpark() it.
1674
1675void ObjectMonitor::INotify(JavaThread* current) {
1676 Thread::SpinAcquire(&_WaitSetLock, "WaitSet - notify");
1677 ObjectWaiter* iterator = DequeueWaiter();
1678 if (iterator != NULL__null) {
1679 guarantee(iterator->TState == ObjectWaiter::TS_WAIT, "invariant")do { if (!(iterator->TState == ObjectWaiter::TS_WAIT)) { (
*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1679, "guarantee(" "iterator->TState == ObjectWaiter::TS_WAIT"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
1680 guarantee(iterator->_notified == 0, "invariant")do { if (!(iterator->_notified == 0)) { (*g_assert_poison)
= 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1680, "guarantee(" "iterator->_notified == 0" ") failed"
, "invariant"); ::breakpoint(); } } while (0)
;
1681 // Disposition - what might we do with iterator ?
1682 // a. add it directly to the EntryList - either tail (policy == 1)
1683 // or head (policy == 0).
1684 // b. push it onto the front of the _cxq (policy == 2).
1685 // For now we use (b).
1686
1687 iterator->TState = ObjectWaiter::TS_ENTER;
1688
1689 iterator->_notified = 1;
1690 iterator->_notifier_tid = JFR_THREAD_ID(current)((current)->jfr_thread_local()->thread_id());
1691
1692 ObjectWaiter* list = _EntryList;
1693 if (list != NULL__null) {
1694 assert(list->_prev == NULL, "invariant")do { if (!(list->_prev == __null)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1694, "assert(" "list->_prev == __null" ") failed", "invariant"
); ::breakpoint(); } } while (0)
;
1695 assert(list->TState == ObjectWaiter::TS_ENTER, "invariant")do { if (!(list->TState == ObjectWaiter::TS_ENTER)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1695, "assert(" "list->TState == ObjectWaiter::TS_ENTER"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
1696 assert(list != iterator, "invariant")do { if (!(list != iterator)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1696, "assert(" "list != iterator" ") failed", "invariant")
; ::breakpoint(); } } while (0)
;
1697 }
1698
1699 // prepend to cxq
1700 if (list == NULL__null) {
1701 iterator->_next = iterator->_prev = NULL__null;
1702 _EntryList = iterator;
1703 } else {
1704 iterator->TState = ObjectWaiter::TS_CXQ;
1705 for (;;) {
1706 ObjectWaiter* front = _cxq;
1707 iterator->_next = front;
1708 if (Atomic::cmpxchg(&_cxq, front, iterator) == front) {
1709 break;
1710 }
1711 }
1712 }
1713
1714 // _WaitSetLock protects the wait queue, not the EntryList. We could
1715 // move the add-to-EntryList operation, above, outside the critical section
1716 // protected by _WaitSetLock. In practice that's not useful. With the
1717 // exception of wait() timeouts and interrupts the monitor owner
1718 // is the only thread that grabs _WaitSetLock. There's almost no contention
1719 // on _WaitSetLock so it's not profitable to reduce the length of the
1720 // critical section.
1721
1722 iterator->wait_reenter_begin(this);
1723 }
1724 Thread::SpinRelease(&_WaitSetLock);
1725}
1726
1727// Consider: a not-uncommon synchronization bug is to use notify() when
1728// notifyAll() is more appropriate, potentially resulting in stranded
1729// threads; this is one example of a lost wakeup. A useful diagnostic
1730// option is to force all notify() operations to behave as notifyAll().
1731//
1732// Note: We can also detect many such problems with a "minimum wait".
1733// When the "minimum wait" is set to a small non-zero timeout value
1734// and the program does not hang whereas it did absent "minimum wait",
1735// that suggests a lost wakeup bug.
1736
1737void ObjectMonitor::notify(TRAPSJavaThread* __the_thread__) {
1738 JavaThread* current = THREAD__the_thread__;
1739 CHECK_OWNER()do { if (!check_owner(__the_thread__)) { do { if (!((((ThreadShadow
*)__the_thread__)->has_pending_exception()))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1739, "assert(" "(((ThreadShadow*)__the_thread__)->has_pending_exception())"
") failed", "expected a pending IMSE here."); ::breakpoint()
; } } while (0); return; } } while (false)
; // Throws IMSE if not owner.
1740 if (_WaitSet == NULL__null) {
1741 return;
1742 }
1743 DTRACE_MONITOR_PROBE(notify, this, object(), current){;};
1744 INotify(current);
1745 OM_PERFDATA_OP(Notifications, inc(1))do { if (ObjectMonitor::_sync_Notifications != __null &&
PerfDataManager::has_PerfData()) { ObjectMonitor::_sync_Notifications
->inc(1); } } while (0)
;
1746}
1747
1748
1749// The current implementation of notifyAll() transfers the waiters one-at-a-time
1750// from the waitset to the EntryList. This could be done more efficiently with a
1751// single bulk transfer but in practice it's not time-critical. Beware too,
1752// that in prepend-mode we invert the order of the waiters. Let's say that the
1753// waitset is "ABCD" and the EntryList is "XYZ". After a notifyAll() in prepend
1754// mode the waitset will be empty and the EntryList will be "DCBAXYZ".
1755
1756void ObjectMonitor::notifyAll(TRAPSJavaThread* __the_thread__) {
1757 JavaThread* current = THREAD__the_thread__;
1758 CHECK_OWNER()do { if (!check_owner(__the_thread__)) { do { if (!((((ThreadShadow
*)__the_thread__)->has_pending_exception()))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 1758, "assert(" "(((ThreadShadow*)__the_thread__)->has_pending_exception())"
") failed", "expected a pending IMSE here."); ::breakpoint()
; } } while (0); return; } } while (false)
; // Throws IMSE if not owner.
1759 if (_WaitSet == NULL__null) {
1760 return;
1761 }
1762
1763 DTRACE_MONITOR_PROBE(notifyAll, this, object(), current){;};
1764 int tally = 0;
1765 while (_WaitSet != NULL__null) {
1766 tally++;
1767 INotify(current);
1768 }
1769
1770 OM_PERFDATA_OP(Notifications, inc(tally))do { if (ObjectMonitor::_sync_Notifications != __null &&
PerfDataManager::has_PerfData()) { ObjectMonitor::_sync_Notifications
->inc(tally); } } while (0)
;
1771}
1772
1773// -----------------------------------------------------------------------------
1774// Adaptive Spinning Support
1775//
1776// Adaptive spin-then-block - rational spinning
1777//
1778// Note that we spin "globally" on _owner with a classic SMP-polite TATAS
1779// algorithm. On high order SMP systems it would be better to start with
1780// a brief global spin and then revert to spinning locally. In the spirit of MCS/CLH,
1781// a contending thread could enqueue itself on the cxq and then spin locally
1782// on a thread-specific variable such as its ParkEvent._Event flag.
1783// That's left as an exercise for the reader. Note that global spinning is
1784// not problematic on Niagara, as the L2 cache serves the interconnect and
1785// has both low latency and massive bandwidth.
1786//
1787// Broadly, we can fix the spin frequency -- that is, the % of contended lock
1788// acquisition attempts where we opt to spin -- at 100% and vary the spin count
1789// (duration) or we can fix the count at approximately the duration of
1790// a context switch and vary the frequency. Of course we could also
1791// vary both satisfying K == Frequency * Duration, where K is adaptive by monitor.
1792// For a description of 'Adaptive spin-then-block mutual exclusion in
1793// multi-threaded processing,' see U.S. Pat. No. 8046758.
1794//
1795// This implementation varies the duration "D", where D varies with
1796// the success rate of recent spin attempts. (D is capped at approximately
1797// length of a round-trip context switch). The success rate for recent
1798// spin attempts is a good predictor of the success rate of future spin
1799// attempts. The mechanism adapts automatically to varying critical
1800// section length (lock modality), system load and degree of parallelism.
1801// D is maintained per-monitor in _SpinDuration and is initialized
1802// optimistically. Spin frequency is fixed at 100%.
1803//
1804// Note that _SpinDuration is volatile, but we update it without locks
1805// or atomics. The code is designed so that _SpinDuration stays within
1806// a reasonable range even in the presence of races. The arithmetic
1807// operations on _SpinDuration are closed over the domain of legal values,
1808// so at worst a race will install and older but still legal value.
1809// At the very worst this introduces some apparent non-determinism.
1810// We might spin when we shouldn't or vice-versa, but since the spin
1811// count are relatively short, even in the worst case, the effect is harmless.
1812//
1813// Care must be taken that a low "D" value does not become an
1814// an absorbing state. Transient spinning failures -- when spinning
1815// is overall profitable -- should not cause the system to converge
1816// on low "D" values. We want spinning to be stable and predictable
1817// and fairly responsive to change and at the same time we don't want
1818// it to oscillate, become metastable, be "too" non-deterministic,
1819// or converge on or enter undesirable stable absorbing states.
1820//
1821// We implement a feedback-based control system -- using past behavior
1822// to predict future behavior. We face two issues: (a) if the
1823// input signal is random then the spin predictor won't provide optimal
1824// results, and (b) if the signal frequency is too high then the control
1825// system, which has some natural response lag, will "chase" the signal.
1826// (b) can arise from multimodal lock hold times. Transient preemption
1827// can also result in apparent bimodal lock hold times.
1828// Although sub-optimal, neither condition is particularly harmful, as
1829// in the worst-case we'll spin when we shouldn't or vice-versa.
1830// The maximum spin duration is rather short so the failure modes aren't bad.
1831// To be conservative, I've tuned the gain in system to bias toward
1832// _not spinning. Relatedly, the system can sometimes enter a mode where it
1833// "rings" or oscillates between spinning and not spinning. This happens
1834// when spinning is just on the cusp of profitability, however, so the
1835// situation is not dire. The state is benign -- there's no need to add
1836// hysteresis control to damp the transition rate between spinning and
1837// not spinning.
1838
1839// Spinning: Fixed frequency (100%), vary duration
1840int ObjectMonitor::TrySpin(JavaThread* current) {
1841 // Dumb, brutal spin. Good for comparative measurements against adaptive spinning.
1842 int ctr = Knob_FixedSpin;
1843 if (ctr != 0) {
1844 while (--ctr >= 0) {
1845 if (TryLock(current) > 0) return 1;
1846 SpinPause();
1847 }
1848 return 0;
1849 }
1850
1851 for (ctr = Knob_PreSpin + 1; --ctr >= 0;) {
1852 if (TryLock(current) > 0) {
1853 // Increase _SpinDuration ...
1854 // Note that we don't clamp SpinDuration precisely at SpinLimit.
1855 // Raising _SpurDuration to the poverty line is key.
1856 int x = _SpinDuration;
1857 if (x < Knob_SpinLimit) {
1858 if (x < Knob_Poverty) x = Knob_Poverty;
1859 _SpinDuration = x + Knob_BonusB;
1860 }
1861 return 1;
1862 }
1863 SpinPause();
1864 }
1865
1866 // Admission control - verify preconditions for spinning
1867 //
1868 // We always spin a little bit, just to prevent _SpinDuration == 0 from
1869 // becoming an absorbing state. Put another way, we spin briefly to
1870 // sample, just in case the system load, parallelism, contention, or lock
1871 // modality changed.
1872 //
1873 // Consider the following alternative:
1874 // Periodically set _SpinDuration = _SpinLimit and try a long/full
1875 // spin attempt. "Periodically" might mean after a tally of
1876 // the # of failed spin attempts (or iterations) reaches some threshold.
1877 // This takes us into the realm of 1-out-of-N spinning, where we
1878 // hold the duration constant but vary the frequency.
1879
1880 ctr = _SpinDuration;
1881 if (ctr <= 0) return 0;
1882
1883 if (NotRunnable(current, (JavaThread*) owner_raw())) {
1884 return 0;
1885 }
1886
1887 // We're good to spin ... spin ingress.
1888 // CONSIDER: use Prefetch::write() to avoid RTS->RTO upgrades
1889 // when preparing to LD...CAS _owner, etc and the CAS is likely
1890 // to succeed.
1891 if (_succ == NULL__null) {
1892 _succ = current;
1893 }
1894 Thread* prv = NULL__null;
1895
1896 // There are three ways to exit the following loop:
1897 // 1. A successful spin where this thread has acquired the lock.
1898 // 2. Spin failure with prejudice
1899 // 3. Spin failure without prejudice
1900
1901 while (--ctr >= 0) {
1902
1903 // Periodic polling -- Check for pending GC
1904 // Threads may spin while they're unsafe.
1905 // We don't want spinning threads to delay the JVM from reaching
1906 // a stop-the-world safepoint or to steal cycles from GC.
1907 // If we detect a pending safepoint we abort in order that
1908 // (a) this thread, if unsafe, doesn't delay the safepoint, and (b)
1909 // this thread, if safe, doesn't steal cycles from GC.
1910 // This is in keeping with the "no loitering in runtime" rule.
1911 // We periodically check to see if there's a safepoint pending.
1912 if ((ctr & 0xFF) == 0) {
1913 if (SafepointMechanism::should_process(current)) {
1914 goto Abort; // abrupt spin egress
1915 }
1916 SpinPause();
1917 }
1918
1919 // Probe _owner with TATAS
1920 // If this thread observes the monitor transition or flicker
1921 // from locked to unlocked to locked, then the odds that this
1922 // thread will acquire the lock in this spin attempt go down
1923 // considerably. The same argument applies if the CAS fails
1924 // or if we observe _owner change from one non-null value to
1925 // another non-null value. In such cases we might abort
1926 // the spin without prejudice or apply a "penalty" to the
1927 // spin count-down variable "ctr", reducing it by 100, say.
1928
1929 JavaThread* ox = (JavaThread*) owner_raw();
1930 if (ox == NULL__null) {
1931 ox = (JavaThread*)try_set_owner_from(NULL__null, current);
1932 if (ox == NULL__null) {
1933 // The CAS succeeded -- this thread acquired ownership
1934 // Take care of some bookkeeping to exit spin state.
1935 if (_succ == current) {
1936 _succ = NULL__null;
1937 }
1938
1939 // Increase _SpinDuration :
1940 // The spin was successful (profitable) so we tend toward
1941 // longer spin attempts in the future.
1942 // CONSIDER: factor "ctr" into the _SpinDuration adjustment.
1943 // If we acquired the lock early in the spin cycle it
1944 // makes sense to increase _SpinDuration proportionally.
1945 // Note that we don't clamp SpinDuration precisely at SpinLimit.
1946 int x = _SpinDuration;
1947 if (x < Knob_SpinLimit) {
1948 if (x < Knob_Poverty) x = Knob_Poverty;
1949 _SpinDuration = x + Knob_Bonus;
1950 }
1951 return 1;
1952 }
1953
1954 // The CAS failed ... we can take any of the following actions:
1955 // * penalize: ctr -= CASPenalty
1956 // * exit spin with prejudice -- goto Abort;
1957 // * exit spin without prejudice.
1958 // * Since CAS is high-latency, retry again immediately.
1959 prv = ox;
Value stored to 'prv' is never read
1960 goto Abort;
1961 }
1962
1963 // Did lock ownership change hands ?
1964 if (ox != prv && prv != NULL__null) {
1965 goto Abort;
1966 }
1967 prv = ox;
1968
1969 // Abort the spin if the owner is not executing.
1970 // The owner must be executing in order to drop the lock.
1971 // Spinning while the owner is OFFPROC is idiocy.
1972 // Consider: ctr -= RunnablePenalty ;
1973 if (NotRunnable(current, ox)) {
1974 goto Abort;
1975 }
1976 if (_succ == NULL__null) {
1977 _succ = current;
1978 }
1979 }
1980
1981 // Spin failed with prejudice -- reduce _SpinDuration.
1982 // TODO: Use an AIMD-like policy to adjust _SpinDuration.
1983 // AIMD is globally stable.
1984 {
1985 int x = _SpinDuration;
1986 if (x > 0) {
1987 // Consider an AIMD scheme like: x -= (x >> 3) + 100
1988 // This is globally sample and tends to damp the response.
1989 x -= Knob_Penalty;
1990 if (x < 0) x = 0;
1991 _SpinDuration = x;
1992 }
1993 }
1994
1995 Abort:
1996 if (_succ == current) {
1997 _succ = NULL__null;
1998 // Invariant: after setting succ=null a contending thread
1999 // must recheck-retry _owner before parking. This usually happens
2000 // in the normal usage of TrySpin(), but it's safest
2001 // to make TrySpin() as foolproof as possible.
2002 OrderAccess::fence();
2003 if (TryLock(current) > 0) return 1;
2004 }
2005 return 0;
2006}
2007
2008// NotRunnable() -- informed spinning
2009//
2010// Don't bother spinning if the owner is not eligible to drop the lock.
2011// Spin only if the owner thread is _thread_in_Java or _thread_in_vm.
2012// The thread must be runnable in order to drop the lock in timely fashion.
2013// If the _owner is not runnable then spinning will not likely be
2014// successful (profitable).
2015//
2016// Beware -- the thread referenced by _owner could have died
2017// so a simply fetch from _owner->_thread_state might trap.
2018// Instead, we use SafeFetchXX() to safely LD _owner->_thread_state.
2019// Because of the lifecycle issues, the _thread_state values
2020// observed by NotRunnable() might be garbage. NotRunnable must
2021// tolerate this and consider the observed _thread_state value
2022// as advisory.
2023//
2024// Beware too, that _owner is sometimes a BasicLock address and sometimes
2025// a thread pointer.
2026// Alternately, we might tag the type (thread pointer vs basiclock pointer)
2027// with the LSB of _owner. Another option would be to probabilistically probe
2028// the putative _owner->TypeTag value.
2029//
2030// Checking _thread_state isn't perfect. Even if the thread is
2031// in_java it might be blocked on a page-fault or have been preempted
2032// and sitting on a ready/dispatch queue.
2033//
2034// The return value from NotRunnable() is *advisory* -- the
2035// result is based on sampling and is not necessarily coherent.
2036// The caller must tolerate false-negative and false-positive errors.
2037// Spinning, in general, is probabilistic anyway.
2038
2039
2040int ObjectMonitor::NotRunnable(JavaThread* current, JavaThread* ox) {
2041 // Check ox->TypeTag == 2BAD.
2042 if (ox == NULL__null) return 0;
2043
2044 // Avoid transitive spinning ...
2045 // Say T1 spins or blocks trying to acquire L. T1._Stalled is set to L.
2046 // Immediately after T1 acquires L it's possible that T2, also
2047 // spinning on L, will see L.Owner=T1 and T1._Stalled=L.
2048 // This occurs transiently after T1 acquired L but before
2049 // T1 managed to clear T1.Stalled. T2 does not need to abort
2050 // its spin in this circumstance.
2051 intptr_t BlockedOn = SafeFetchN((intptr_t *) &ox->_Stalled, intptr_t(1));
2052
2053 if (BlockedOn == 1) return 1;
2054 if (BlockedOn != 0) {
2055 return BlockedOn != intptr_t(this) && owner_raw() == ox;
2056 }
2057
2058 assert(sizeof(ox->_thread_state == sizeof(int)), "invariant")do { if (!(sizeof(ox->_thread_state == sizeof(int)))) { (*
g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2058, "assert(" "sizeof(ox->_thread_state == sizeof(int))"
") failed", "invariant"); ::breakpoint(); } } while (0)
;
2059 int jst = SafeFetch32((int *) &ox->_thread_state, -1);;
2060 // consider also: jst != _thread_in_Java -- but that's overspecific.
2061 return jst == _thread_blocked || jst == _thread_in_native;
2062}
2063
2064
2065// -----------------------------------------------------------------------------
2066// WaitSet management ...
2067
2068ObjectWaiter::ObjectWaiter(JavaThread* current) {
2069 _next = NULL__null;
2070 _prev = NULL__null;
2071 _notified = 0;
2072 _notifier_tid = 0;
2073 TState = TS_RUN;
2074 _thread = current;
2075 _event = _thread->_ParkEvent;
2076 _active = false;
2077 assert(_event != NULL, "invariant")do { if (!(_event != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2077, "assert(" "_event != __null" ") failed", "invariant")
; ::breakpoint(); } } while (0)
;
2078}
2079
2080void ObjectWaiter::wait_reenter_begin(ObjectMonitor * const mon) {
2081 _active = JavaThreadBlockedOnMonitorEnterState::wait_reenter_begin(_thread, mon);
2082}
2083
2084void ObjectWaiter::wait_reenter_end(ObjectMonitor * const mon) {
2085 JavaThreadBlockedOnMonitorEnterState::wait_reenter_end(_thread, _active);
2086}
2087
2088inline void ObjectMonitor::AddWaiter(ObjectWaiter* node) {
2089 assert(node != NULL, "should not add NULL node")do { if (!(node != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2089, "assert(" "node != __null" ") failed", "should not add NULL node"
); ::breakpoint(); } } while (0)
;
2090 assert(node->_prev == NULL, "node already in list")do { if (!(node->_prev == __null)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2090, "assert(" "node->_prev == __null" ") failed", "node already in list"
); ::breakpoint(); } } while (0)
;
2091 assert(node->_next == NULL, "node already in list")do { if (!(node->_next == __null)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2091, "assert(" "node->_next == __null" ") failed", "node already in list"
); ::breakpoint(); } } while (0)
;
2092 // put node at end of queue (circular doubly linked list)
2093 if (_WaitSet == NULL__null) {
2094 _WaitSet = node;
2095 node->_prev = node;
2096 node->_next = node;
2097 } else {
2098 ObjectWaiter* head = _WaitSet;
2099 ObjectWaiter* tail = head->_prev;
2100 assert(tail->_next == head, "invariant check")do { if (!(tail->_next == head)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2100, "assert(" "tail->_next == head" ") failed", "invariant check"
); ::breakpoint(); } } while (0)
;
2101 tail->_next = node;
2102 head->_prev = node;
2103 node->_next = head;
2104 node->_prev = tail;
2105 }
2106}
2107
2108inline ObjectWaiter* ObjectMonitor::DequeueWaiter() {
2109 // dequeue the very first waiter
2110 ObjectWaiter* waiter = _WaitSet;
2111 if (waiter) {
2112 DequeueSpecificWaiter(waiter);
2113 }
2114 return waiter;
2115}
2116
2117inline void ObjectMonitor::DequeueSpecificWaiter(ObjectWaiter* node) {
2118 assert(node != NULL, "should not dequeue NULL node")do { if (!(node != __null)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2118, "assert(" "node != __null" ") failed", "should not dequeue NULL node"
); ::breakpoint(); } } while (0)
;
2119 assert(node->_prev != NULL, "node already removed from list")do { if (!(node->_prev != __null)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2119, "assert(" "node->_prev != __null" ") failed", "node already removed from list"
); ::breakpoint(); } } while (0)
;
2120 assert(node->_next != NULL, "node already removed from list")do { if (!(node->_next != __null)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2120, "assert(" "node->_next != __null" ") failed", "node already removed from list"
); ::breakpoint(); } } while (0)
;
2121 // when the waiter has woken up because of interrupt,
2122 // timeout or other spurious wake-up, dequeue the
2123 // waiter from waiting list
2124 ObjectWaiter* next = node->_next;
2125 if (next == node) {
2126 assert(node->_prev == node, "invariant check")do { if (!(node->_prev == node)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2126, "assert(" "node->_prev == node" ") failed", "invariant check"
); ::breakpoint(); } } while (0)
;
2127 _WaitSet = NULL__null;
2128 } else {
2129 ObjectWaiter* prev = node->_prev;
2130 assert(prev->_next == node, "invariant check")do { if (!(prev->_next == node)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2130, "assert(" "prev->_next == node" ") failed", "invariant check"
); ::breakpoint(); } } while (0)
;
2131 assert(next->_prev == node, "invariant check")do { if (!(next->_prev == node)) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2131, "assert(" "next->_prev == node" ") failed", "invariant check"
); ::breakpoint(); } } while (0)
;
2132 next->_prev = prev;
2133 prev->_next = next;
2134 if (_WaitSet == node) {
2135 _WaitSet = next;
2136 }
2137 }
2138 node->_next = NULL__null;
2139 node->_prev = NULL__null;
2140}
2141
2142// -----------------------------------------------------------------------------
2143// PerfData support
2144PerfCounter * ObjectMonitor::_sync_ContendedLockAttempts = NULL__null;
2145PerfCounter * ObjectMonitor::_sync_FutileWakeups = NULL__null;
2146PerfCounter * ObjectMonitor::_sync_Parks = NULL__null;
2147PerfCounter * ObjectMonitor::_sync_Notifications = NULL__null;
2148PerfCounter * ObjectMonitor::_sync_Inflations = NULL__null;
2149PerfCounter * ObjectMonitor::_sync_Deflations = NULL__null;
2150PerfLongVariable * ObjectMonitor::_sync_MonExtant = NULL__null;
2151
2152// One-shot global initialization for the sync subsystem.
2153// We could also defer initialization and initialize on-demand
2154// the first time we call ObjectSynchronizer::inflate().
2155// Initialization would be protected - like so many things - by
2156// the MonitorCache_lock.
2157
2158void ObjectMonitor::Initialize() {
2159 assert(!InitDone, "invariant")do { if (!(!InitDone)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/share/runtime/objectMonitor.cpp"
, 2159, "assert(" "!InitDone" ") failed", "invariant"); ::breakpoint
(); } } while (0)
;
2160
2161 if (!os::is_MP()) {
2162 Knob_SpinLimit = 0;
2163 Knob_PreSpin = 0;
2164 Knob_FixedSpin = -1;
2165 }
2166
2167 if (UsePerfData) {
2168 EXCEPTION_MARKExceptionMark __em; JavaThread* __the_thread__ = __em.thread(
);
;
2169#define NEWPERFCOUNTER(n) \
2170 { \
2171 n = PerfDataManager::create_counter(SUN_RT, #n, PerfData::U_Events, \
2172 CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception
())) return ; (void)(0
); \
2173 }
2174#define NEWPERFVARIABLE(n) \
2175 { \
2176 n = PerfDataManager::create_variable(SUN_RT, #n, PerfData::U_Events, \
2177 CHECK__the_thread__); if ((((ThreadShadow*)__the_thread__)->has_pending_exception
())) return ; (void)(0
); \
2178 }
2179 NEWPERFCOUNTER(_sync_Inflations);
2180 NEWPERFCOUNTER(_sync_Deflations);
2181 NEWPERFCOUNTER(_sync_ContendedLockAttempts);
2182 NEWPERFCOUNTER(_sync_FutileWakeups);
2183 NEWPERFCOUNTER(_sync_Parks);
2184 NEWPERFCOUNTER(_sync_Notifications);
2185 NEWPERFVARIABLE(_sync_MonExtant);
2186#undef NEWPERFCOUNTER
2187#undef NEWPERFVARIABLE
2188 }
2189
2190 _oop_storage = OopStorageSet::create_weak("ObjectSynchronizer Weak", mtSynchronizer);
2191
2192 DEBUG_ONLY(InitDone = true;)InitDone = true;
2193}
2194
2195void ObjectMonitor::print_on(outputStream* st) const {
2196 // The minimal things to print for markWord printing, more can be added for debugging and logging.
2197 st->print("{contentions=0x%08x,waiters=0x%08x"
2198 ",recursions=" INTX_FORMAT"%" "l" "d" ",owner=" INTPTR_FORMAT"0x%016" "l" "x" "}",
2199 contentions(), waiters(), recursions(),
2200 p2i(owner()));
2201}
2202void ObjectMonitor::print() const { print_on(tty); }
2203
2204#ifdef ASSERT1
2205// Print the ObjectMonitor like a debugger would:
2206//
2207// (ObjectMonitor) 0x00007fdfb6012e40 = {
2208// _header = 0x0000000000000001
2209// _object = 0x000000070ff45fd0
2210// _pad_buf0 = {
2211// [0] = '\0'
2212// ...
2213// [43] = '\0'
2214// }
2215// _owner = 0x0000000000000000
2216// _previous_owner_tid = 0
2217// _pad_buf1 = {
2218// [0] = '\0'
2219// ...
2220// [47] = '\0'
2221// }
2222// _next_om = 0x0000000000000000
2223// _recursions = 0
2224// _EntryList = 0x0000000000000000
2225// _cxq = 0x0000000000000000
2226// _succ = 0x0000000000000000
2227// _Responsible = 0x0000000000000000
2228// _Spinner = 0
2229// _SpinDuration = 5000
2230// _contentions = 0
2231// _WaitSet = 0x0000700009756248
2232// _waiters = 1
2233// _WaitSetLock = 0
2234// }
2235//
2236void ObjectMonitor::print_debug_style_on(outputStream* st) const {
2237 st->print_cr("(ObjectMonitor*) " INTPTR_FORMAT"0x%016" "l" "x" " = {", p2i(this));
2238 st->print_cr(" _header = " INTPTR_FORMAT"0x%016" "l" "x", header().value());
2239 st->print_cr(" _object = " INTPTR_FORMAT"0x%016" "l" "x", p2i(object_peek()));
2240 st->print_cr(" _pad_buf0 = {");
2241 st->print_cr(" [0] = '\\0'");
2242 st->print_cr(" ...");
2243 st->print_cr(" [%d] = '\\0'", (int)sizeof(_pad_buf0) - 1);
2244 st->print_cr(" }");
2245 st->print_cr(" _owner = " INTPTR_FORMAT"0x%016" "l" "x", p2i(owner_raw()));
2246 st->print_cr(" _previous_owner_tid = " UINT64_FORMAT"%" "l" "u", _previous_owner_tid);
2247 st->print_cr(" _pad_buf1 = {");
2248 st->print_cr(" [0] = '\\0'");
2249 st->print_cr(" ...");
2250 st->print_cr(" [%d] = '\\0'", (int)sizeof(_pad_buf1) - 1);
2251 st->print_cr(" }");
2252 st->print_cr(" _next_om = " INTPTR_FORMAT"0x%016" "l" "x", p2i(next_om()));
2253 st->print_cr(" _recursions = " INTX_FORMAT"%" "l" "d", _recursions);
2254 st->print_cr(" _EntryList = " INTPTR_FORMAT"0x%016" "l" "x", p2i(_EntryList));
2255 st->print_cr(" _cxq = " INTPTR_FORMAT"0x%016" "l" "x", p2i(_cxq));
2256 st->print_cr(" _succ = " INTPTR_FORMAT"0x%016" "l" "x", p2i(_succ));
2257 st->print_cr(" _Responsible = " INTPTR_FORMAT"0x%016" "l" "x", p2i(_Responsible));
2258 st->print_cr(" _Spinner = %d", _Spinner);
2259 st->print_cr(" _SpinDuration = %d", _SpinDuration);
2260 st->print_cr(" _contentions = %d", contentions());
2261 st->print_cr(" _WaitSet = " INTPTR_FORMAT"0x%016" "l" "x", p2i(_WaitSet));
2262 st->print_cr(" _waiters = %d", _waiters);
2263 st->print_cr(" _WaitSetLock = %d", _WaitSetLock);
2264 st->print_cr("}");
2265}
2266#endif