annotate src/share/vm/runtime/synchronizer.hpp @ 4155:394404b2d9bd

Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
author Doug Simon <doug.simon@oracle.com>
date Wed, 21 Dec 2011 11:25:27 +0100
parents f95d63e2154a
children cc32ccaaf47f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
2 * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
25 #ifndef SHARE_VM_RUNTIME_SYNCHRONIZER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
26 #define SHARE_VM_RUNTIME_SYNCHRONIZER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
28 #include "oops/markOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
29 #include "runtime/basicLock.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
30 #include "runtime/handles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
31 #include "runtime/perfData.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
32 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
33
0
a61af66fc99e Initial load
duke
parents:
diff changeset
34
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class ObjectMonitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class ObjectSynchronizer : AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
38 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
40 typedef enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
41 owner_self,
a61af66fc99e Initial load
duke
parents:
diff changeset
42 owner_none,
a61af66fc99e Initial load
duke
parents:
diff changeset
43 owner_other
a61af66fc99e Initial load
duke
parents:
diff changeset
44 } LockOwnership;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // exit must be implemented non-blocking, since the compiler cannot easily handle
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // deoptimization at monitor exit. Hence, it does not take a Handle argument.
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // This is full version of monitor enter and exit. I choose not
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // to use enter() and exit() in order to make sure user be ware
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // of the performance and semantics difference. They are normally
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // used by ObjectLocker etc. The interpreter and compiler use
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // assembly copies of these routines. Please keep them synchornized.
a61af66fc99e Initial load
duke
parents:
diff changeset
53 //
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // attempt_rebias flag is used by UseBiasedLocking implementation
a61af66fc99e Initial load
duke
parents:
diff changeset
55 static void fast_enter (Handle obj, BasicLock* lock, bool attempt_rebias, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
56 static void fast_exit (oop obj, BasicLock* lock, Thread* THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // WARNING: They are ONLY used to handle the slow cases. They should
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // only be used when the fast cases failed. Use of these functions
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // without previous fast case check may cause fatal error.
a61af66fc99e Initial load
duke
parents:
diff changeset
61 static void slow_enter (Handle obj, BasicLock* lock, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
62 static void slow_exit (oop obj, BasicLock* lock, Thread* THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Used only to handle jni locks or other unmatched monitor enter/exit
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // Internally they will use heavy weight monitor.
a61af66fc99e Initial load
duke
parents:
diff changeset
66 static void jni_enter (Handle obj, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
67 static bool jni_try_enter(Handle obj, Thread* THREAD); // Implements Unsafe.tryMonitorEnter
a61af66fc99e Initial load
duke
parents:
diff changeset
68 static void jni_exit (oop obj, Thread* THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // Handle all interpreter, compiler and jni cases
a61af66fc99e Initial load
duke
parents:
diff changeset
71 static void wait (Handle obj, jlong millis, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
72 static void notify (Handle obj, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
73 static void notifyall (Handle obj, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // Special internal-use-only method for use by JVM infrastructure
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // that needs to wait() on a java-level object but that can't risk
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // throwing unexpected InterruptedExecutionExceptions.
a61af66fc99e Initial load
duke
parents:
diff changeset
78 static void waitUninterruptibly (Handle obj, jlong Millis, Thread * THREAD) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // used by classloading to free classloader object lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // wait on an internal lock, and reclaim original lock
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // with original recursion count
a61af66fc99e Initial load
duke
parents:
diff changeset
83 static intptr_t complete_exit (Handle obj, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 static void reenter (Handle obj, intptr_t recursion, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // thread-specific and global objectMonitor free list accessors
1640
bfc89697cccb 6964164: MonitorInUseLists leak of contended objects
acorn
parents: 1589
diff changeset
87 // static void verifyInUse (Thread * Self) ; too slow for general assert/debug
0
a61af66fc99e Initial load
duke
parents:
diff changeset
88 static ObjectMonitor * omAlloc (Thread * Self) ;
1640
bfc89697cccb 6964164: MonitorInUseLists leak of contended objects
acorn
parents: 1589
diff changeset
89 static void omRelease (Thread * Self, ObjectMonitor * m, bool FromPerThreadAlloc) ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
90 static void omFlush (Thread * Self) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // Inflate light weight monitor to heavy weight monitor
a61af66fc99e Initial load
duke
parents:
diff changeset
93 static ObjectMonitor* inflate(Thread * Self, oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // This version is only for internal use
a61af66fc99e Initial load
duke
parents:
diff changeset
95 static ObjectMonitor* inflate_helper(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // Returns the identity hash value for an oop
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // NOTE: It may cause monitor inflation
a61af66fc99e Initial load
duke
parents:
diff changeset
99 static intptr_t identity_hash_value_for(Handle obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
100 static intptr_t FastHashCode (Thread * Self, oop obj) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // java.lang.Thread support
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static bool current_thread_holds_lock(JavaThread* thread, Handle h_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 static LockOwnership query_lock_ownership(JavaThread * self, Handle h_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 static JavaThread* get_lock_owner(Handle h_obj, bool doLock);
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // JNI detach support
a61af66fc99e Initial load
duke
parents:
diff changeset
109 static void release_monitors_owned_by_thread(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
110 static void monitors_iterate(MonitorClosure* m);
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // GC: we current use aggressive monitor deflation policy
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // Basically we deflate all monitors that are not busy.
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // An adaptive profile-based deflation policy could be used if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
115 static void deflate_idle_monitors();
1640
bfc89697cccb 6964164: MonitorInUseLists leak of contended objects
acorn
parents: 1589
diff changeset
116 static int walk_monitor_list(ObjectMonitor** listheadp,
bfc89697cccb 6964164: MonitorInUseLists leak of contended objects
acorn
parents: 1589
diff changeset
117 ObjectMonitor** FreeHeadp,
bfc89697cccb 6964164: MonitorInUseLists leak of contended objects
acorn
parents: 1589
diff changeset
118 ObjectMonitor** FreeTailp);
1587
b96a3e44582f 6852873: Reduce safepoint cleanup time
acorn
parents: 0
diff changeset
119 static bool deflate_monitor(ObjectMonitor* mid, oop obj, ObjectMonitor** FreeHeadp,
b96a3e44582f 6852873: Reduce safepoint cleanup time
acorn
parents: 0
diff changeset
120 ObjectMonitor** FreeTailp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
121 static void oops_do(OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
124 static void trace_locking(Handle obj, bool is_compiled, bool is_method, bool is_locking) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 static void verify() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 static int verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
127
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1640
diff changeset
128 static void RegisterSpinCallback (int (*)(intptr_t, int), intptr_t) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents: 1640
diff changeset
129
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
131 enum { _BLOCKSIZE = 128 };
a61af66fc99e Initial load
duke
parents:
diff changeset
132 static ObjectMonitor* gBlockList;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 static ObjectMonitor * volatile gFreeList;
1640
bfc89697cccb 6964164: MonitorInUseLists leak of contended objects
acorn
parents: 1589
diff changeset
134 static ObjectMonitor * volatile gOmInUseList; // for moribund thread, so monitors they inflated still get scanned
bfc89697cccb 6964164: MonitorInUseLists leak of contended objects
acorn
parents: 1589
diff changeset
135 static int gOmInUseCount;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 };
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // ObjectLocker enforced balanced locking and can never thrown an
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // IllegalMonitorStateException. However, a pending exception may
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // have to pass through, and we must also be able to deal with
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // asynchronous exceptions. The caller is responsible for checking
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // the threads pending exception if needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // doLock was added to support classloading with UnsyncloadClass which
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // requires flag based choice of locking the classloader lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
146 class ObjectLocker : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
147 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
148 Thread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
149 Handle _obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 BasicLock _lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 bool _dolock; // default true
a61af66fc99e Initial load
duke
parents:
diff changeset
152 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
153 ObjectLocker(Handle obj, Thread* thread, bool doLock = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 ~ObjectLocker();
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Monitor behavior
a61af66fc99e Initial load
duke
parents:
diff changeset
157 void wait (TRAPS) { ObjectSynchronizer::wait (_obj, 0, CHECK); } // wait forever
a61af66fc99e Initial load
duke
parents:
diff changeset
158 void notify_all(TRAPS) { ObjectSynchronizer::notifyall(_obj, CHECK); }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 void waitUninterruptibly (TRAPS) { ObjectSynchronizer::waitUninterruptibly (_obj, 0, CHECK);}
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // complete_exit gives up lock completely, returning recursion count
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // reenter reclaims lock with original recursion count
a61af66fc99e Initial load
duke
parents:
diff changeset
162 intptr_t complete_exit(TRAPS) { return ObjectSynchronizer::complete_exit(_obj, CHECK_0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 void reenter(intptr_t recursion, TRAPS) { ObjectSynchronizer::reenter(_obj, recursion, CHECK); }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
165
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
166 #endif // SHARE_VM_RUNTIME_SYNCHRONIZER_HPP