hotspot/src/share/vm/runtime/mutexLocker.cpp
author tonyp
Wed, 19 Jan 2011 19:30:42 -0500
changeset 7923 fc200fcd4e05
parent 7397 5b173b4ca846
child 8110 c992c8d52344
permissions -rw-r--r--
6977804: G1: remove the zero-filling thread Summary: This changeset removes the zero-filling thread from G1 and collapses the two free region lists we had before (the "free" and "unclean" lists) into one. The new free list uses the new heap region sets / lists abstractions that we'll ultimately use it to keep track of all regions in the heap. A heap region set was also introduced for the humongous regions. Finally, this change increases the concurrency between the thread that completes freeing regions (after a cleanup pause) and the rest of the system (before we'd have to wait for said thread to complete before allocating a new region). The changest also includes a lot of refactoring and code simplification. Reviewed-by: jcoomes, johnc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
     2
 * Copyright (c) 1997, 2011, 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
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// Mutexes used in the VM (see comment in mutexLocker.hpp):
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// Note that the following pointers are effectively final -- after having been
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// set at JVM startup-time, they should never be subsequently mutated.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// Instead of using pointers to malloc()ed monitors and mutexes we should consider
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// eliminating the indirection and using instances instead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// Consider using GCC's __read_mostly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
Mutex*   Patching_lock                = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
Monitor* SystemDictionary_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
Mutex*   PackageTable_lock            = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
Mutex*   CompiledIC_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
Mutex*   InlineCacheBuffer_lock       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
Mutex*   VMStatistic_lock             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
Mutex*   JNIGlobalHandle_lock         = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
Mutex*   JNIHandleBlockFreeList_lock  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
Mutex*   JNICachedItableIndex_lock    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
Mutex*   JmethodIdCreation_lock       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
Mutex*   JfieldIdCreation_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
Monitor* JNICritical_lock             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
Mutex*   JvmtiThreadState_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
Monitor* JvmtiPendingEvent_lock       = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    62
Monitor* Heap_lock                    = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
Mutex*   ExpandHeap_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
Mutex*   AdapterHandlerLibrary_lock   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
Mutex*   SignatureHandlerLibrary_lock = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
Mutex*   VtableStubs_lock             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
Mutex*   SymbolTable_lock             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
Mutex*   StringTable_lock             = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
Mutex*   CodeCache_lock               = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
Mutex*   MethodData_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
Mutex*   RetData_lock                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
Monitor* VMOperationQueue_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
Monitor* VMOperationRequest_lock      = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
Monitor* Safepoint_lock               = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
Monitor* SerializePage_lock           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
Monitor* Threads_lock                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
Monitor* CGC_lock                     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
Mutex*   STS_init_lock                = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
Monitor* SLT_lock                     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
Monitor* iCMS_lock                    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
Monitor* FullGCCount_lock             = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    82
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
    83
Mutex*   CMRegionStack_lock           = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    84
Mutex*   SATB_Q_FL_lock               = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    85
Monitor* SATB_Q_CBL_mon               = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    86
Mutex*   Shared_SATB_Q_lock           = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    87
Mutex*   DirtyCardQ_FL_lock           = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    88
Monitor* DirtyCardQ_CBL_mon           = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    89
Mutex*   Shared_DirtyCardQ_lock       = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
Mutex*   ParGCRareEvent_lock          = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
    91
