hotspot/src/share/vm/runtime/objectMonitor.hpp
author dcubed
Tue, 14 Jul 2015 09:33:20 -0700
changeset 31782 b23b74f8ae8d
parent 27880 afb974a04396
child 31856 614d6786ba55
permissions -rw-r--r--
8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392 Reviewed-by: dholmes, coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
31782
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
     2
 * Copyright (c) 1998, 2015, 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: 1
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
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: 1
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: 6975
diff changeset
    25
#ifndef SHARE_VM_RUNTIME_OBJECTMONITOR_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    26
#define SHARE_VM_RUNTIME_OBJECTMONITOR_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    27
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    28
#include "memory/padded.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    29
#include "runtime/os.hpp"
7408
c04a5c989f26 7003125: precompiled.hpp is included when precompiled headers are not used
stefank
parents: 7397
diff changeset
    30
#include "runtime/park.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    31
#include "runtime/perfData.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    32
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    33
// ObjectWaiter serves as a "proxy" or surrogate thread.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    34
// TODO-FIXME: Eliminate ObjectWaiter and use the thread-specific
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    35
// ParkEvent instead.  Beware, however, that the JVMTI code
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    36
// knows about ObjectWaiters, so we'll have to reconcile that code.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    37
// See next_waiter(), first_waiter(), etc.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    38
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    39
class ObjectWaiter : public StackObj {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    40
 public:
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    41
  enum TStates { TS_UNDEF, TS_READY, TS_RUN, TS_WAIT, TS_ENTER, TS_CXQ };
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    42
  enum Sorted  { PREPEND, APPEND, SORTED };
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    43
  ObjectWaiter * volatile _next;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    44
  ObjectWaiter * volatile _prev;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    45
  Thread*       _thread;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
    46
  jlong         _notifier_tid;
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    47
  ParkEvent *   _event;
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    48
  volatile int  _notified;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    49
  volatile TStates TState;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    50
  Sorted        _Sorted;           // List placement disposition
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    51
  bool          _active;           // Contention monitoring is enabled
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    52
 public:
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    53
  ObjectWaiter(Thread* thread);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    54
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    55
  void wait_reenter_begin(ObjectMonitor *mon);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    56
  void wait_reenter_end(ObjectMonitor *mon);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    57
};
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    58
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
    59
// forward declaration to avoid include tracing.hpp
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
    60
