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_MUTEX_HPP
 26 #define SHARE_RUNTIME_MUTEX_HPP
 27 
 28 #include "memory/allocation.hpp"
 29 #include "runtime/atomic.hpp"
 30 #include "runtime/semaphore.hpp"
 31 
 32 #if defined(LINUX) || defined(AIX) || defined(BSD)
 33 # include "mutex_posix.hpp"
 34 #else
 35 # include OS_HEADER(mutex)
 36 #endif
 37 
 38 
 39 // A Mutex/Monitor is a simple wrapper around a native lock plus condition
 40 // variable that supports lock ownership tracking, lock ranking for deadlock
 41 // detection and coordinates with the safepoint protocol.
 42 
 43 // Locking is non-recursive: if you try to lock a mutex you already own then you
 44 // will get an assertion failure in a debug build (which should suffice to expose
 45 // usage bugs). If you call try_lock on a mutex you already own it will return false.
 46 // The underlying PlatformMutex may support recursive locking but this is not exposed
 47 // and we account for that possibility in try_lock.
 48 
 49 // A thread is not allowed to safepoint while holding a mutex whose rank
 50 // is nosafepoint or lower.
 51 
 52 // The Mutex class used to explicitly guarantee fence(); lock(); acquire(); semantics with
 53 // a hand crafted implementation. That may or may not be a desirable contract for a Mutex,
 54 // but is nevertheless something that older HotSpot code may or may not rely on for correctness.
 55 // Newer code is encouraged not to rely more on this feature, but it is not generally safe to
 56 // remove the fences, until all usages of Mutex have been evaluated on a case-by-case basis, whether
 57 // they actually rely on this stronger contract, or not.
 58 
 59 // Having a fence does not have any significant impact on peformance, as this is an internal VM
 60 // mutex and is generally not in hot code paths.
 61 
 62 class Mutex : public CHeapObj<mtSynchronizer> {
 63 
 64   friend class VMStructs;
 65  public:
 66   // Special low level locks are given names and ranges avoid overlap.
 67   enum class Rank {
 68        event,
 69        service        = event          +   6,
 70        stackwatermark = service        +   3,
 71        tty            = stackwatermark +   3,
 72        oopstorage     = tty            +   3,
 73        nosafepoint    = oopstorage     +   6,
 74        safepoint      = nosafepoint    +  20
 75   };
 76 
 77   // want C++later "using enum" directives.
 78   static const Rank event          = Rank::event;
 79   static const Rank service        = Rank::service;
 80   static const Rank stackwatermark = Rank::stackwatermark;
 81   static const Rank tty            = Rank::tty;
 82   static const Rank oopstorage     = Rank::oopstorage;
 83   static const Rank nosafepoint    = Rank::nosafepoint;
 84   static const Rank safepoint      = Rank::safepoint;
 85 
 86   static void assert_no_overlap(Rank orig, Rank adjusted, int adjust);
 87 
 88   friend Rank operator-(Rank base, int adjust) {
 89     Rank result = static_cast<Rank>(static_cast<int>(base) - adjust);
 90     DEBUG_ONLY(assert_no_overlap(base, result, adjust));
 91     return result;
 92   }
 93 
 94   friend constexpr bool operator<(Rank lhs, Rank rhs) {
 95     return static_cast<int>(lhs) < static_cast<int>(rhs);
 96   }
 97 
 98   friend constexpr bool operator>(Rank lhs, Rank rhs)  { return rhs < lhs; }
 99   friend constexpr bool operator<=(Rank lhs, Rank rhs) { return !(lhs > rhs); }
100   friend constexpr bool operator>=(Rank lhs, Rank rhs) { return !(lhs < rhs); }
101 
102  private:
103   // The _owner field is only set by the current thread, either to itself after it has acquired
104   // the low-level _lock, or to null before it has released the _lock. Accesses by any thread other
105   // than the lock owner are inherently racy.
106   Thread* volatile _owner;
107   void raw_set_owner(Thread* new_owner) { Atomic::store(&_owner, new_owner); }
108 
109  protected:                              // Monitor-Mutex metadata
110   PlatformMonitor _lock;                 // Native monitor implementation
111   const char* _name;                     // Name of mutex/monitor
112   int _id;                               // ID for named mutexes
113 
114   // Debugging fields for naming, deadlock detection, etc. (some only used in debug mode)
115 #ifndef PRODUCT
116   bool    _allow_vm_block;
117 #endif
118   static Mutex** _mutex_array;
119   static int _num_mutex;
120 
121 #ifdef ASSERT
122   Rank    _rank;                 // rank (to avoid/detect potential deadlocks)
123   Mutex*  _next;                 // Used by a Thread to link up owned locks
124   Thread* _last_owner;           // the last thread to own the lock
125   bool _skip_rank_check;         // read only by owner when doing rank checks
126 
127   static Mutex* get_least_ranked_lock(Mutex* locks);
128   Mutex* get_least_ranked_lock_besides_this(Mutex* locks);
129   bool skip_rank_check() {
130     assert(owned_by_self(), "only the owner should call this");
131     return _skip_rank_check;
132   }
133 
134  public:
135   Rank   rank() const          { return _rank; }
136   const char*  rank_name() const;
137   Mutex* next()  const         { return _next; }
138 #endif // ASSERT
139 
140  protected:
141   void set_owner_implementation(Thread* owner)                        NOT_DEBUG({ raw_set_owner(owner);});
142   void check_block_state       (Thread* thread)                       NOT_DEBUG_RETURN;
143   void check_safepoint_state   (Thread* thread)                       NOT_DEBUG_RETURN;
144   void check_no_safepoint_state(Thread* thread)                       NOT_DEBUG_RETURN;
145   void check_rank              (Thread* thread)                       NOT_DEBUG_RETURN;
146   void assert_owner            (Thread* expected)                     NOT_DEBUG_RETURN;
147 
148  public:
149   static const bool _allow_vm_block_flag        = true;
150 
151   // Locks can be acquired with or without a safepoint check. NonJavaThreads do not follow
152   // the safepoint protocol when acquiring locks.
153 
154   // Each lock can be acquired by only JavaThreads, only NonJavaThreads, or shared between
155   // Java and NonJavaThreads. When the lock is initialized with rank > nosafepoint,
156   // that means that whenever the lock is acquired by a JavaThread, it will verify that
157   // it is done with a safepoint check. In corollary, when the lock is initialized with
158   // rank <= nosafepoint, that means that whenever the lock is acquired by a JavaThread
159   // it will verify that it is done without a safepoint check.
160 
161   // TODO: Locks that are shared between JavaThreads and NonJavaThreads
162   // should never encounter a safepoint check while they are held, or else a
163   // deadlock can occur. We should check this by noting which
164   // locks are shared, and walk held locks during safepoint checking.
165 
166   enum class SafepointCheckFlag {
167     _safepoint_check_flag,
168     _no_safepoint_check_flag
169   };
170   // Bring the enumerator names into class scope.
171   static const SafepointCheckFlag _safepoint_check_flag =
172     SafepointCheckFlag::_safepoint_check_flag;
173   static const SafepointCheckFlag _no_safepoint_check_flag =
174     SafepointCheckFlag::_no_safepoint_check_flag;
175 
176  public:
177   Mutex(Rank rank, const char *name, bool allow_vm_block);
178 
179   Mutex(Rank rank, const char *name) :
180     Mutex(rank, name, rank > nosafepoint ? false : true) {}
181 
182   ~Mutex();
183 
184   void lock(); // prints out warning if VM thread blocks
185   void lock(Thread *thread); // overloaded with current thread
186   void unlock();
187   bool is_locked() const                     { return owner() != nullptr; }
188 
189   bool try_lock(); // Like lock(), but unblocking. It returns false instead
190  private:
191   void lock_contended(Thread *thread); // contended slow-path
192   bool try_lock_inner(bool do_rank_checks);
193  public:
194 
195   void release_for_safepoint();
196 
197   // Lock without safepoint check. Should ONLY be used by safepoint code and other code
198   // that is guaranteed not to block while running inside the VM.
199   void lock_without_safepoint_check();
200   void lock_without_safepoint_check(Thread* self);
201   // A thread should not call this if failure to acquire ownership will blocks its progress
202   bool try_lock_without_rank_check();
203 
204   // Current owner - note not MT-safe. Can only be used to guarantee that
205   // the current running thread owns the lock
206   Thread* owner() const         { return Atomic::load(&_owner); }
207   void set_owner(Thread* owner) { set_owner_implementation(owner); }
208   bool owned_by_self() const;
209 
210   const char *name() const                  { return _name; }
211 
212   int      id() const { return _id; }
213 //  void set_id(int id) { _id = id; }
214 
215   static void  add_mutex(Mutex* var);
216 
217   void print_on_error(outputStream* st) const;
218   #ifndef PRODUCT
219     void print_on(outputStream* st) const;
220     void print() const;
221   #endif
222 
223   // Print all mutexes/monitors that are currently owned by a thread; called
224   // by fatal error handler.
225   static void print_owned_locks_on_error(outputStream* st);
226   static void print_lock_ranks(outputStream* st);
227 
228   static int num_mutex() { return _num_mutex; }
229 };
230 
231 class Monitor : public Mutex {
232  public:
233   Monitor(Rank rank, const char *name, bool allow_vm_block)  :
234     Mutex(rank, name, allow_vm_block) {}
235 
236   Monitor(Rank rank, const char *name) :
237     Mutex(rank, name) {}
238   // default destructor
239 
240   // Wait until monitor is notified (or times out).
241   // Defaults are to make safepoint checks, wait time is forever (i.e.,
242   // zero). Returns true if wait times out; otherwise returns false.
243   bool wait(uint64_t timeout = 0);
244   bool wait_without_safepoint_check(uint64_t timeout = 0);
245   void notify();
246   void notify_all();
247 };
248 
249 
250 class PaddedMutex : public Mutex {
251   enum {
252     CACHE_LINE_PADDING = (int)DEFAULT_PADDING_SIZE - (int)sizeof(Mutex),
253     PADDING_LEN = CACHE_LINE_PADDING > 0 ? CACHE_LINE_PADDING : 1
254   };
255   char _padding[PADDING_LEN];
256 public:
257   PaddedMutex(Rank rank, const char *name, bool allow_vm_block) : Mutex(rank, name, allow_vm_block) {};
258   PaddedMutex(Rank rank, const char *name) : Mutex(rank, name) {};
259 };
260 
261 class PaddedMonitor : public Monitor {
262   enum {
263     CACHE_LINE_PADDING = (int)DEFAULT_PADDING_SIZE - (int)sizeof(Monitor),
264     PADDING_LEN = CACHE_LINE_PADDING > 0 ? CACHE_LINE_PADDING : 1
265   };
266   char _padding[PADDING_LEN];
267  public:
268   PaddedMonitor(Rank rank, const char *name, bool allow_vm_block) : Monitor(rank, name, allow_vm_block) {};
269   PaddedMonitor(Rank rank, const char *name) : Monitor(rank, name) {};
270 };
271 
272 // RecursiveMutex is a minimal implementation, and has no safety and rank checks that Mutex has.
273 // There are also no checks that the recursive lock is not held when going to Java or to JNI, like
274 // other JVM mutexes have.  This should be used only for cases where the alternatives with all the
275 // nice safety features don't work.
276 // Waiting on the RecursiveMutex partipates in the safepoint protocol if the current thread is a Java thread,
277 // (ie. waiting sets JavaThread to blocked)
278 class RecursiveMutex : public CHeapObj<mtThread> {
279   Semaphore  _sem;
280   Thread*    _owner;
281   int        _recursions;
282 
283   NONCOPYABLE(RecursiveMutex);
284  public:
285   RecursiveMutex();
286   void lock(Thread* current);
287   void unlock(Thread* current);
288   // For use in asserts
289   bool holds_lock(Thread* current) { return _owner == current; }
290 };
291 
292 #endif // SHARE_RUNTIME_MUTEX_HPP