hotspot/src/share/vm/runtime/mutexLocker.cpp
author tonyp
Wed, 25 Jan 2012 12:58:23 -0500
changeset 11584 e1df4d08a1f4
parent 10565 dc90c239f4ec
child 11587 16b0200f252d
permissions -rw-r--r--
7127706: G1: re-enable survivors during the initial-mark pause Summary: Re-enable survivors during the initial-mark pause. Afterwards, the concurrent marking threads have to scan them and mark everything reachable from them. The next GC will have to wait for the survivors to be scanned. Reviewed-by: brutisso, johnc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 10565
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    26
#include "runtime/mutexLocker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    27
#include "runtime/safepoint.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    28
#include "runtime/threadLocalStorage.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    29
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    30
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    31
# include "thread_linux.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    32
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    33
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    34
# include "thread_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    35
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    36
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    37
# include "thread_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6058
diff changeset
    38
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8110
diff changeset
    39
#ifdef TARGET_OS_FAMILY_bsd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8110
diff changeset
    40
# include "thread_bsd.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8110
diff changeset
    41
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// Mutexes used in the VM (see comment in mutexLocker.hpp):
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// Note that the following pointers are effectively final -- after having been
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// set at JVM startup-time, they should never be subsequently mutated.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
// Instead of using pointers to malloc()ed monitors and mutexes we should consider
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
// eliminating the indirection and using instances instead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
// Consider using GCC's __read_mostly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
Mutex*   Patching_lock                = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
Monitor* SystemDictionary_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
Mutex*   PackageTable_lock            = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
Mutex*   CompiledIC_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
Mutex*   InlineCacheBuffer_lock       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
Mutex*   VMStatistic_lock             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
Mutex*   JNIGlobalHandle_lock         = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
Mutex*   JNIHandleBlockFreeList_lock  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
Mutex*   JNICachedItableIndex_lock    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
Mutex*   JmethodIdCreation_lock       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
Mutex*   JfieldIdCreation_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
Monitor* JNICritical_lock             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
Mutex*   JvmtiThreadState_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
Monitor* JvmtiPendingEvent_lock       = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    65
Monitor* Heap_lock                    = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
Mutex*   ExpandHeap_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
Mutex*   AdapterHandlerLibrary_lock   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
Mutex*   SignatureHandlerLibrary_lock = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
Mutex*   VtableStubs_lock             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
Mutex*   SymbolTable_lock             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
Mutex*   StringTable_lock             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
Mutex*   CodeCache_lock               = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
Mutex*   MethodData_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
Mutex*   RetData_lock                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
Monitor* VMOperationQueue_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
Monitor* VMOperationRequest_lock      = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
Monitor* Safepoint_lock               = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
Monitor* SerializePage_lock           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
Monitor* Threads_lock                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
Monitor* CGC_lock                     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
Mutex*   STS_init_lock                = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
Monitor* SLT_lock                     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
Monitor* iCMS_lock                    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
Monitor* FullGCCount_lock             = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    85
Monitor* CMark_lock                   = NULL;
5242
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 3261
diff changeset
    86
Mutex*   CMRegionStack_lock           = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    87
Mutex*   SATB_Q_FL_lock               = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    88
Monitor* SATB_Q_CBL_mon               = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    89
Mutex*   Shared_SATB_Q_lock           = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    90
Mutex*   DirtyCardQ_FL_lock           = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    91
Monitor* DirtyCardQ_CBL_mon           = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    92
Mutex*   Shared_DirtyCardQ_lock       = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
Mutex*   ParGCRareEvent_lock          = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    94
Mutex*   EvacFailureStack_lock        = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
Mutex*   DerivedPointerTableGC_lock   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
Mutex*   Compile_lock                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
Monitor* MethodCompileQueue_lock      = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
Monitor* CompileThread_lock           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
Mutex*   CompileTaskAlloc_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
Mutex*   CompileStatistics_lock       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
Mutex*   MultiArray_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
Monitor* Terminator_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
Monitor* BeforeExit_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
Monitor* Notify_lock                  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
Monitor* Interrupt_lock               = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
Monitor* ProfileVM_lock               = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
Mutex*   ProfilePrint_lock            = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
Mutex*   ExceptionCache_lock          = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
Monitor* ObjAllocPost_lock            = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
Mutex*   OsrList_lock                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
Mutex*   FullGCALot_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
Mutex*   Debug1_lock                  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
Mutex*   Debug2_lock                  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
Mutex*   Debug3_lock                  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
Mutex*   tty_lock                     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
Mutex*   RawMonitor_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
Mutex*   PerfDataMemAlloc_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
Mutex*   PerfDataManager_lock         = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
Mutex*   OopMapCacheAlloc_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   126
Mutex*   FreeList_lock                = NULL;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   127
Monitor* SecondaryFreeList_lock       = NULL;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   128
Mutex*   OldSets_lock                 = NULL;
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 10565
diff changeset
   129