class EventJavaMonitorWait;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
    61
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    62
// The ObjectMonitor class implements the heavyweight version of a
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    63
// JavaMonitor. The lightweight BasicLock/stack lock version has been
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    64
// inflated into an ObjectMonitor. This inflation is typically due to
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    65
// contention or use of Object.wait().
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    66
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    67
// WARNING: This is a very sensitive and fragile class. DO NOT make any
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    68
// changes unless you are fully aware of the underlying semantics.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    69
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    70
// Class JvmtiRawMonitor currently inherits from ObjectMonitor so
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    71
// changes in this class must be careful to not break JvmtiRawMonitor.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    72
// These two subsystems should be separated.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    73
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    74
// ObjectMonitor Layout Overview/Highlights/Restrictions:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
//
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    76
// - The _header field must be at offset 0 because the displaced header
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    77
//   from markOop is stored there. We do not want markOop.hpp to include
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    78
//   ObjectMonitor.hpp to avoid exposing ObjectMonitor everywhere. This
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    79
//   means that ObjectMonitor cannot inherit from any other class nor can
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    80
//   it use any virtual member functions. This restriction is critical to
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    81
//   the proper functioning of the VM.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    82
// - The _header and _owner fields should be separated by enough space
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    83
//   to avoid false sharing due to parallel access by different threads.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    84
//   This is an advisory recommendation.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    85
// - The general layout of the fields in ObjectMonitor is:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    86
//     _header
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    87
//     <lightly_used_fields>
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    88
//     <optional padding>
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    89
//     _owner
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    90
//     <remaining_fields>
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    91
// - The VM assumes write ordering and machine word alignment with
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    92
//   respect to the _owner field and the <remaining_fields> that can
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    93
//   be read in parallel by other threads.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    94
// - Generally fields that are accessed closely together in time should
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    95
//   be placed proximally in space to promote data cache locality. That
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    96
//   is, temporal locality should condition spatial locality.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    97
// - We have to balance avoiding false sharing with excessive invalidation
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    98
//   from coherence traffic. As such, we try to cluster fields that tend
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    99
//   to be _written_ at approximately the same time onto the same data
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   100
//   cache line.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   101
// - We also have to balance the natural tension between minimizing
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   102
//   single threaded capacity misses with excessive multi-threaded
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   103
//   coherency misses. There is no single optimal layout for both
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   104
//   single-threaded and multi-threaded environments.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   105
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   106
// - See ObjectMonitor::sanity_checks() for how critical restrictions are
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   107
//   enforced and advisory recommendations are reported.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   108
// - Adjacent ObjectMonitors should be separated by enough space to avoid
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   109
//   false sharing. This is handled by the ObjectMonitor allocation code
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   110
//   in synchronizer.cpp. Also see ObjectSynchronizer::sanity_checks().
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   111
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   112
// Futures notes:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   113
//   - Separating _owner from the <remaining_fields> by enough space to
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   114
//     avoid false sharing might be profitable. Given
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   115
//     http://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   116
//     we know that the CAS in monitorenter will invalidate the line
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   117
//     underlying _owner. We want to avoid an L1 data cache miss on that
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   118
//     same line for monitorexit. Putting these <remaining_fields>:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   119
//     _recursions, _EntryList, _cxq, and _succ, all of which may be
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   120
//     fetched in the inflated unlock path, on a different cache line
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   121
//     would make them immune to CAS-based invalidation from the _owner
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   122
//     field.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   123
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   124
//   - The _recursions field should be of type int, or int32_t but not
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   125
//     intptr_t. There's no reason to use a 64-bit type for this field
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   126
//     in a 64-bit JVM.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
class ObjectMonitor {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    OM_OK,                    // no error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    OM_SYSTEM_ERROR,          // operating system error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    OM_ILLEGAL_MONITOR_STATE, // IllegalMonitorStateException
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    OM_INTERRUPTED,           // Thread.interrupt()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    OM_TIMED_OUT              // Object.wait() timed out
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   138
 private:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   139
  friend class ObjectSynchronizer;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   140
  friend class ObjectWaiter;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   141
  friend class VMStructs;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   142
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   143
  volatile markOop   _header;       // displaced object header word - mark
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   144
  void*     volatile _object;       // backward object pointer - strong root
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
 public:
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   146
  ObjectMonitor *    FreeNext;      // Free list linkage
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   147
 private:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   148
  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE,
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   149
                        sizeof(volatile markOop) + sizeof(void * volatile) +
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   150
                        sizeof(ObjectMonitor *));
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   151
 protected:                         // protected for JvmtiRawMonitor
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   152
  void *  volatile _owner;          // pointer to owning thread OR BasicLock
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   153
  volatile jlong _previous_owner_tid;  // thread id of the previous owner of the monitor
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   154
  volatile intptr_t  _recursions;   // recursion count, 0 for first entry
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   155
  ObjectWaiter * volatile _EntryList; // Threads blocked on entry or reentry.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   156
                                      // The list is actually composed of WaitNodes,
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   157
                                      // acting as proxies for Threads.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   158
 private:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   159
  ObjectWaiter * volatile _cxq;     // LL of recently-arrived threads blocked on entry.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   160
  Thread * volatile _succ;          // Heir presumptive thread - used for futile wakeup throttling
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   161
  Thread * volatile _Responsible;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   162
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   163
  volatile int _Spinner;            // for exit->spinner handoff optimization
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   164
  volatile int _SpinFreq;           // Spin 1-out-of-N attempts: success rate
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   165
  volatile int _SpinClock;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   166
  volatile intptr_t _SpinState;     // MCS/CLH list of spinners
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   167
  volatile int _SpinDuration;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   168
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   169
  volatile jint  _count;            // reference count to prevent reclamation/deflation
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   170
                                    // at stop-the-world time.  See deflate_idle_monitors().
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   171
                                    // _count is approximately |_WaitSet| + |_EntryList|
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   172
 protected:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   173
  ObjectWaiter * volatile _WaitSet; // LL of threads wait()ing on the monitor
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   174
  volatile jint  _waiters;          // number of waiting threads
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   175
 private:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   176
  volatile int _WaitSetLock;        // protects Wait Queue - simple spinlock
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   177
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   178
 public:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   179
  static void Initialize();
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   180
  static PerfCounter * _sync_ContendedLockAttempts;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   181
  static PerfCounter * _sync_FutileWakeups;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   182
  static PerfCounter * _sync_Parks;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   183
  static PerfCounter * _sync_EmptyNotifications;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   184
  static PerfCounter * _sync_Notifications;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   185
  static PerfCounter * _sync_SlowEnter;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   186
  static PerfCounter * _sync_SlowExit;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   187
  static PerfCounter * _sync_SlowNotify;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   188
  static PerfCounter * _sync_SlowNotifyAll;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   189
  static PerfCounter * _sync_FailedSpins;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   190
  static PerfCounter * _sync_SuccessfulSpins;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   191
  static PerfCounter * _sync_PrivateA;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   192
  static PerfCounter * _sync_PrivateB;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   193
  static PerfCounter * _sync_MonInCirculation;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   194
  static PerfCounter * _sync_MonScavenged;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   195
  static PerfCounter * _sync_Inflations;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   196
  static PerfCounter * _sync_Deflations;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   197
  static PerfLongVariable * _sync_MonExtant;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   198
