1 /* 2 * Copyright (c) 1998, 2024, 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 #ifndef SHARE_RUNTIME_OBJECTMONITOR_HPP 26 #define SHARE_RUNTIME_OBJECTMONITOR_HPP 27 28 #include "memory/allocation.hpp" 29 #include "memory/padded.hpp" 30 #include "oops/markWord.hpp" 31 #include "oops/weakHandle.hpp" 32 #include "runtime/perfDataTypes.hpp" 33 #include "utilities/checkedCast.hpp" 34 35 class ObjectMonitor; 36 class ParkEvent; 37 38 // ObjectWaiter serves as a "proxy" or surrogate thread. 39 // TODO-FIXME: Eliminate ObjectWaiter and use the thread-specific 40 // ParkEvent instead. Beware, however, that the JVMTI code 41 // knows about ObjectWaiters, so we'll have to reconcile that code. 42 // See next_waiter(), first_waiter(), etc. 43 44 class ObjectWaiter : public StackObj { 45 public: 46 enum TStates { TS_UNDEF, TS_READY, TS_RUN, TS_WAIT, TS_ENTER, TS_CXQ }; 47 ObjectWaiter* volatile _next; 48 ObjectWaiter* volatile _prev; 49 JavaThread* _thread; 50 uint64_t _notifier_tid; 51 ParkEvent * _event; 52 volatile int _notified; 53 volatile TStates TState; 54 bool _active; // Contention monitoring is enabled 55 public: 56 ObjectWaiter(JavaThread* current); 57 58 void wait_reenter_begin(ObjectMonitor *mon); 59 void wait_reenter_end(ObjectMonitor *mon); 60 }; 61 62 // The ObjectMonitor class implements the heavyweight version of a 63 // JavaMonitor. The lightweight BasicLock/stack lock version has been 64 // inflated into an ObjectMonitor. This inflation is typically due to 65 // contention or use of Object.wait(). 66 // 67 // WARNING: This is a very sensitive and fragile class. DO NOT make any 68 // changes unless you are fully aware of the underlying semantics. 69 // 70 // ObjectMonitor Layout Overview/Highlights/Restrictions: 71 // 72 // - The _header field must be at offset 0 because the displaced header 73 // from markWord is stored there. We do not want markWord.hpp to include 74 // ObjectMonitor.hpp to avoid exposing ObjectMonitor everywhere. This 75 // means that ObjectMonitor cannot inherit from any other class nor can 76 // it use any virtual member functions. This restriction is critical to 77 // the proper functioning of the VM. 78 // - The _header and _owner fields should be separated by enough space 79 // to avoid false sharing due to parallel access by different threads. 80 // This is an advisory recommendation. 81 // - The general layout of the fields in ObjectMonitor is: 82 // _header 83 // <lightly_used_fields> 84 // <optional padding> 85 // _owner 86 // <remaining_fields> 87 // - The VM assumes write ordering and machine word alignment with 88 // respect to the _owner field and the <remaining_fields> that can 89 // be read in parallel by other threads. 90 // - Generally fields that are accessed closely together in time should 91 // be placed proximally in space to promote data cache locality. That 92 // is, temporal locality should condition spatial locality. 93 // - We have to balance avoiding false sharing with excessive invalidation 94 // from coherence traffic. As such, we try to cluster fields that tend 95 // to be _written_ at approximately the same time onto the same data 96 // cache line. 97 // - We also have to balance the natural tension between minimizing 98 // single threaded capacity misses with excessive multi-threaded 99 // coherency misses. There is no single optimal layout for both 100 // single-threaded and multi-threaded environments. 101 // 102 // - See TEST_VM(ObjectMonitor, sanity) gtest for how critical restrictions are 103 // enforced. 104 // - Adjacent ObjectMonitors should be separated by enough space to avoid 105 // false sharing. This is handled by the ObjectMonitor allocation code 106 // in synchronizer.cpp. Also see TEST_VM(SynchronizerTest, sanity) gtest. 107 // 108 // Futures notes: 109 // - Separating _owner from the <remaining_fields> by enough space to 110 // avoid false sharing might be profitable. Given 111 // http://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate 112 // we know that the CAS in monitorenter will invalidate the line 113 // underlying _owner. We want to avoid an L1 data cache miss on that 114 // same line for monitorexit. Putting these <remaining_fields>: 115 // _recursions, _EntryList, _cxq, and _succ, all of which may be 116 // fetched in the inflated unlock path, on a different cache line 117 // would make them immune to CAS-based invalidation from the _owner 118 // field. 119 // 120 // - The _recursions field should be of type int, or int32_t but not 121 // intptr_t. There's no reason to use a 64-bit type for this field 122 // in a 64-bit JVM. 123 124 #define OM_CACHE_LINE_SIZE DEFAULT_CACHE_LINE_SIZE 125 126 class ObjectMonitor : public CHeapObj<mtObjectMonitor> { 127 friend class ObjectSynchronizer; 128 friend class ObjectWaiter; 129 friend class VMStructs; 130 JVMCI_ONLY(friend class JVMCIVMStructs;) 131 132 static OopStorage* _oop_storage; 133 134 // The sync code expects the header field to be at offset zero (0). 135 // Enforced by the assert() in header_addr(). 136 volatile markWord _header; // displaced object header word - mark 137 WeakHandle _object; // backward object pointer 138 // Separate _header and _owner on different cache lines since both can 139 // have busy multi-threaded access. _header and _object are set at initial 140 // inflation. The _object does not change, so it is a good choice to share 141 // its cache line with _header. 142 DEFINE_PAD_MINUS_SIZE(0, OM_CACHE_LINE_SIZE, sizeof(volatile markWord) + 143 sizeof(WeakHandle)); 144 // Used by async deflation as a marker in the _owner field. 145 // Note that the choice of the two markers is peculiar: 146 // - They need to represent values that cannot be pointers. In particular, 147 // we achieve this by using the lowest two bits. 148 // - ANONYMOUS_OWNER should be a small value, it is used in generated code 149 // and small values encode much better. 150 // - We test for anonymous owner by testing for the lowest bit, therefore 151 // DEFLATER_MARKER must *not* have that bit set. 152 #define DEFLATER_MARKER reinterpret_cast<void*>(2) 153 public: 154 // NOTE: Typed as uintptr_t so that we can pick it up in SA, via vmStructs. 155 static const uintptr_t ANONYMOUS_OWNER = 1; 156 157 private: 158 static void* anon_owner_ptr() { return reinterpret_cast<void*>(ANONYMOUS_OWNER); } 159 160 void* volatile _owner; // pointer to owning thread OR BasicLock 161 volatile uint64_t _previous_owner_tid; // thread id of the previous owner of the monitor 162 // Separate _owner and _next_om on different cache lines since 163 // both can have busy multi-threaded access. _previous_owner_tid is only 164 // changed by ObjectMonitor::exit() so it is a good choice to share the 165 // cache line with _owner. 166 DEFINE_PAD_MINUS_SIZE(1, OM_CACHE_LINE_SIZE, sizeof(void* volatile) + 167 sizeof(volatile uint64_t)); 168 ObjectMonitor* _next_om; // Next ObjectMonitor* linkage 169 volatile intx _recursions; // recursion count, 0 for first entry 170 ObjectWaiter* volatile _EntryList; // Threads blocked on entry or reentry. 171 // The list is actually composed of WaitNodes, 172 // acting as proxies for Threads. 173 174 ObjectWaiter* volatile _cxq; // LL of recently-arrived threads blocked on entry. 175 JavaThread* volatile _succ; // Heir presumptive thread - used for futile wakeup throttling 176 JavaThread* volatile _Responsible; 177 178 volatile int _SpinDuration; 179 180 int _contentions; // Number of active contentions in enter(). It is used by is_busy() 181 // along with other fields to determine if an ObjectMonitor can be 182 // deflated. It is also used by the async deflation protocol. See 183 // ObjectMonitor::deflate_monitor(). 184 protected: 185 ObjectWaiter* volatile _WaitSet; // LL of threads wait()ing on the monitor 186 volatile int _waiters; // number of waiting threads 187 private: 188 volatile int _WaitSetLock; // protects Wait Queue - simple spinlock 189 190 public: 191 192 static void Initialize(); 193 194 // Only perform a PerfData operation if the PerfData object has been 195 // allocated and if the PerfDataManager has not freed the PerfData 196 // objects which can happen at normal VM shutdown. 197 // 198 #define OM_PERFDATA_OP(f, op_str) \ 199 do { \ 200 if (ObjectMonitor::_sync_ ## f != nullptr && \ 201 PerfDataManager::has_PerfData()) { \ 202 ObjectMonitor::_sync_ ## f->op_str; \ 203 } \ 204 } while (0) 205 206 static PerfCounter * _sync_ContendedLockAttempts; 207 static PerfCounter * _sync_FutileWakeups; 208 static PerfCounter * _sync_Parks; 209 static PerfCounter * _sync_Notifications; 210 static PerfCounter * _sync_Inflations; 211 static PerfCounter * _sync_Deflations; 212 static PerfLongVariable * _sync_MonExtant; 213 214 static int Knob_SpinLimit; 215 216 static ByteSize owner_offset() { return byte_offset_of(ObjectMonitor, _owner); } 217 static ByteSize recursions_offset() { return byte_offset_of(ObjectMonitor, _recursions); } 218 static ByteSize cxq_offset() { return byte_offset_of(ObjectMonitor, _cxq); } 219 static ByteSize succ_offset() { return byte_offset_of(ObjectMonitor, _succ); } 220 static ByteSize EntryList_offset() { return byte_offset_of(ObjectMonitor, _EntryList); } 221 222 // ObjectMonitor references can be ORed with markWord::monitor_value 223 // as part of the ObjectMonitor tagging mechanism. When we combine an 224 // ObjectMonitor reference with an offset, we need to remove the tag 225 // value in order to generate the proper address. 226 // 227 // We can either adjust the ObjectMonitor reference and then add the 228 // offset or we can adjust the offset that is added to the ObjectMonitor 229 // reference. The latter avoids an AGI (Address Generation Interlock) 230 // stall so the helper macro adjusts the offset value that is returned 231 // to the ObjectMonitor reference manipulation code: 232 // 233 #define OM_OFFSET_NO_MONITOR_VALUE_TAG(f) \ 234 ((in_bytes(ObjectMonitor::f ## _offset())) - checked_cast<int>(markWord::monitor_value)) 235 236 markWord header() const; 237 volatile markWord* header_addr(); 238 void set_header(markWord hdr); 239 240 bool is_busy() const { 241 // TODO-FIXME: assert _owner == null implies _recursions = 0 242 intptr_t ret_code = intptr_t(_waiters) | intptr_t(_cxq) | intptr_t(_EntryList); 243 int cnts = contentions(); // read once 244 if (cnts > 0) { 245 ret_code |= intptr_t(cnts); 246 } 247 if (!owner_is_DEFLATER_MARKER()) { 248 ret_code |= intptr_t(owner_raw()); 249 } 250 return ret_code != 0; 251 } 252 const char* is_busy_to_string(stringStream* ss); 253 254 bool is_entered(JavaThread* current) const; 255 256 // Returns true if this OM has an owner, false otherwise. 257 bool has_owner() const; 258 void* owner() const; // Returns null if DEFLATER_MARKER is observed. 259 void* owner_raw() const; 260 // Returns true if owner field == DEFLATER_MARKER and false otherwise. 261 bool owner_is_DEFLATER_MARKER() const; 262 // Returns true if 'this' is being async deflated and false otherwise. 263 bool is_being_async_deflated(); 264 // Clear _owner field; current value must match old_value. 265 void release_clear_owner(void* old_value); 266 // Simply set _owner field to new_value; current value must match old_value. 267 void set_owner_from(void* old_value, void* new_value); 268 // Simply set _owner field to current; current value must match basic_lock_p. 269 void set_owner_from_BasicLock(void* basic_lock_p, JavaThread* current); 270 // Try to set _owner field to new_value if the current value matches 271 // old_value, using Atomic::cmpxchg(). Otherwise, does not change the 272 // _owner field. Returns the prior value of the _owner field. 273 void* try_set_owner_from(void* old_value, void* new_value); 274 275 void set_owner_anonymous() { 276 set_owner_from(nullptr, anon_owner_ptr()); 277 } 278 279 bool is_owner_anonymous() const { 280 return owner_raw() == anon_owner_ptr(); 281 } 282 283 void set_owner_from_anonymous(Thread* owner) { 284 set_owner_from(anon_owner_ptr(), owner); 285 } 286 287 // Simply get _next_om field. 288 ObjectMonitor* next_om() const; 289 // Simply set _next_om field to new_value. 290 void set_next_om(ObjectMonitor* new_value); 291 292 int waiters() const; 293 294 int contentions() const; 295 void add_to_contentions(int value); 296 intx recursions() const { return _recursions; } 297 void set_recursions(size_t recursions); 298 299 // JVM/TI GetObjectMonitorUsage() needs this: 300 ObjectWaiter* first_waiter() { return _WaitSet; } 301 ObjectWaiter* next_waiter(ObjectWaiter* o) { return o->_next; } 302 JavaThread* thread_of_waiter(ObjectWaiter* o) { return o->_thread; } 303 304 ObjectMonitor(oop object); 305 ~ObjectMonitor(); 306 307 oop object() const; 308 oop object_peek() const; 309 310 // Returns true if the specified thread owns the ObjectMonitor. Otherwise 311 // returns false and throws IllegalMonitorStateException (IMSE). 312 bool check_owner(TRAPS); 313 314 private: 315 class ExitOnSuspend { 316 protected: 317 ObjectMonitor* _om; 318 bool _om_exited; 319 public: 320 ExitOnSuspend(ObjectMonitor* om) : _om(om), _om_exited(false) {} 321 void operator()(JavaThread* current); 322 bool exited() { return _om_exited; } 323 }; 324 class ClearSuccOnSuspend { 325 protected: 326 ObjectMonitor* _om; 327 public: 328 ClearSuccOnSuspend(ObjectMonitor* om) : _om(om) {} 329 void operator()(JavaThread* current); 330 }; 331 public: 332 bool enter_for(JavaThread* locking_thread); 333 bool enter(JavaThread* current); 334 void exit(JavaThread* current, bool not_suspended = true); 335 void wait(jlong millis, bool interruptible, TRAPS); 336 void notify(TRAPS); 337 void notifyAll(TRAPS); 338 339 void print() const; 340 #ifdef ASSERT 341 void print_debug_style_on(outputStream* st) const; 342 #endif 343 void print_on(outputStream* st) const; 344 345 // Use the following at your own risk 346 intx complete_exit(JavaThread* current); 347 348 private: 349 void AddWaiter(ObjectWaiter* waiter); 350 void INotify(JavaThread* current); 351 ObjectWaiter* DequeueWaiter(); 352 void DequeueSpecificWaiter(ObjectWaiter* waiter); 353 void EnterI(JavaThread* current); 354 void ReenterI(JavaThread* current, ObjectWaiter* current_node); 355 void UnlinkAfterAcquire(JavaThread* current, ObjectWaiter* current_node); 356 357 358 enum class TryLockResult { Interference = -1, HasOwner = 0, Success = 1 }; 359 360 TryLockResult TryLock(JavaThread* current); 361 362 bool TrySpin(JavaThread* current); 363 bool short_fixed_spin(JavaThread* current, int spin_count, bool adapt); 364 void ExitEpilog(JavaThread* current, ObjectWaiter* Wakee); 365 366 // Deflation support 367 bool deflate_monitor(); 368 void install_displaced_markword_in_object(const oop obj); 369 }; 370 371 #endif // SHARE_RUNTIME_OBJECTMONITOR_HPP