src/hotspot/share/runtime/objectMonitor.hpp
author coleenp
Fri, 16 Mar 2018 09:12:13 -0400
changeset 49449 ef5d5d343e2a
parent 49038 ebdbf7f90199
child 50083 07015dd8157f
permissions -rw-r--r--
8199263: Split interfaceSupport.hpp to not require including .inline.hpp files Summary: interfaceSupport.hpp is an inline file so moved to interfaceSupport.inline.hpp and stopped including it in .hpp files Reviewed-by: stefank, rehn, kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
49038
ebdbf7f90199 8068593: Remove or repurpose unused PerfCounters from objectMonitor
coleenp
parents: 48157
diff changeset
     2
 * Copyright (c) 1998, 2018, 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
48157
7c4d43c26352 8192061: Clean up allocation.inline.hpp includes
stefank
parents: 48115
diff changeset
    28
#include "memory/allocation.hpp"
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    29
#include "memory/padded.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    30
#include "runtime/os.hpp"
7408
c04a5c989f26 7003125: precompiled.hpp is included when precompiled headers are not used
stefank
parents: 7397
diff changeset
    31
#include "runtime/park.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    32
#include "runtime/perfData.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    33
49449
ef5d5d343e2a 8199263: Split interfaceSupport.hpp to not require including .inline.hpp files
coleenp
parents: 49038
diff changeset
    34
class ObjectMonitor;
ef5d5d343e2a 8199263: Split interfaceSupport.hpp to not require including .inline.hpp files
coleenp
parents: 49038
diff changeset
    35
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    36
// ObjectWaiter serves as a "proxy" or surrogate thread.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    37
// TODO-FIXME: Eliminate ObjectWaiter and use the thread-specific
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    38
// ParkEvent instead.  Beware, however, that the JVMTI code
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    39
// knows about ObjectWaiters, so we'll have to reconcile that code.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    40
// See next_waiter(), first_waiter(), etc.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    41
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    42
class ObjectWaiter : public StackObj {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    43
 public:
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    44
  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
    45
  enum Sorted  { PREPEND, APPEND, SORTED };
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    46
  ObjectWaiter * volatile _next;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    47
  ObjectWaiter * volatile _prev;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    48
  Thread*       _thread;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
    49
  jlong         _notifier_tid;
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    50
  ParkEvent *   _event;
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    51
  volatile int  _notified;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    52
  volatile TStates TState;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    53
  Sorted        _Sorted;           // List placement disposition
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
    54
  bool          _active;           // Contention monitoring is enabled
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    55
 public:
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    56
  ObjectWaiter(Thread* thread);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    57
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    58
  void wait_reenter_begin(ObjectMonitor *mon);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    59
  void wait_reenter_end(ObjectMonitor *mon);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    60
};
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
    61
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
    62
// forward declaration to avoid include tracing.hpp
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
    63
class EventJavaMonitorWait;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
    64
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    65
// The ObjectMonitor class implements the heavyweight version of a
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    66
// JavaMonitor. The lightweight BasicLock/stack lock version has been
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    67
// inflated into an ObjectMonitor. This inflation is typically due to
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    68
// contention or use of Object.wait().
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
// 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
    71
// changes unless you are fully aware of the underlying semantics.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    72
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    73
// Class JvmtiRawMonitor currently inherits from ObjectMonitor so
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    74
// 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
    75
// These two subsystems should be separated.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    76
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    77
// ObjectMonitor Layout Overview/Highlights/Restrictions:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
//
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    79
// - 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
    80
//   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
    81
//   ObjectMonitor.hpp to avoid exposing ObjectMonitor everywhere. This
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    82
//   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
    83
//   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
    84
//   the proper functioning of the VM.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    85
// - 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
    86
//   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
    87
//   This is an advisory recommendation.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    88
// - The general layout of the fields in ObjectMonitor is:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    89
//     _header
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    90
//     <lightly_used_fields>
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    91
//     <optional padding>
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    92
//     _owner
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    93
//     <remaining_fields>
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    94
// - The VM assumes write ordering and machine word alignment with
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    95
//   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
    96