31782
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   199
  static int Knob_ExitRelease;
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   200
  static int Knob_Verbose;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   201
  static int Knob_VerifyInUse;
31782
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   202
  static int Knob_VerifyMatch;
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   203
  static int Knob_SpinLimit;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   204
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   205
  void* operator new (size_t size) throw() {
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   206
    return AllocateHeap(size, mtInternal);
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   207
  }
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   208
  void* operator new[] (size_t size) throw() {
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   209
    return operator new (size);
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   210
  }
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   211
  void operator delete(void* p) {
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27608
diff changeset
   212
    FreeHeap(p);
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   213
  }
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   214
  void operator delete[] (void *p) {
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   215
    operator delete(p);
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   216
  }
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   217
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  // TODO-FIXME: the "offset" routines should return a type of off_t instead of int ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  // ByteSize would also be an appropriate type.
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   220
  static int header_offset_in_bytes()      { return offset_of(ObjectMonitor, _header); }
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   221
  static int object_offset_in_bytes()      { return offset_of(ObjectMonitor, _object); }
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   222
  static int owner_offset_in_bytes()       { return offset_of(ObjectMonitor, _owner); }
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   223
  static int count_offset_in_bytes()       { return offset_of(ObjectMonitor, _count); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  static int recursions_offset_in_bytes()  { return offset_of(ObjectMonitor, _recursions); }
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   225
  static int cxq_offset_in_bytes()         { return offset_of(ObjectMonitor, _cxq); }
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   226
  static int succ_offset_in_bytes()        { return offset_of(ObjectMonitor, _succ); }
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   227
  static int EntryList_offset_in_bytes()   { return offset_of(ObjectMonitor, _EntryList); }
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   228
  static int FreeNext_offset_in_bytes()    { return offset_of(ObjectMonitor, FreeNext); }
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   229
  static int WaitSet_offset_in_bytes()     { return offset_of(ObjectMonitor, _WaitSet); }
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   230
  static int Responsible_offset_in_bytes() { return offset_of(ObjectMonitor, _Responsible); }
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   231
  static int Spinner_offset_in_bytes()     { return offset_of(ObjectMonitor, _Spinner); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
27608
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   233
  // ObjectMonitor references can be ORed with markOopDesc::monitor_value
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   234
  // as part of the ObjectMonitor tagging mechanism. When we combine an
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   235
  // ObjectMonitor reference with an offset, we need to remove the tag
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   236
  // value in order to generate the proper address.
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   237
  //
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   238
  // We can either adjust the ObjectMonitor reference and then add the
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   239
  // offset or we can adjust the offset that is added to the ObjectMonitor
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   240
  // reference. The latter avoids an AGI (Address Generation Interlock)
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   241
  // stall so the helper macro adjusts the offset value that is returned
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   242
  // to the ObjectMonitor reference manipulation code:
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   243
  //
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   244
  #define OM_OFFSET_NO_MONITOR_VALUE_TAG(f) \
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   245
    ((ObjectMonitor::f ## _offset_in_bytes()) - markOopDesc::monitor_value)
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   246
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 19696
diff changeset
   247
  // Eventually we'll make provisions for multiple callbacks, but
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  // now one will suffice.
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   249
  static int (*SpinCallbackFunction)(intptr_t, int);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   250
  static intptr_t SpinCallbackArgument;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  markOop   header() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  void      set_header(markOop hdr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   255
  intptr_t is_busy() const {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   256
    // TODO-FIXME: merge _count and _waiters.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   257
    // TODO-FIXME: assert _owner == null implies _recursions = 0
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   258
    // TODO-FIXME: assert _WaitSet != null implies _count > 0
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   259
    return _count|_waiters|intptr_t(_owner)|intptr_t(_cxq)|intptr_t(_EntryList);
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   260
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   261
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  intptr_t  is_entered(Thread* current) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  void*     owner() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  void      set_owner(void* owner);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   267
  jint      waiters() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   269
  jint      count() const;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   270
  void      set_count(jint count);
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   271
  jint      contentions() const;
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   272
  intptr_t  recursions() const                                         { return _recursions; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   274
  // JVM/TI GetObjectMonitorUsage() needs this:
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   275
  ObjectWaiter* first_waiter()                                         { return _WaitSet; }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   276
  ObjectWaiter* next_waiter(ObjectWaiter* o)                           { return o->_next; }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   277
  Thread* thread_of_waiter(ObjectWaiter* o)                            { return o->_thread; }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   278
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   279
 protected:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   280
  // We don't typically expect or want the ctors or dtors to run.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   281
  // normal ObjectMonitors are type-stable and immortal.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   282
  ObjectMonitor() { ::memset((void *)this, 0, sizeof(*this)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   284
  ~ObjectMonitor() {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   285
    // TODO: Add asserts ...
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   286
    // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   287
    // _count == 0 _EntryList  == NULL etc
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   288
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   289
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   290
 private:
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   291
  void Recycle() {
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   292
    // TODO: add stronger asserts ...
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   293
    // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   294
    // _count == 0 EntryList  == NULL
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   295
    // _recursions == 0 _WaitSet == NULL
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   296
    assert(((is_busy()|_recursions) == 0), "freeing inuse monitor");
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   297
    _succ          = NULL;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   298
    _EntryList     = NULL;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   299
    _cxq           = NULL;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   300
    _WaitSet       = NULL;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   301
    _recursions    = 0;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   302
    _SpinFreq      = 0;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   303
    _SpinClock     = 0;
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   304
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   305
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   306
 public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  void*     object() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  void*     object_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  void      set_object(void* obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  bool      check(TRAPS);       // true if the thread owns the monitor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  void      check_slow(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  void      clear();
25633
4cd9c4622c8c 8049717: expose L1_data_cache_line_size for diagnostic/sanity checks
dcubed
parents: 25472
diff changeset
   315
  static void sanity_checks();  // public for -XX:+ExecuteInternalVMTests
4cd9c4622c8c 8049717: expose L1_data_cache_line_size for diagnostic/sanity checks
dcubed
parents: 25472
diff changeset
   316
                                // in PRODUCT for -XX:SyncKnobs=Verbose=1
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  void      verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  void      print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  void      enter(TRAPS);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
   323
  void      exit(bool not_suspended, TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  void      wait(jlong millis, bool interruptable, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  void      notify(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  void      notifyAll(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
// Use the following at your own risk
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  intptr_t  complete_exit(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  void      reenter(intptr_t recursions, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
 private:
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   333
  void      AddWaiter(ObjectWaiter * waiter);
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   334
  static    void DeferredInitialize();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   336
  ObjectWaiter * DequeueWaiter();
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   337
  void      DequeueSpecificWaiter(ObjectWaiter * waiter);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   338
  void      EnterI(TRAPS);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   339
  void      ReenterI(Thread * Self, ObjectWaiter * SelfNode);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   340
  void      UnlinkAfterAcquire(Thread * Self, ObjectWaiter * SelfNode);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   341
  int       TryLock(Thread * Self);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   342
  int       NotRunnable(Thread * Self, Thread * Owner);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   343
  int       TrySpin_Fixed(Thread * Self);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   344
  int       TrySpin_VaryFrequency(Thread * Self);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   345
  int       TrySpin_VaryDuration(Thread * Self);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   346
  void      ExitEpilog(Thread * Self, ObjectWaiter * Wakee);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   347
  bool      ExitSuspendEquivalent(JavaThread * Self);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
   348
  void      post_monitor_wait_event(EventJavaMonitorWait * event,
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   349
                                    jlong notifier_tid,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   350
                                    jlong timeout,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   351
                                    bool timedout);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
};
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   354
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   355
#undef TEVENT
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   356
#define TEVENT(nom) { if (SyncVerbose) FEVENT(nom); }
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   357
31782
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   358
#define FEVENT(nom)                             \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   359
  {                                             \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   360
    static volatile int ctr = 0;                \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   361
    int v = ++ctr;                              \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   362
    if ((v & (v - 1)) == 0) {                   \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   363
      tty->print_cr("INFO: " #nom " : %d", v);  \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   364
      tty->flush();                             \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   365
    }                                           \
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   366
  }
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   367
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   368
#undef  TEVENT
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   369
#define TEVENT(nom) {;}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   370
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
   371
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
   372
#endif // SHARE_VM_RUNTIME_OBJECTMONITOR_HPP