src/hotspot/share/runtime/mutexLocker.hpp
changeset 47216 71c04702a3d5
parent 46505 fd4bc78630b1
child 47756 55714c3d544c
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 /*
       
     2  * Copyright (c) 1997, 2017, 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_VM_RUNTIME_MUTEXLOCKER_HPP
       
    26 #define SHARE_VM_RUNTIME_MUTEXLOCKER_HPP
       
    27 
       
    28 #include "memory/allocation.hpp"
       
    29 #include "runtime/mutex.hpp"
       
    30 
       
    31 // Mutexes used in the VM.
       
    32 
       
    33 extern Mutex*   Patching_lock;                   // a lock used to guard code patching of compiled code
       
    34 extern Monitor* SystemDictionary_lock;           // a lock on the system dictionary
       
    35 extern Mutex*   Module_lock;                     // a lock on module and package related data structures
       
    36 extern Mutex*   CompiledIC_lock;                 // a lock used to guard compiled IC patching and access
       
    37 extern Mutex*   InlineCacheBuffer_lock;          // a lock used to guard the InlineCacheBuffer
       
    38 extern Mutex*   VMStatistic_lock;                // a lock used to guard statistics count increment
       
    39 extern Mutex*   JNIGlobalHandle_lock;            // a lock on creating JNI global handles
       
    40 extern Mutex*   JNIHandleBlockFreeList_lock;     // a lock on the JNI handle block free list
       
    41 extern Mutex*   ResolvedMethodTable_lock;        // a lock on the ResolvedMethodTable updates
       
    42 extern Mutex*   JmethodIdCreation_lock;          // a lock on creating JNI method identifiers
       
    43 extern Mutex*   JfieldIdCreation_lock;           // a lock on creating JNI static field identifiers
       
    44 extern Monitor* JNICritical_lock;                // a lock used while entering and exiting JNI critical regions, allows GC to sometimes get in
       
    45 extern Mutex*   JvmtiThreadState_lock;           // a lock on modification of JVMTI thread data
       
    46 extern Monitor* Heap_lock;                       // a lock on the heap
       
    47 extern Mutex*   ExpandHeap_lock;                 // a lock on expanding the heap
       
    48 extern Mutex*   AdapterHandlerLibrary_lock;      // a lock on the AdapterHandlerLibrary
       
    49 extern Mutex*   SignatureHandlerLibrary_lock;    // a lock on the SignatureHandlerLibrary
       
    50 extern Mutex*   VtableStubs_lock;                // a lock on the VtableStubs
       
    51 extern Mutex*   SymbolTable_lock;                // a lock on the symbol table
       
    52 extern Mutex*   StringTable_lock;                // a lock on the interned string table
       
    53 extern Monitor* StringDedupQueue_lock;           // a lock on the string deduplication queue
       
    54 extern Mutex*   StringDedupTable_lock;           // a lock on the string deduplication table
       
    55 extern Monitor* CodeCache_lock;                  // a lock on the CodeCache, rank is special, use MutexLockerEx
       
    56 extern Mutex*   MethodData_lock;                 // a lock on installation of method data
       
    57 extern Mutex*   TouchedMethodLog_lock;           // a lock on allocation of LogExecutedMethods info
       
    58 extern Mutex*   RetData_lock;                    // a lock on installation of RetData inside method data
       
    59 extern Mutex*   DerivedPointerTableGC_lock;      // a lock to protect the derived pointer table
       
    60 extern Monitor* CGCPhaseManager_lock;            // a lock to protect a concurrent GC's phase management
       
    61 extern Monitor* VMOperationQueue_lock;           // a lock on queue of vm_operations waiting to execute
       
    62 extern Monitor* VMOperationRequest_lock;         // a lock on Threads waiting for a vm_operation to terminate
       
    63 extern Monitor* Safepoint_lock;                  // a lock used by the safepoint abstraction
       
    64 extern Monitor* Threads_lock;                    // a lock on the Threads table of active Java threads
       
    65                                                  // (also used by Safepoints too to block threads creation/destruction)
       
    66 extern Monitor* CGC_lock;                        // used for coordination between
       
    67                                                  // fore- & background GC threads.
       
    68 extern Monitor* STS_lock;                        // used for joining/leaving SuspendibleThreadSet.
       
    69 extern Monitor* FullGCCount_lock;                // in support of "concurrent" full gc
       
    70 extern Mutex*   SATB_Q_FL_lock;                  // Protects SATB Q
       
    71                                                  // buffer free list.
       
    72 extern Monitor* SATB_Q_CBL_mon;                  // Protects SATB Q
       
    73                                                  // completed buffer queue.
       
    74 extern Mutex*   Shared_SATB_Q_lock;              // Lock protecting SATB
       
    75                                                  // queue shared by
       
    76                                                  // non-Java threads.
       
    77 
       
    78 extern Mutex*   DirtyCardQ_FL_lock;              // Protects dirty card Q
       
    79                                                  // buffer free list.
       
    80 extern Monitor* DirtyCardQ_CBL_mon;              // Protects dirty card Q
       
    81                                                  // completed buffer queue.
       
    82 extern Mutex*   Shared_DirtyCardQ_lock;          // Lock protecting dirty card
       
    83                                                  // queue shared by
       
    84                                                  // non-Java threads.
       
    85 extern Mutex*   MarkStackFreeList_lock;          // Protects access to the global mark stack free list.
       
    86 extern Mutex*   MarkStackChunkList_lock;         // Protects access to the global mark stack chunk list.
       
    87 extern Mutex*   ParGCRareEvent_lock;             // Synchronizes various (rare) parallel GC ops.
       
    88 extern Mutex*   Compile_lock;                    // a lock held when Compilation is updating code (used to block CodeCache traversal, CHA updates, etc)
       
    89 extern Monitor* MethodCompileQueue_lock;         // a lock held when method compilations are enqueued, dequeued
       
    90 extern Monitor* CompileThread_lock;              // a lock held by compile threads during compilation system initialization
       
    91 extern Monitor* Compilation_lock;                // a lock used to pause compilation
       
    92 extern Mutex*   CompileTaskAlloc_lock;           // a lock held when CompileTasks are allocated
       
    93 extern Mutex*   CompileStatistics_lock;          // a lock held when updating compilation statistics
       
    94 extern Mutex*   DirectivesStack_lock;            // a lock held when mutating the dirstack and ref counting directives
       
    95 extern Mutex*   MultiArray_lock;                 // a lock used to guard allocation of multi-dim arrays
       
    96 extern Monitor* Terminator_lock;                 // a lock used to guard termination of the vm
       
    97 extern Monitor* BeforeExit_lock;                 // a lock used to guard cleanups and shutdown hooks
       
    98 extern Monitor* Notify_lock;                     // a lock used to synchronize the start-up of the vm
       
    99 extern Mutex*   ProfilePrint_lock;               // a lock used to serialize the printing of profiles
       
   100 extern Mutex*   ExceptionCache_lock;             // a lock used to synchronize exception cache updates
       
   101 extern Mutex*   OsrList_lock;                    // a lock used to serialize access to OSR queues
       
   102 
       
   103 #ifndef PRODUCT
       
   104 extern Mutex*   FullGCALot_lock;                 // a lock to make FullGCALot MT safe
       
   105 #endif // PRODUCT
       
   106 extern Mutex*   Debug1_lock;                     // A bunch of pre-allocated locks that can be used for tracing
       
   107 extern Mutex*   Debug2_lock;                     // down synchronization related bugs!
       
   108 extern Mutex*   Debug3_lock;
       
   109 
       
   110 extern Mutex*   RawMonitor_lock;
       
   111 extern Mutex*   PerfDataMemAlloc_lock;           // a lock on the allocator for PerfData memory for performance data
       
   112 extern Mutex*   PerfDataManager_lock;            // a long on access to PerfDataManager resources
       
   113 extern Mutex*   ParkerFreeList_lock;
       
   114 extern Mutex*   OopMapCacheAlloc_lock;           // protects allocation of oop_map caches
       
   115 
       
   116 extern Mutex*   FreeList_lock;                   // protects the free region list during safepoints
       
   117 extern Monitor* SecondaryFreeList_lock;          // protects the secondary free region list
       
   118 extern Mutex*   OldSets_lock;                    // protects the old region sets
       
   119 extern Monitor* RootRegionScan_lock;             // used to notify that the CM threads have finished scanning the IM snapshot regions
       
   120 extern Mutex*   MMUTracker_lock;                 // protects the MMU
       
   121                                                  // tracker data structures
       
   122 
       
   123 extern Mutex*   Management_lock;                 // a lock used to serialize JVM management
       
   124 extern Monitor* Service_lock;                    // a lock used for service thread operation
       
   125 extern Monitor* PeriodicTask_lock;               // protects the periodic task structure
       
   126 extern Monitor* RedefineClasses_lock;            // locks classes from parallel redefinition
       
   127 
       
   128 #if INCLUDE_TRACE
       
   129 extern Mutex*   JfrStacktrace_lock;              // used to guard access to the JFR stacktrace table
       
   130 extern Monitor* JfrMsg_lock;                     // protects JFR messaging
       
   131 extern Mutex*   JfrBuffer_lock;                  // protects JFR buffer operations
       
   132 extern Mutex*   JfrStream_lock;                  // protects JFR stream access
       
   133 extern Mutex*   JfrThreadGroups_lock;            // protects JFR access to Thread Groups
       
   134 #endif
       
   135 
       
   136 #ifndef SUPPORTS_NATIVE_CX8
       
   137 extern Mutex*   UnsafeJlong_lock;                // provides Unsafe atomic updates to jlongs on platforms that don't support cx8
       
   138 #endif
       
   139 
       
   140 // A MutexLocker provides mutual exclusion with respect to a given mutex
       
   141 // for the scope which contains the locker.  The lock is an OS lock, not
       
   142 // an object lock, and the two do not interoperate.  Do not use Mutex-based
       
   143 // locks to lock on Java objects, because they will not be respected if a
       
   144 // that object is locked using the Java locking mechanism.
       
   145 //
       
   146 //                NOTE WELL!!
       
   147 //
       
   148 // See orderAccess.hpp.  We assume throughout the VM that MutexLocker's
       
   149 // and friends constructors do a fence, a lock and an acquire *in that
       
   150 // order*.  And that their destructors do a release and unlock, in *that*
       
   151 // order.  If their implementations change such that these assumptions
       
   152 // are violated, a whole lot of code will break.
       
   153 
       
   154 // Print all mutexes/monitors that are currently owned by a thread; called
       
   155 // by fatal error handler.
       
   156 void print_owned_locks_on_error(outputStream* st);
       
   157 
       
   158 char *lock_name(Mutex *mutex);
       
   159 
       
   160 class MutexLocker: StackObj {
       
   161  private:
       
   162   Monitor * _mutex;
       
   163  public:
       
   164   MutexLocker(Monitor * mutex) {
       
   165     assert(mutex->rank() != Mutex::special,
       
   166       "Special ranked mutex should only use MutexLockerEx");
       
   167     _mutex = mutex;
       
   168     _mutex->lock();
       
   169   }
       
   170 
       
   171   // Overloaded constructor passing current thread
       
   172   MutexLocker(Monitor * mutex, Thread *thread) {
       
   173     assert(mutex->rank() != Mutex::special,
       
   174       "Special ranked mutex should only use MutexLockerEx");
       
   175     _mutex = mutex;
       
   176     _mutex->lock(thread);
       
   177   }
       
   178 
       
   179   ~MutexLocker() {
       
   180     _mutex->unlock();
       
   181   }
       
   182 
       
   183 };
       
   184 
       
   185 // for debugging: check that we're already owning this lock (or are at a safepoint)
       
   186 #ifdef ASSERT
       
   187 void assert_locked_or_safepoint(const Monitor * lock);
       
   188 void assert_lock_strong(const Monitor * lock);
       
   189 #else
       
   190 #define assert_locked_or_safepoint(lock)
       
   191 #define assert_lock_strong(lock)
       
   192 #endif
       
   193 
       
   194 // A MutexLockerEx behaves like a MutexLocker when its constructor is
       
   195 // called with a Mutex.  Unlike a MutexLocker, its constructor can also be
       
   196 // called with NULL, in which case the MutexLockerEx is a no-op.  There
       
   197 // is also a corresponding MutexUnlockerEx.  We want to keep the
       
   198 // basic MutexLocker as fast as possible.  MutexLockerEx can also lock
       
   199 // without safepoint check.
       
   200 
       
   201 class MutexLockerEx: public StackObj {
       
   202  private:
       
   203   Monitor * _mutex;
       
   204  public:
       
   205   MutexLockerEx(Monitor * mutex, bool no_safepoint_check = !Mutex::_no_safepoint_check_flag) {
       
   206     _mutex = mutex;
       
   207     if (_mutex != NULL) {
       
   208       assert(mutex->rank() > Mutex::special || no_safepoint_check,
       
   209         "Mutexes with rank special or lower should not do safepoint checks");
       
   210       if (no_safepoint_check)
       
   211         _mutex->lock_without_safepoint_check();
       
   212       else
       
   213         _mutex->lock();
       
   214     }
       
   215   }
       
   216 
       
   217   ~MutexLockerEx() {
       
   218     if (_mutex != NULL) {
       
   219       _mutex->unlock();
       
   220     }
       
   221   }
       
   222 };
       
   223 
       
   224 // A MonitorLockerEx is like a MutexLockerEx above, except it takes
       
   225 // a possibly null Monitor, and allows wait/notify as well which are
       
   226 // delegated to the underlying Monitor.
       
   227 
       
   228 class MonitorLockerEx: public MutexLockerEx {
       
   229  private:
       
   230   Monitor * _monitor;
       
   231  public:
       
   232   MonitorLockerEx(Monitor* monitor,
       
   233                   bool no_safepoint_check = !Mutex::_no_safepoint_check_flag):
       
   234     MutexLockerEx(monitor, no_safepoint_check),
       
   235     _monitor(monitor) {
       
   236     // Superclass constructor did locking
       
   237   }
       
   238 
       
   239   ~MonitorLockerEx() {
       
   240     #ifdef ASSERT
       
   241       if (_monitor != NULL) {
       
   242         assert_lock_strong(_monitor);
       
   243       }
       
   244     #endif  // ASSERT
       
   245     // Superclass destructor will do unlocking
       
   246   }
       
   247 
       
   248   bool wait(bool no_safepoint_check = !Mutex::_no_safepoint_check_flag,
       
   249             long timeout = 0,
       
   250             bool as_suspend_equivalent = !Mutex::_as_suspend_equivalent_flag) {
       
   251     if (_monitor != NULL) {
       
   252       return _monitor->wait(no_safepoint_check, timeout, as_suspend_equivalent);
       
   253     }
       
   254     return false;
       
   255   }
       
   256 
       
   257   bool notify_all() {
       
   258     if (_monitor != NULL) {
       
   259       return _monitor->notify_all();
       
   260     }
       
   261     return true;
       
   262   }
       
   263 
       
   264   bool notify() {
       
   265     if (_monitor != NULL) {
       
   266       return _monitor->notify();
       
   267     }
       
   268     return true;
       
   269   }
       
   270 };
       
   271 
       
   272 
       
   273 
       
   274 // A GCMutexLocker is usually initialized with a mutex that is
       
   275 // automatically acquired in order to do GC.  The function that
       
   276 // synchronizes using a GCMutexLocker may be called both during and between
       
   277 // GC's.  Thus, it must acquire the mutex if GC is not in progress, but not
       
   278 // if GC is in progress (since the mutex is already held on its behalf.)
       
   279 
       
   280 class GCMutexLocker: public StackObj {
       
   281 private:
       
   282   Monitor * _mutex;
       
   283   bool _locked;
       
   284 public:
       
   285   GCMutexLocker(Monitor * mutex);
       
   286   ~GCMutexLocker() { if (_locked) _mutex->unlock(); }
       
   287 };
       
   288 
       
   289 
       
   290 
       
   291 // A MutexUnlocker temporarily exits a previously
       
   292 // entered mutex for the scope which contains the unlocker.
       
   293 
       
   294 class MutexUnlocker: StackObj {
       
   295  private:
       
   296   Monitor * _mutex;
       
   297 
       
   298  public:
       
   299   MutexUnlocker(Monitor * mutex) {
       
   300     _mutex = mutex;
       
   301     _mutex->unlock();
       
   302   }
       
   303 
       
   304   ~MutexUnlocker() {
       
   305     _mutex->lock();
       
   306   }
       
   307 };
       
   308 
       
   309 // A MutexUnlockerEx temporarily exits a previously
       
   310 // entered mutex for the scope which contains the unlocker.
       
   311 
       
   312 class MutexUnlockerEx: StackObj {
       
   313  private:
       
   314   Monitor * _mutex;
       
   315   bool _no_safepoint_check;
       
   316 
       
   317  public:
       
   318   MutexUnlockerEx(Monitor * mutex, bool no_safepoint_check = !Mutex::_no_safepoint_check_flag) {
       
   319     _mutex = mutex;
       
   320     _no_safepoint_check = no_safepoint_check;
       
   321     _mutex->unlock();
       
   322   }
       
   323 
       
   324   ~MutexUnlockerEx() {
       
   325     if (_no_safepoint_check == Mutex::_no_safepoint_check_flag) {
       
   326       _mutex->lock_without_safepoint_check();
       
   327     } else {
       
   328       _mutex->lock();
       
   329     }
       
   330   }
       
   331 };
       
   332 
       
   333 #ifndef PRODUCT
       
   334 //
       
   335 // A special MutexLocker that allows:
       
   336 //   - reentrant locking
       
   337 //   - locking out of order
       
   338 //
       
   339 // Only to be used for verify code, where we can relax out dead-lock
       
   340 // detection code a bit (unsafe, but probably ok). This code is NEVER to
       
   341 // be included in a product version.
       
   342 //
       
   343 class VerifyMutexLocker: StackObj {
       
   344  private:
       
   345   Monitor * _mutex;
       
   346   bool   _reentrant;
       
   347  public:
       
   348   VerifyMutexLocker(Monitor * mutex) {
       
   349     _mutex     = mutex;
       
   350     _reentrant = mutex->owned_by_self();
       
   351     if (!_reentrant) {
       
   352       // We temp. disable strict safepoint checking, while we require the lock
       
   353       FlagSetting fs(StrictSafepointChecks, false);
       
   354       _mutex->lock();
       
   355     }
       
   356   }
       
   357 
       
   358   ~VerifyMutexLocker() {
       
   359     if (!_reentrant) {
       
   360       _mutex->unlock();
       
   361     }
       
   362   }
       
   363 };
       
   364 
       
   365 #endif
       
   366 
       
   367 #endif // SHARE_VM_RUNTIME_MUTEXLOCKER_HPP