Mercurial > hg > graal-compiler
comparison src/share/vm/runtime/synchronizer.hpp @ 1930:2d26b0046e0d
Merge.
author | Thomas Wuerthinger <wuerthinger@ssw.jku.at> |
---|---|
date | Tue, 30 Nov 2010 14:53:30 +0100 |
parents | fa83ab460c54 |
children | f95d63e2154a |
comparison
equal
deleted
inserted
replaced
1484:6b7001391c97 | 1930:2d26b0046e0d |
---|---|
1 /* | 1 /* |
2 * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved. | 2 * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 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 | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
14 * | 14 * |
15 * You should have received a copy of the GNU General Public License version | 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, | 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. | 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
18 * | 18 * |
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
20 * CA 95054 USA or visit www.sun.com if you need additional information or | 20 * or visit www.oracle.com if you need additional information or have any |
21 * have any questions. | 21 * questions. |
22 * | 22 * |
23 */ | 23 */ |
24 | 24 |
25 class BasicLock VALUE_OBJ_CLASS_SPEC { | |
26 friend class VMStructs; | |
27 private: | |
28 volatile markOop _displaced_header; | |
29 public: | |
30 markOop displaced_header() const { return _displaced_header; } | |
31 void set_displaced_header(markOop header) { _displaced_header = header; } | |
32 | |
33 void print_on(outputStream* st) const; | |
34 | |
35 // move a basic lock (used during deoptimization | |
36 void move_to(oop obj, BasicLock* dest); | |
37 | |
38 static int displaced_header_offset_in_bytes() { return offset_of(BasicLock, _displaced_header); } | |
39 }; | |
40 | |
41 // A BasicObjectLock associates a specific Java object with a BasicLock. | |
42 // It is currently embedded in an interpreter frame. | |
43 | |
44 // Because some machines have alignment restrictions on the control stack, | |
45 // the actual space allocated by the interpreter may include padding words | |
46 // after the end of the BasicObjectLock. Also, in order to guarantee | |
47 // alignment of the embedded BasicLock objects on such machines, we | |
48 // put the embedded BasicLock at the beginning of the struct. | |
49 | |
50 class BasicObjectLock VALUE_OBJ_CLASS_SPEC { | |
51 friend class VMStructs; | |
52 private: | |
53 BasicLock _lock; // the lock, must be double word aligned | |
54 oop _obj; // object holds the lock; | |
55 | |
56 public: | |
57 // Manipulation | |
58 oop obj() const { return _obj; } | |
59 void set_obj(oop obj) { _obj = obj; } | |
60 BasicLock* lock() { return &_lock; } | |
61 | |
62 // Note: Use frame::interpreter_frame_monitor_size() for the size of BasicObjectLocks | |
63 // in interpreter activation frames since it includes machine-specific padding. | |
64 static int size() { return sizeof(BasicObjectLock)/wordSize; } | |
65 | |
66 // GC support | |
67 void oops_do(OopClosure* f) { f->do_oop(&_obj); } | |
68 | |
69 static int obj_offset_in_bytes() { return offset_of(BasicObjectLock, _obj); } | |
70 static int lock_offset_in_bytes() { return offset_of(BasicObjectLock, _lock); } | |
71 }; | |
72 | 25 |
73 class ObjectMonitor; | 26 class ObjectMonitor; |
74 | 27 |
75 class ObjectSynchronizer : AllStatic { | 28 class ObjectSynchronizer : AllStatic { |
76 friend class VMStructs; | 29 friend class VMStructs; |
120 // with original recursion count | 73 // with original recursion count |
121 static intptr_t complete_exit (Handle obj, TRAPS); | 74 static intptr_t complete_exit (Handle obj, TRAPS); |
122 static void reenter (Handle obj, intptr_t recursion, TRAPS); | 75 static void reenter (Handle obj, intptr_t recursion, TRAPS); |
123 | 76 |
124 // thread-specific and global objectMonitor free list accessors | 77 // thread-specific and global objectMonitor free list accessors |
78 // static void verifyInUse (Thread * Self) ; too slow for general assert/debug | |
125 static ObjectMonitor * omAlloc (Thread * Self) ; | 79 static ObjectMonitor * omAlloc (Thread * Self) ; |
126 static void omRelease (Thread * Self, ObjectMonitor * m) ; | 80 static void omRelease (Thread * Self, ObjectMonitor * m, bool FromPerThreadAlloc) ; |
127 static void omFlush (Thread * Self) ; | 81 static void omFlush (Thread * Self) ; |
128 | 82 |
129 // Inflate light weight monitor to heavy weight monitor | 83 // Inflate light weight monitor to heavy weight monitor |
130 static ObjectMonitor* inflate(Thread * Self, oop obj); | 84 static ObjectMonitor* inflate(Thread * Self, oop obj); |
131 // This version is only for internal use | 85 // This version is only for internal use |
148 | 102 |
149 // GC: we current use aggressive monitor deflation policy | 103 // GC: we current use aggressive monitor deflation policy |
150 // Basically we deflate all monitors that are not busy. | 104 // Basically we deflate all monitors that are not busy. |
151 // An adaptive profile-based deflation policy could be used if needed | 105 // An adaptive profile-based deflation policy could be used if needed |
152 static void deflate_idle_monitors(); | 106 static void deflate_idle_monitors(); |
107 static int walk_monitor_list(ObjectMonitor** listheadp, | |
108 ObjectMonitor** FreeHeadp, | |
109 ObjectMonitor** FreeTailp); | |
110 static bool deflate_monitor(ObjectMonitor* mid, oop obj, ObjectMonitor** FreeHeadp, | |
111 ObjectMonitor** FreeTailp); | |
153 static void oops_do(OopClosure* f); | 112 static void oops_do(OopClosure* f); |
154 | 113 |
155 // debugging | 114 // debugging |
156 static void trace_locking(Handle obj, bool is_compiled, bool is_method, bool is_locking) PRODUCT_RETURN; | 115 static void trace_locking(Handle obj, bool is_compiled, bool is_method, bool is_locking) PRODUCT_RETURN; |
157 static void verify() PRODUCT_RETURN; | 116 static void verify() PRODUCT_RETURN; |
158 static int verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0; | 117 static int verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0; |
159 | 118 |
119 static void RegisterSpinCallback (int (*)(intptr_t, int), intptr_t) ; | |
120 | |
160 private: | 121 private: |
161 enum { _BLOCKSIZE = 128 }; | 122 enum { _BLOCKSIZE = 128 }; |
162 static ObjectMonitor* gBlockList; | 123 static ObjectMonitor* gBlockList; |
163 static ObjectMonitor * volatile gFreeList; | 124 static ObjectMonitor * volatile gFreeList; |
164 | 125 static ObjectMonitor * volatile gOmInUseList; // for moribund thread, so monitors they inflated still get scanned |
165 public: | 126 static int gOmInUseCount; |
166 static void Initialize () ; | |
167 static PerfCounter * _sync_ContendedLockAttempts ; | |
168 static PerfCounter * _sync_FutileWakeups ; | |
169 static PerfCounter * _sync_Parks ; | |
170 static PerfCounter * _sync_EmptyNotifications ; | |
171 static PerfCounter * _sync_Notifications ; | |
172 static PerfCounter * _sync_SlowEnter ; | |
173 static PerfCounter * _sync_SlowExit ; | |
174 static PerfCounter * _sync_SlowNotify ; | |
175 static PerfCounter * _sync_SlowNotifyAll ; | |
176 static PerfCounter * _sync_FailedSpins ; | |
177 static PerfCounter * _sync_SuccessfulSpins ; | |
178 static PerfCounter * _sync_PrivateA ; | |
179 static PerfCounter * _sync_PrivateB ; | |
180 static PerfCounter * _sync_MonInCirculation ; | |
181 static PerfCounter * _sync_MonScavenged ; | |
182 static PerfCounter * _sync_Inflations ; | |
183 static PerfCounter * _sync_Deflations ; | |
184 static PerfLongVariable * _sync_MonExtant ; | |
185 | |
186 public: | |
187 static void RegisterSpinCallback (int (*)(intptr_t, int), intptr_t) ; | |
188 | 127 |
189 }; | 128 }; |
190 | 129 |
191 // ObjectLocker enforced balanced locking and can never thrown an | 130 // ObjectLocker enforced balanced locking and can never thrown an |
192 // IllegalMonitorStateException. However, a pending exception may | 131 // IllegalMonitorStateException. However, a pending exception may |