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_SYNCHRONIZER_HPP 26 #define SHARE_RUNTIME_SYNCHRONIZER_HPP 27 28 #include "memory/padded.hpp" 29 #include "oops/markWord.hpp" 30 #include "runtime/basicLock.hpp" 31 #include "runtime/handles.hpp" 32 #include "runtime/javaThread.hpp" 33 #include "utilities/resourceHash.hpp" 34 35 template <typename T> class GrowableArray; 36 class LogStream; 37 class ObjectMonitor; 38 class ObjectMonitorDeflationSafepointer; 39 class ThreadsList; 40 41 class MonitorList { 42 friend class VMStructs; 43 44 private: 45 ObjectMonitor* volatile _head; 46 volatile size_t _count; 47 volatile size_t _max; 48 49 public: 50 MonitorList() : _head(nullptr), _count(0), _max(0) {}; 51 void add(ObjectMonitor* monitor); 52 size_t unlink_deflated(size_t deflated_count, 53 GrowableArray<ObjectMonitor*>* unlinked_list, 54 ObjectMonitorDeflationSafepointer* safepointer); 55 size_t count() const; 56 size_t max() const; 57 58 class Iterator; 59 Iterator iterator() const; 60 }; 61 62 class MonitorList::Iterator { 63 ObjectMonitor* _current; 64 65 public: 66 Iterator(ObjectMonitor* head) : _current(head) {} 67 bool has_next() const { return _current != nullptr; } 68 ObjectMonitor* next(); 69 }; 70 71 class ObjectSynchronizer : AllStatic { 72 friend class VMStructs; 73 friend class ObjectMonitorDeflationLogging; 74 friend class WhiteBox; 75 76 public: 77 typedef enum { 78 inflate_cause_vm_internal = 0, 79 inflate_cause_monitor_enter = 1, 80 inflate_cause_wait = 2, 81 inflate_cause_notify = 3, 82 inflate_cause_hash_code = 4, 83 inflate_cause_jni_enter = 5, 84 inflate_cause_jni_exit = 6, 85 inflate_cause_nof = 7 // Number of causes 86 } InflateCause; 87 88 typedef enum { 89 NOT_ENABLED = 0, 90 FATAL_EXIT = 1, 91 LOG_WARNING = 2 92 } SyncDiagnosticOption; 93 94 // exit must be implemented non-blocking, since the compiler cannot easily handle 95 // deoptimization at monitor exit. Hence, it does not take a Handle argument. 96 97 // This is the "slow path" version of monitor enter and exit. 98 static inline void enter(Handle obj, BasicLock* lock, JavaThread* current); 99 static inline void exit(oop obj, BasicLock* lock, JavaThread* current); 100 101 // Used to enter a monitor for another thread. This requires that the 102 // locking_thread is suspended, and that entering on a potential 103 // inflated monitor may only contend with deflation. That is the obj being 104 // locked on is either already locked by the locking_thread or cannot 105 // escape the locking_thread. 106 static void enter_for(Handle obj, BasicLock* lock, JavaThread* locking_thread); 107 private: 108 // Shared implementation for enter and enter_for. Performs all but 109 // inflated monitor enter. 110 static bool enter_fast_impl(Handle obj, BasicLock* lock, JavaThread* locking_thread); 111 112 static bool quick_enter_legacy(oop obj, BasicLock* Lock, JavaThread* current); 113 static void enter_legacy(Handle obj, BasicLock* Lock, JavaThread* current); 114 static void exit_legacy(oop obj, BasicLock* lock, JavaThread* current); 115 public: 116 // Used only to handle jni locks or other unmatched monitor enter/exit 117 // Internally they will use heavy weight monitor. 118 static void jni_enter(Handle obj, JavaThread* current); 119 static void jni_exit(oop obj, TRAPS); 120 121 // Handle all interpreter, compiler and jni cases 122 static int wait(Handle obj, jlong millis, TRAPS); 123 static void notify(Handle obj, TRAPS); 124 static void notifyall(Handle obj, TRAPS); 125 126 static bool quick_notify(oopDesc* obj, JavaThread* current, bool All); 127 static inline bool quick_enter(oop obj, BasicLock* Lock, JavaThread* current); 128 129 // Special internal-use-only method for use by JVM infrastructure 130 // that needs to wait() on a java-level object but that can't risk 131 // throwing unexpected InterruptedExecutionExceptions. 132 static void waitUninterruptibly(Handle obj, jlong Millis, TRAPS); 133 134 // Inflate light weight monitor to heavy weight monitor 135 static ObjectMonitor* inflate(Thread* current, oop obj, const InflateCause cause); 136 // Used to inflate a monitor as if it was done from the thread JavaThread. 137 static ObjectMonitor* inflate_for(JavaThread* thread, oop obj, const InflateCause cause); 138 139 private: 140 // Shared implementation between the different LockingMode. 141 static ObjectMonitor* inflate_impl(JavaThread* locking_thread, oop obj, const InflateCause cause); 142 143 public: 144 // This version is only for internal use 145 static void inflate_helper(oop obj); 146 static const char* inflate_cause_name(const InflateCause cause); 147 148 inline static ObjectMonitor* read_monitor(markWord mark); 149 inline static ObjectMonitor* read_monitor(Thread* current, oop obj, markWord mark); 150 151 // Returns the identity hash value for an oop 152 // NOTE: It may cause monitor inflation 153 static intptr_t FastHashCode(Thread* current, oop obj); 154 155 // java.lang.Thread support 156 static bool current_thread_holds_lock(JavaThread* current, Handle h_obj); 157 158 static JavaThread* get_lock_owner(ThreadsList * t_list, Handle h_obj); 159 160 // JNI detach support 161 static void release_monitors_owned_by_thread(JavaThread* current); 162 163 // Iterate over all ObjectMonitors. 164 template <typename Function> 165 static void monitors_iterate(Function function); 166 167 // Iterate ObjectMonitors owned by any thread and where the owner `filter` 168 // returns true. 169 template <typename OwnerFilter> 170 static void owned_monitors_iterate_filtered(MonitorClosure* closure, OwnerFilter filter); 171 172 // Iterate ObjectMonitors where the owner is thread; this does NOT include 173 // ObjectMonitors where the owner is anonymous. 174 static void owned_monitors_iterate(MonitorClosure* m, JavaThread* thread); 175 176 // Iterate ObjectMonitors where the owner is vthread. 177 static void owned_monitors_iterate(MonitorClosure* m, oop vthread); 178 179 // Iterate ObjectMonitors owned by any thread. 180 static void owned_monitors_iterate(MonitorClosure* closure); 181 182 // Initialize the gInflationLocks 183 static void initialize(); 184 185 // We currently use aggressive monitor deflation policy; 186 // basically we try to deflate all monitors that are not busy. 187 static size_t deflate_idle_monitors(); 188 189 // Deflate idle monitors: 190 static size_t deflate_monitor_list(ObjectMonitorDeflationSafepointer* safepointer); 191 static size_t in_use_list_count(); 192 static size_t in_use_list_max(); 193 static size_t in_use_list_ceiling(); 194 static void dec_in_use_list_ceiling(); 195 static void inc_in_use_list_ceiling(); 196 static void set_in_use_list_ceiling(size_t new_value); 197 static bool is_async_deflation_needed(); 198 static bool is_async_deflation_requested() { return _is_async_deflation_requested; } 199 static bool is_final_audit() { return _is_final_audit; } 200 static void set_is_final_audit() { _is_final_audit = true; } 201 static jlong last_async_deflation_time_ns() { return _last_async_deflation_time_ns; } 202 static void request_deflate_idle_monitors(); 203 static bool request_deflate_idle_monitors_from_wb(); // for whitebox test support 204 static void set_is_async_deflation_requested(bool new_value) { _is_async_deflation_requested = new_value; } 205 static jlong time_since_last_async_deflation_ms(); 206 207 // debugging 208 static void audit_and_print_stats(outputStream* out, bool on_exit); 209 static void chk_in_use_list(outputStream* out, int* error_cnt_p); 210 static void chk_in_use_entry(ObjectMonitor* n, outputStream* out, 211 int* error_cnt_p); 212 static void do_final_audit_and_print_stats(); 213 static void log_in_use_monitor_details(outputStream* out, bool log_all); 214 215 private: 216 friend class SynchronizerTest; 217 friend class LightweightSynchronizer; 218 219 static MonitorList _in_use_list; 220 static volatile bool _is_async_deflation_requested; 221 static volatile bool _is_final_audit; 222 static jlong _last_async_deflation_time_ns; 223 224 // Support for SynchronizerTest access to GVars fields: 225 static u_char* get_gvars_addr(); 226 static u_char* get_gvars_hc_sequence_addr(); 227 static size_t get_gvars_size(); 228 static u_char* get_gvars_stw_random_addr(); 229 230 static void handle_sync_on_value_based_class(Handle obj, JavaThread* locking_thread); 231 }; 232 233 // ObjectLocker enforces balanced locking and can never throw an 234 // IllegalMonitorStateException. However, a pending exception may 235 // have to pass through, and we must also be able to deal with 236 // asynchronous exceptions. The caller is responsible for checking 237 // the thread's pending exception if needed. 238 // When using ObjectLocker the top native frames in the stack will 239 // not be seen in case we attempt preemption, since we start walking 240 // from the last Java anchor, so we disable it with NoPreemptMark. 241 class ObjectLocker : public StackObj { 242 private: 243 JavaThread* _thread; 244 Handle _obj; 245 BasicLock _lock; 246 NoPreemptMark _npm; 247 public: 248 ObjectLocker(Handle obj, JavaThread* current); 249 ~ObjectLocker(); 250 251 // Monitor behavior 252 void wait(TRAPS) { ObjectSynchronizer::wait(_obj, 0, CHECK); } // wait forever 253 void wait_uninterruptibly(TRAPS) { ObjectSynchronizer::waitUninterruptibly(_obj, 0, CHECK); } // wait forever 254 void notify_all(TRAPS) { ObjectSynchronizer::notifyall(_obj, CHECK); } 255 }; 256 257 // Interface to visit monitors 258 class ObjectMonitorsView { 259 public: 260 // Visit monitors that belong to the given thread 261 virtual void visit(MonitorClosure* closure, JavaThread* thread) = 0; 262 }; 263 264 #endif // SHARE_RUNTIME_SYNCHRONIZER_HPP