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