Monitor* RootRegionScan_lock          = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   130
Mutex*   MMUTracker_lock              = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   131
Mutex*   HotCardCache_lock            = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   132
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
Monitor* GCTaskManager_lock           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
Mutex*   Management_lock              = NULL;
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 10565
diff changeset
   136
Monitor* Service_lock                 = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
#define MAX_NUM_MUTEX 128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
static Monitor * _mutex_array[MAX_NUM_MUTEX];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
static int _num_mutex;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
void assert_locked_or_safepoint(const Monitor * lock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  // check if this thread owns the lock (common case)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  if (IgnoreLockingAssertions) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  assert(lock != NULL, "Need non-NULL lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  if (lock->owned_by_self()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  if (SafepointSynchronize::is_at_safepoint()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  if (!Universe::is_fully_initialized()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // see if invoker of VM operation owns it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  VM_Operation* op = VMThread::vm_operation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  if (op != NULL && op->calling_thread() == lock->owner()) return;
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5242
diff changeset
   153
  fatal(err_msg("must own lock %s", lock->name()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
// a stronger assertion than the above
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
void assert_lock_strong(const Monitor * lock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  if (IgnoreLockingAssertions) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  assert(lock != NULL, "Need non-NULL lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  if (lock->owned_by_self()) return;
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5242
diff changeset
   161
  fatal(err_msg("must own lock %s", lock->name()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
#define def(var, type, pri, vm_block) {                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  var = new type(Mutex::pri, #var, vm_block);                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  assert(_num_mutex < MAX_NUM_MUTEX,                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
                    "increase MAX_NUM_MUTEX");                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  _mutex_array[_num_mutex++] = var;                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
void mutex_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  def(tty_lock                     , Mutex  , event,       true ); // allow to lock in VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  def(CGC_lock                   , Monitor, special,     true ); // coordinate between fore- and background GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  def(STS_init_lock              , Mutex,   leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  if (UseConcMarkSweepGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    def(iCMS_lock                  , Monitor, special,     true ); // CMS incremental mode start/stop notification
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5707
diff changeset
   179
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5707
diff changeset
   180
  if (UseConcMarkSweepGC || UseG1GC) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    def(FullGCCount_lock           , Monitor, leaf,        true ); // in support of ExplicitGCInvokesConcurrent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   183
  if (UseG1GC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   184
    def(CMark_lock                 , Monitor, nonleaf,     true ); // coordinate concurrent mark thread
5242
85cf92183e39 6940310: G1: MT-unsafe calls to CM::region_stack_push() / CM::region_stack_pop()
tonyp
parents: 3261
diff changeset
   185
    def(CMRegionStack_lock         , Mutex,   leaf,        true );
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   186
    def(SATB_Q_FL_lock             , Mutex  , special,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   187
    def(SATB_Q_CBL_mon             , Monitor, nonleaf,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   188
    def(Shared_SATB_Q_lock         , Mutex,   nonleaf,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   189
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   190
    def(DirtyCardQ_FL_lock         , Mutex  , special,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   191
    def(DirtyCardQ_CBL_mon         , Monitor, nonleaf,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   192
    def(Shared_DirtyCardQ_lock     , Mutex,   nonleaf,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   193
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   194
    def(FreeList_lock              , Mutex,   leaf     ,   true );
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   195
    def(SecondaryFreeList_lock     , Monitor, leaf     ,   true );
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   196
    def(OldSets_lock               , Mutex  , leaf     ,   true );
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 10565
diff changeset
   197
    def(RootRegionScan_lock        , Monitor, leaf     ,   true );
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   198
    def(MMUTracker_lock            , Mutex  , leaf     ,   true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   199
    def(HotCardCache_lock          , Mutex  , special  ,   true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   200
    def(EvacFailureStack_lock      , Mutex  , nonleaf  ,   true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   201
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  def(ParGCRareEvent_lock          , Mutex  , leaf     ,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  def(DerivedPointerTableGC_lock   , Mutex,   leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  def(CodeCache_lock               , Mutex  , special,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  def(Interrupt_lock               , Monitor, special,     true ); // used for interrupt processing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  def(RawMonitor_lock              , Mutex,   special,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  def(OopMapCacheAlloc_lock        , Mutex,   leaf,        true ); // used for oop_map_cache allocation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  def(Patching_lock                , Mutex  , special,     true ); // used for safepointing and code patching.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  def(ObjAllocPost_lock            , Monitor, special,     false);
8110
c992c8d52344 6766644: Redefinition of compiled method fails with assertion "Can not load classes with the Compiler thread"
kamg
parents: 7923
diff changeset
   211
  def(Service_lock                 , Monitor, special,     true ); // used for service thread operations
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  def(JmethodIdCreation_lock       , Mutex  , leaf,        true ); // used for creating jmethodIDs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  def(SystemDictionary_lock        , Monitor, leaf,        true ); // lookups done by VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  def(PackageTable_lock            , Mutex  , leaf,        false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  def(InlineCacheBuffer_lock       , Mutex  , leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  def(VMStatistic_lock             , Mutex  , leaf,        false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  def(ExpandHeap_lock              , Mutex  , leaf,        true ); // Used during compilation by VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  def(JNIHandleBlockFreeList_lock  , Mutex  , leaf,        true ); // handles are used by VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  def(SignatureHandlerLibrary_lock , Mutex  , leaf,        false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  def(SymbolTable_lock             , Mutex  , leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  def(StringTable_lock             , Mutex  , leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  def(ProfilePrint_lock            , Mutex  , leaf,        false); // serial profile printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  def(ExceptionCache_lock          , Mutex  , leaf,        false); // serial profile printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  def(OsrList_lock                 , Mutex  , leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  def(Debug1_lock                  , Mutex  , leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  def(FullGCALot_lock              , Mutex  , leaf,        false); // a lock to make FullGCALot MT safe
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  def(BeforeExit_lock              , Monitor, leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  def(PerfDataMemAlloc_lock        , Mutex  , leaf,        true ); // used for allocating PerfData memory for performance data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  def(PerfDataManager_lock         , Mutex  , leaf,        true ); // used for synchronized access to PerfDataManager resources
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // CMS_modUnionTable_lock                   leaf
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // CMS_bitMap_lock                          leaf + 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  // CMS_freeList_lock                        leaf + 2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  def(Safepoint_lock               , Monitor, safepoint,   true ); // locks SnippetCache_lock/Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  def(Threads_lock                 , Monitor, barrier,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  def(VMOperationQueue_lock        , Monitor, nonleaf,     true ); // VM_thread allowed to block on these
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  def(VMOperationRequest_lock      , Monitor, nonleaf,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  def(RetData_lock                 , Mutex  , nonleaf,     false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  def(Terminator_lock              , Monitor, nonleaf,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  def(VtableStubs_lock             , Mutex  , nonleaf,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  def(Notify_lock                  , Monitor, nonleaf,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  def(JNIGlobalHandle_lock         , Mutex  , nonleaf,     true ); // locks JNIHandleBlockFreeList_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  def(JNICritical_lock             , Monitor, nonleaf,     true ); // used for JNI critical regions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  def(AdapterHandlerLibrary_lock   , Mutex  , nonleaf,     true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  if (UseConcMarkSweepGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
    def(SLT_lock                   , Monitor, nonleaf,     false );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
                    // used in CMS GC for locking PLL lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   255
  def(Heap_lock                    , Monitor, nonleaf+1,   false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  def(JfieldIdCreation_lock        , Mutex  , nonleaf+1,   true ); // jfieldID, Used in VM_Operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  def(JNICachedItableIndex_lock    , Mutex  , nonleaf+1,   false); // Used to cache an itable index during JNI invoke
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  def(CompiledIC_lock              , Mutex  , nonleaf+2,   false); // locks VtableStubs_lock, InlineCacheBuffer_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  def(CompileTaskAlloc_lock        , Mutex  , nonleaf+2,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  def(CompileStatistics_lock       , Mutex  , nonleaf+2,   false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  def(MultiArray_lock              , Mutex  , nonleaf+2,   false); // locks SymbolTable_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  def(JvmtiThreadState_lock        , Mutex  , nonleaf+2,   false); // Used by JvmtiThreadState/JvmtiEventController
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  def(JvmtiPendingEvent_lock       , Monitor, nonleaf,     false); // Used by JvmtiCodeBlobEvents
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  def(Management_lock              , Mutex  , nonleaf+2,   false); // used for JVM management
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  def(Compile_lock                 , Mutex  , nonleaf+3,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  def(MethodData_lock              , Mutex  , nonleaf+3,   false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  def(MethodCompileQueue_lock      , Monitor, nonleaf+4,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  def(Debug2_lock                  , Mutex  , nonleaf+4,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  def(Debug3_lock                  , Mutex  , nonleaf+4,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  def(ProfileVM_lock               , Monitor, nonleaf+4,   false); // used for profiling of the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  def(CompileThread_lock           , Monitor, nonleaf+5,   false );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
GCMutexLocker::GCMutexLocker(Monitor * mutex) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  if (SafepointSynchronize::is_at_safepoint()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    _locked = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    _mutex = mutex;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    _locked = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    _mutex->lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
// Print all mutexes/monitors that are currently owned by a thread; called
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
// by fatal error handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
void print_owned_locks_on_error(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  st->print("VM Mutex/Monitor currently owned by a thread: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  bool none = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  for (int i = 0; i < _num_mutex; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
     // see if it has an owner
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
     if (_mutex_array[i]->owner() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
       if (none) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
          // print format used by Mutex::print_on_error()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
          st->print_cr(" ([mutex/lock_event])");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
          none = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
       _mutex_array[i]->print_on_error(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  if (none) st->print_cr("None");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
}