//   be read in parallel by other threads.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    97
// - Generally fields that are accessed closely together in time should
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
    98
//   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
    99
//   is, temporal locality should condition spatial locality.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   100
// - We have to balance avoiding false sharing with excessive invalidation
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   101
//   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
   102
//   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
   103
//   cache line.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   104
// - We also have to balance the natural tension between minimizing
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   105
//   single threaded capacity misses with excessive multi-threaded
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   106
//   coherency misses. There is no single optimal layout for both
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   107
//   single-threaded and multi-threaded environments.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   108
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   109
// - See ObjectMonitor::sanity_checks() for how critical restrictions are
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   110
//   enforced and advisory recommendations are reported.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   111
// - Adjacent ObjectMonitors should be separated by enough space to avoid
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   112
//   false sharing. This is handled by the ObjectMonitor allocation code
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   113
//   in synchronizer.cpp. Also see ObjectSynchronizer::sanity_checks().
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   114
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   115
// Futures notes:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   116
//   - Separating _owner from the <remaining_fields> by enough space to
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   117
//     avoid false sharing might be profitable. Given
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   118
//     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
   119
//     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
   120
//     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
   121
//     same line for monitorexit. Putting these <remaining_fields>:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   122
//     _recursions, _EntryList, _cxq, and _succ, all of which may be
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   123
//     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
   124
//     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
   125
//     field.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   126
//
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   127
//   - 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
   128
//     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
   129
//     in a 64-bit JVM.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
class ObjectMonitor {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    OM_OK,                    // no error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    OM_SYSTEM_ERROR,          // operating system error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    OM_ILLEGAL_MONITOR_STATE, // IllegalMonitorStateException
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    OM_INTERRUPTED,           // Thread.interrupt()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    OM_TIMED_OUT              // Object.wait() timed out
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   141
 private:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   142
  friend class ObjectSynchronizer;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   143
  friend class ObjectWaiter;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   144
  friend class VMStructs;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   145
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   146
  volatile markOop   _header;       // displaced object header word - mark
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   147
  void*     volatile _object;       // backward object pointer - strong root
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
 public:
47634
6a0c42c40cd1 8188220: Remove Atomic::*_ptr() uses and overloads from hotspot
coleenp
parents: 47216
diff changeset
   149
  ObjectMonitor*     FreeNext;      // Free list linkage
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   150
 private:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   151
  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE,
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   152
                        sizeof(volatile markOop) + sizeof(void * volatile) +
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   153
                        sizeof(ObjectMonitor *));
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   154
 protected:                         // protected for JvmtiRawMonitor
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   155
  void *  volatile _owner;          // pointer to owning thread OR BasicLock
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   156
  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
   157
  volatile intptr_t  _recursions;   // recursion count, 0 for first entry
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   158
  ObjectWaiter * volatile _EntryList; // Threads blocked on entry or reentry.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   159
                                      // The list is actually composed of WaitNodes,
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   160
                                      // acting as proxies for Threads.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   161
 private:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   162
  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
   163
  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
   164
  Thread * volatile _Responsible;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   166
  volatile int _Spinner;            // for exit->spinner handoff optimization
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();
32614
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   180
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   181
  // Only perform a PerfData operation if the PerfData object has been
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   182
  // allocated and if the PerfDataManager has not freed the PerfData
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   183
  // objects which can happen at normal VM shutdown.
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   184
  //
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   185
  #define OM_PERFDATA_OP(f, op_str)              \
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   186
    do {                                         \
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   187
      if (ObjectMonitor::_sync_ ## f != NULL &&  \
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   188
          PerfDataManager::has_PerfData()) {     \
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   189
        ObjectMonitor::_sync_ ## f->op_str;      \
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   190
      }                                          \
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   191
    } while (0)