Mutex*   EvacFailureStack_lock        = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
Mutex*   DerivedPointerTableGC_lock   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
Mutex*   Compile_lock                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
Monitor* MethodCompileQueue_lock      = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
Monitor* CompileThread_lock           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
Mutex*   CompileTaskAlloc_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
Mutex*   CompileStatistics_lock       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
Mutex*   MultiArray_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
Monitor* Terminator_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
Monitor* BeforeExit_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
Monitor* Notify_lock                  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
Monitor* Interrupt_lock               = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
Monitor* ProfileVM_lock               = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
Mutex*   ProfilePrint_lock            = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
Mutex*   ExceptionCache_lock          = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
Monitor* ObjAllocPost_lock            = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
Mutex*   OsrList_lock                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
Mutex*   FullGCALot_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
Mutex*   Debug1_lock                  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
Mutex*   Debug2_lock                  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
Mutex*   Debug3_lock                  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
Mutex*   tty_lock                     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
Mutex*   RawMonitor_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
Mutex*   PerfDataMemAlloc_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
Mutex*   PerfDataManager_lock         = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
Mutex*   OopMapCacheAlloc_lock        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   123
Mutex*   FreeList_lock                = NULL;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   124
Monitor* SecondaryFreeList_lock       = NULL;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   125
Mutex*   OldSets_lock                 = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   126
Mutex*   MMUTracker_lock              = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   127
Mutex*   HotCardCache_lock            = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   128
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
Monitor* GCTaskManager_lock           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
Mutex*   Management_lock              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
Monitor* LowMemory_lock               = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
#define MAX_NUM_MUTEX 128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
static Monitor * _mutex_array[MAX_NUM_MUTEX];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
static int _num_mutex;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
void assert_locked_or_safepoint(const Monitor * lock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  // check if this thread owns the lock (common case)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  if (IgnoreLockingAssertions) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  assert(lock != NULL, "Need non-NULL lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  if (lock->owned_by_self()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  if (SafepointSynchronize::is_at_safepoint()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  if (!Universe::is_fully_initialized()) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  // see if invoker of VM operation owns it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  VM_Operation* op = VMThread::vm_operation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  if (op != NULL && op->calling_thread() == lock->owner()) return;
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5242
diff changeset
   149
  fatal(err_msg("must own lock %s", lock->name()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
// a stronger assertion than the above
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
void assert_lock_strong(const Monitor * lock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  if (IgnoreLockingAssertions) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  assert(lock != NULL, "Need non-NULL lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  if (lock->owned_by_self()) return;
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5242
diff changeset
   157
  fatal(err_msg("must own lock %s", lock->name()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
#define def(var, type, pri, vm_block) {                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  var = new type(Mutex::pri, #var, vm_block);                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  assert(_num_mutex < MAX_NUM_MUTEX,                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
                    "increase MAX_NUM_MUTEX");                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  _mutex_array[_num_mutex++] = var;                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
void mutex_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  def(tty_lock                     , Mutex  , event,       true ); // allow to lock in VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  def(CGC_lock                   , Monitor, special,     true ); // coordinate between fore- and background GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  def(STS_init_lock              , Mutex,   leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  if (UseConcMarkSweepGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    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
   175
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5707
diff changeset
   176
  if (UseConcMarkSweepGC || UseG1GC) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
    def(FullGCCount_lock           , Monitor, leaf,        true ); // in support of ExplicitGCInvokesConcurrent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   179
  if (UseG1GC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   180
    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
   181
    def(CMRegionStack_lock         , Mutex,   leaf,        true );
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   182
    def(SATB_Q_FL_lock             , Mutex  , special,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   183
    def(SATB_Q_CBL_mon             , Monitor, nonleaf,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   184
    def(Shared_SATB_Q_lock         , Mutex,   nonleaf,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   185
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   186
    def(DirtyCardQ_FL_lock         , Mutex  , special,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   187
    def(DirtyCardQ_CBL_mon         , Monitor, nonleaf,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   188
    def(Shared_DirtyCardQ_lock     , Mutex,   nonleaf,     true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   189
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   190
    def(FreeList_lock              , Mutex,   leaf     ,   true );
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   191
    def(SecondaryFreeList_lock     , Monitor, leaf     ,   true );
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7397
diff changeset
   192
    def(OldSets_lock               , Mutex  , leaf     ,   true );
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   193
    def(MMUTracker_lock            , Mutex  , leaf     ,   true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   194
    def(HotCardCache_lock          , Mutex  , special  ,   true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   195
    def(EvacFailureStack_lock      , Mutex  , nonleaf  ,   true );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   196
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  def(ParGCRareEvent_lock          , Mutex  , leaf     ,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  def(DerivedPointerTableGC_lock   , Mutex,   leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  def(CodeCache_lock               , Mutex  , special,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  def(Interrupt_lock               , Monitor, special,     true ); // used for interrupt processing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  def(RawMonitor_lock              , Mutex,   special,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  def(OopMapCacheAlloc_lock        , Mutex,   leaf,        true ); // used for oop_map_cache allocation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  def(Patching_lock                , Mutex  , special,     true ); // used for safepointing and code patching.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  def(ObjAllocPost_lock            , Monitor, special,     false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  def(LowMemory_lock               , Monitor, special,     true ); // used for low memory detection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  def(JmethodIdCreation_lock       , Mutex  , leaf,        true ); // used for creating jmethodIDs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  def(SystemDictionary_lock        , Monitor, leaf,        true ); // lookups done by VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  def(PackageTable_lock            , Mutex  , leaf,        false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  def(InlineCacheBuffer_lock       , Mutex  , leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  def(VMStatistic_lock             , Mutex  , leaf,        false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  def(ExpandHeap_lock              , Mutex  , leaf,        true ); // Used during compilation by VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  def(JNIHandleBlockFreeList_lock  , Mutex  , leaf,        true ); // handles are used by VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  def(SignatureHandlerLibrary_lock , Mutex  , leaf,        false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  def(SymbolTable_lock             , Mutex  , leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  def(StringTable_lock             , Mutex  , leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  def(ProfilePrint_lock            , Mutex  , leaf,        false); // serial profile printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  def(ExceptionCache_lock          , Mutex  , leaf,        false); // serial profile printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  def(OsrList_lock                 , Mutex  , leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  def(Debug1_lock                  , Mutex  , leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  def(FullGCALot_lock              , Mutex  , leaf,        false); // a lock to make FullGCALot MT safe
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  def(BeforeExit_lock              , Monitor, leaf,        true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  def(PerfDataMemAlloc_lock        , Mutex  , leaf,        true ); // used for allocating PerfData memory for performance data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  def(PerfDataManager_lock         , Mutex  , leaf,        true ); // used for synchronized access to PerfDataManager resources
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // CMS_modUnionTable_lock                   leaf
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // CMS_bitMap_lock                          leaf + 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  // CMS_freeList_lock                        leaf + 2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  def(Safepoint_lock               , Monitor, safepoint,   true ); // locks SnippetCache_lock/Threads_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  def(Threads_lock                 , Monitor, barrier,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  def(VMOperationQueue_lock        , Monitor, nonleaf,     true ); // VM_thread allowed to block on these
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  def(VMOperationRequest_lock      , Monitor, nonleaf,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  def(RetData_lock                 , Mutex  , nonleaf,     false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  def(Terminator_lock              , Monitor, nonleaf,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  def(VtableStubs_lock             , Mutex  , nonleaf,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  def(Notify_lock                  , Monitor, nonleaf,     true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  def(JNIGlobalHandle_lock         , Mutex  , nonleaf,     true ); // locks JNIHandleBlockFreeList_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  def(JNICritical_lock             , Monitor, nonleaf,     true ); // used for JNI critical regions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  def(AdapterHandlerLibrary_lock   , Mutex  , nonleaf,     true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  if (UseConcMarkSweepGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    def(SLT_lock                   , Monitor, nonleaf,     false );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
                    // used in CMS GC for locking PLL lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 228
diff changeset
   250
  def(Heap_lock                    , Monitor, nonleaf+1,   false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  def(JfieldIdCreation_lock        , Mutex  , nonleaf+1,   true ); // jfieldID, Used in VM_Operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  def(JNICachedItableIndex_lock    , Mutex  , nonleaf+1,   false); // Used to cache an itable index during JNI invoke
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  def(CompiledIC_lock              , Mutex  , nonleaf+2,   false); // locks VtableStubs_lock, InlineCacheBuffer_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  def(CompileTaskAlloc_lock        , Mutex  , nonleaf+2,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  def(CompileStatistics_lock       , Mutex  , nonleaf+2,   false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  def(MultiArray_lock              , Mutex  , nonleaf+2,   false); // locks SymbolTable_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  def(JvmtiThreadState_lock        , Mutex  , nonleaf+2,   false); // Used by JvmtiThreadState/JvmtiEventController
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  def(JvmtiPendingEvent_lock       , Monitor, nonleaf,     false); // Used by JvmtiCodeBlobEvents
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  def(Management_lock              , Mutex  , nonleaf+2,   false); // used for JVM management
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  def(Compile_lock                 , Mutex  , nonleaf+3,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  def(MethodData_lock              , Mutex  , nonleaf+3,   false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  def(MethodCompileQueue_lock      , Monitor, nonleaf+4,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  def(Debug2_lock                  , Mutex  , nonleaf+4,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  def(Debug3_lock                  , Mutex  , nonleaf+4,   true );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  def(ProfileVM_lock               , Monitor, nonleaf+4,   false); // used for profiling of the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  def(CompileThread_lock           , Monitor, nonleaf+5,   false );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
GCMutexLocker::GCMutexLocker(Monitor * mutex) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  if (SafepointSynchronize::is_at_safepoint()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    _locked = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    _mutex = mutex;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    _locked = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    _mutex->lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
// Print all mutexes/monitors that are currently owned by a thread; called
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
// by fatal error handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
void print_owned_locks_on_error(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  st->print("VM Mutex/Monitor currently owned by a thread: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  bool none = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  for (int i = 0; i < _num_mutex; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
     // see if it has an owner
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
     if (_mutex_array[i]->owner() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
       if (none) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
          // print format used by Mutex::print_on_error()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
          st->print_cr(" ([mutex/lock_event])");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
          none = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
       _mutex_array[i]->print_on_error(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  if (none) st->print_cr("None");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
}