b7b2407bc7e5 8049304: race between VM_Exit and _sync_FutileWakeups->inc()
dcubed
parents: 31856
diff changeset
   192
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   193
  static PerfCounter * _sync_ContendedLockAttempts;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   194
  static PerfCounter * _sync_FutileWakeups;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   195
  static PerfCounter * _sync_Parks;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   196
  static PerfCounter * _sync_Notifications;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   197
  static PerfCounter * _sync_Inflations;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   198
  static PerfCounter * _sync_Deflations;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   199
  static PerfLongVariable * _sync_MonExtant;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   200
31782
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   201
  static int Knob_ExitRelease;
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   202
  static int Knob_Verbose;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   203
  static int Knob_VerifyInUse;
31782
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   204
  static int Knob_VerifyMatch;
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   205
  static int Knob_SpinLimit;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   206
48157
7c4d43c26352 8192061: Clean up allocation.inline.hpp includes
stefank
parents: 48115
diff changeset
   207
  void* operator new (size_t size) throw();
7c4d43c26352 8192061: Clean up allocation.inline.hpp includes
stefank
parents: 48115
diff changeset
   208
  void* operator new[] (size_t size) throw();
7c4d43c26352 8192061: Clean up allocation.inline.hpp includes
stefank
parents: 48115
diff changeset
   209
  void operator delete(void* p);
7c4d43c26352 8192061: Clean up allocation.inline.hpp includes
stefank
parents: 48115
diff changeset
   210
  void operator delete[] (void *p);
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   211
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // TODO-FIXME: the "offset" routines should return a type of off_t instead of int ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // 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
   214
  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
   215
  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
   216
  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
   217
  static int count_offset_in_bytes()       { return offset_of(ObjectMonitor, _count); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  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
   219
  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
   220
  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
   221
  static int EntryList_offset_in_bytes()   { return offset_of(ObjectMonitor, _EntryList); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
27608
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   223
  // ObjectMonitor references can be ORed with markOopDesc::monitor_value
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   224
  // as part of the ObjectMonitor tagging mechanism. When we combine an
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   225
  // ObjectMonitor reference with an offset, we need to remove the tag
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   226
  // value in order to generate the proper address.
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   227
  //
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   228
  // We can either adjust the ObjectMonitor reference and then add the
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   229
  // offset or we can adjust the offset that is added to the ObjectMonitor
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   230
  // reference. The latter avoids an AGI (Address Generation Interlock)
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   231
  // stall so the helper macro adjusts the offset value that is returned
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   232
  // to the ObjectMonitor reference manipulation code:
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   233
  //
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   234
  #define OM_OFFSET_NO_MONITOR_VALUE_TAG(f) \
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   235
    ((ObjectMonitor::f ## _offset_in_bytes()) - markOopDesc::monitor_value)
80d91e264baf 8062851: cleanup ObjectMonitor offset adjustments
dcubed
parents: 27165
diff changeset
   236
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  markOop   header() const;
47634
6a0c42c40cd1 8188220: Remove Atomic::*_ptr() uses and overloads from hotspot
coleenp
parents: 47216
diff changeset
   238
  volatile markOop* header_addr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  void      set_header(markOop hdr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   241
  intptr_t is_busy() const {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   242
    // TODO-FIXME: merge _count and _waiters.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   243
    // TODO-FIXME: assert _owner == null implies _recursions = 0
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   244
    // 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
   245
    return _count|_waiters|intptr_t(_owner)|intptr_t(_cxq)|intptr_t(_EntryList);
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   246
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   247
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  intptr_t  is_entered(Thread* current) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  void*     owner() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  void      set_owner(void* owner);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   253
  jint      waiters() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   255
  jint      count() const;
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   256
  void      set_count(jint count);
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   257
  jint      contentions() const;
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   258
  intptr_t  recursions() const                                         { return _recursions; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   260
  // JVM/TI GetObjectMonitorUsage() needs this:
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   261
  ObjectWaiter* first_waiter()                                         { return _WaitSet; }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   262
  ObjectWaiter* next_waiter(ObjectWaiter* o)                           { return o->_next; }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   263
  Thread* thread_of_waiter(ObjectWaiter* o)                            { return o->_thread; }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   264
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   265
 protected:
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   266
  // 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
   267
  // normal ObjectMonitors are type-stable and immortal.
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   268
  ObjectMonitor() { ::memset((void *)this, 0, sizeof(*this)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   270
  ~ObjectMonitor() {
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   271
    // TODO: Add asserts ...
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   272
    // _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
   273
    // _count == 0 _EntryList  == NULL etc
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   274
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   275
26683
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   276
 private:
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   277
  void Recycle() {
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   278
    // TODO: add stronger asserts ...
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   279
    // _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   280
    // _count == 0 EntryList  == NULL
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   281
    // _recursions == 0 _WaitSet == NULL
27165
785a8d56024c 8049737: Contended Locking reorder and cache line bucket
dcubed
parents: 26684
diff changeset
   282
    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
   283
    _succ          = NULL;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   284
    _EntryList     = NULL;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   285
    _cxq           = NULL;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   286
    _WaitSet       = NULL;
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   287
    _recursions    = 0;
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
 public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  void*     object() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  void*     object_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  void      set_object(void* obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  bool      check(TRAPS);       // true if the thread owns the monitor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  void      check_slow(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  void      clear();
25633
4cd9c4622c8c 8049717: expose L1_data_cache_line_size for diagnostic/sanity checks
dcubed
parents: 25472
diff changeset
   299
  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
   300
                                // in PRODUCT for -XX:SyncKnobs=Verbose=1
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  void      enter(TRAPS);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
   303
  void      exit(bool not_suspended, TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  void      wait(jlong millis, bool interruptable, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  void      notify(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  void      notifyAll(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
// Use the following at your own risk
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  intptr_t  complete_exit(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  void      reenter(intptr_t recursions, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
 private:
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   313
  void      AddWaiter(ObjectWaiter * waiter);
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   314
  static    void DeferredInitialize();
31856
614d6786ba55 8075171: Contended Locking fast notify bucket
dcubed
parents: 31782
diff changeset
   315
  void      INotify(Thread * Self);
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   316
  ObjectWaiter * DequeueWaiter();
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   317
  void      DequeueSpecificWaiter(ObjectWaiter * waiter);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   318
  void      EnterI(TRAPS);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   319
  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
   320
  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
   321
  int       TryLock(Thread * Self);
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   322
  int       NotRunnable(Thread * Self, Thread * Owner);
39702
ea7e9375bb93 8068592: Remove unused code in objectMonitor.hpp
dcubed
parents: 32614
diff changeset
   323
  int       TrySpin(Thread * Self);
25064
244218e6ec0a 8046758: cleanup non-indent white space issues prior to Contended Locking cleanup bucket
dcubed
parents: 22551
diff changeset
   324
  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
   325
  bool      ExitSuspendEquivalent(JavaThread * Self);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17376
diff changeset
   326
  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
   327
                                    jlong notifier_tid,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   328
                                    jlong timeout,
a02753d5a0b2 8057107: cleanup indent white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 25633
diff changeset
   329
                                    bool timedout);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
};
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   332
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   333
#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
   334
#define TEVENT(nom) { if (SyncVerbose) FEVENT(nom); }
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   335
31782
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   336
#define FEVENT(nom)                             \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   337
  {                                             \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   338
    static volatile int ctr = 0;                \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   339
    int v = ++ctr;                              \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   340
    if ((v & (v - 1)) == 0) {                   \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   341
      tty->print_cr("INFO: " #nom " : %d", v);  \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   342
      tty->flush();                             \
b23b74f8ae8d 8130448: thread dump improvements, comment additions, new diagnostics inspired by 8077392
dcubed
parents: 27880
diff changeset
   343
    }                                           \
26684
d1221849ea3d 8057109: manual cleanup of white space issues prior to Contended Locking reorder and cache line bucket
dcubed
parents: 26683
diff changeset
   344
  }
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   345
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   346
#undef  TEVENT
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   347
#define TEVENT(nom) {;}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents: 5547
diff changeset
   348
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
   349
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
   350
#endif // SHARE_VM_RUNTIME_OBJECTMONITOR_HPP