src/hotspot/share/prims/jvmtiRawMonitor.hpp
author dholmes
Thu, 14 Nov 2019 22:36:40 -0500
changeset 59105 76ae9aa0e794
parent 58509 7b41c88f8432
permissions -rw-r--r--
8233549: Thread interrupted state must only be accessed when not in a safepoint-safe state Reviewed-by: dcubed, sspitsyn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 47216
diff changeset
     2
 * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
     4
 *
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
     7
 * published by the Free Software Foundation.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
     8
 *
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    13
 * accompanied this code).
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    14
 *
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    18
 *
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    21
 * questions.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    22
 *
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    23
 */
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    24
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 47216
diff changeset
    25
#ifndef SHARE_PRIMS_JVMTIRAWMONITOR_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 47216
diff changeset
    26
#define SHARE_PRIMS_JVMTIRAWMONITOR_HPP
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    27
58488
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    28
#include "memory/allocation.hpp"
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    29
#include "runtime/park.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    30
#include "utilities/growableArray.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
    31
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    32
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    33
// class JvmtiRawMonitor
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    34
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    35
// Used by JVMTI methods: All RawMonitor methods (CreateRawMonitor, EnterRawMonitor, etc.)
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    36
//
58488
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    37
// A simplified version of the ObjectMonitor code.
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    38
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    39
58488
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    40
class JvmtiRawMonitor : public CHeapObj<mtSynchronizer>  {
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    41
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    42
  // Helper class to allow Threads to be linked into queues.
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    43
  // This is a stripped down version of ObjectWaiter.
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    44
  class QNode : public StackObj {
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    45
    friend class JvmtiRawMonitor;
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    46
    enum TStates { TS_READY, TS_RUN, TS_WAIT, TS_ENTER };
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    47
    QNode* volatile _next;
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    48
    QNode* volatile _prev;
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    49
    ParkEvent* _event;
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    50
    volatile int _notified;
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    51
    volatile TStates _t_state;
58488
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    52
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    53
    QNode(Thread* thread);
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    54
  };
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    55
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    56
  Thread* volatile _owner;      // pointer to owning thread
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    57
  volatile int _recursions;     // recursion count, 0 for first entry
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    58
  QNode* volatile _entry_list;  // Threads blocked on entry or reentry.
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    59
                                // The list is actually composed of nodes,
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    60
                                // acting as proxies for Threads.
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    61
  QNode* volatile _wait_set;    // Threads wait()ing on the monitor
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    62
  volatile jint _waiters;       // number of waiting threads
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    63
  int _magic;
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    64
  char* _name;
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    65
  // JVMTI_RM_MAGIC is set in contructor and unset in destructor.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    66
  enum { JVMTI_RM_MAGIC = (int)(('T' << 24) | ('I' << 16) | ('R' << 8) | 'M') };
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    67
59105
76ae9aa0e794 8233549: Thread interrupted state must only be accessed when not in a safepoint-safe state
dholmes
parents: 58509
diff changeset
    68
  // Helpers for queue management isolation
76ae9aa0e794 8233549: Thread interrupted state must only be accessed when not in a safepoint-safe state
dholmes
parents: 58509
diff changeset
    69
  void enqueue_waiter(QNode& node);
76ae9aa0e794 8233549: Thread interrupted state must only be accessed when not in a safepoint-safe state
dholmes
parents: 58509
diff changeset
    70
  void dequeue_waiter(QNode& node);
76ae9aa0e794 8233549: Thread interrupted state must only be accessed when not in a safepoint-safe state
dholmes
parents: 58509
diff changeset
    71
76ae9aa0e794 8233549: Thread interrupted state must only be accessed when not in a safepoint-safe state
dholmes
parents: 58509
diff changeset
    72
  // Mostly low-level implementation routines
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    73
  void simple_enter(Thread* self);
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    74
  void simple_exit(Thread* self);
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    75
  int simple_wait(Thread* self, jlong millis);
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    76
  void simple_notify(Thread* self, bool all);
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    77
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    78
 public:
58488
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    79
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    80
  // return codes
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    81
  enum {
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    82
    M_OK,                    // no error
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    83
    M_ILLEGAL_MONITOR_STATE, // IllegalMonitorStateException
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    84
    M_INTERRUPTED            // Thread.interrupt()
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    85
  };
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    86
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    87
  // Non-aborting operator new
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    88
  void* operator new(size_t size) throw() {
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    89
    return CHeapObj::operator new(size, std::nothrow);
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    90
  }
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    91
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    92
  JvmtiRawMonitor(const char* name);
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    93
  ~JvmtiRawMonitor();
58488
165b193b30dd 8231289: Disentangle JvmtiRawMonitor from ObjectMonitor and clean it up
dholmes
parents: 53244
diff changeset
    94
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    95
  Thread* owner() const { return _owner; }
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    96
  void set_owner(Thread* owner) { _owner = owner; }
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    97
  int recursions() const { return _recursions; }
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    98
  void raw_enter(Thread* self);
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
    99
  int raw_exit(Thread* self);
59105
76ae9aa0e794 8233549: Thread interrupted state must only be accessed when not in a safepoint-safe state
dholmes
parents: 58509
diff changeset
   100
  int raw_wait(jlong millis, Thread* self);
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   101
  int raw_notify(Thread* self);
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   102
  int raw_notifyAll(Thread* self);
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   103
  int magic() const { return _magic; }
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   104
  const char* get_name() const { return _name; }
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   105
  bool is_valid();
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   106
};
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   107
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   108
// Onload pending raw monitors
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   109
// Class is used to cache onload or onstart monitor enter
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   110
// which will transition into real monitor when
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   111
// VM is fully initialized.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   112
class JvmtiPendingMonitors : public AllStatic {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   113
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   114
 private:
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   115
  static GrowableArray<JvmtiRawMonitor*>* _monitors; // Cache raw monitor enter
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   116
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   117
  inline static GrowableArray<JvmtiRawMonitor*>* monitors() { return _monitors; }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   118
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   119
  static void dispose() {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   120
    delete monitors();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   121
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   122
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   123
 public:
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   124
  static void enter(JvmtiRawMonitor* monitor) {
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   125
    monitors()->append(monitor);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   126
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   127
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   128
  static int count() {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   129
    return monitors()->length();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   130
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   131
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   132
  static void destroy(JvmtiRawMonitor* monitor) {
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   133
    while (monitors()->contains(monitor)) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   134
      monitors()->remove(monitor);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   135
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   136
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   137
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   138
  // Return false if monitor is not found in the list.
58509
7b41c88f8432 8231737: Cleanup JvmtiRawMonitor code
dholmes
parents: 58488
diff changeset
   139
  static bool exit(JvmtiRawMonitor* monitor) {
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   140
    if (monitors()->contains(monitor)) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   141
      monitors()->remove(monitor);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   142
      return true;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   143
    } else {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   144
      return false;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   145
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   146
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   147
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   148
  static void transition_raw_monitors();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   149
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6975
diff changeset
   150
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 47216
diff changeset
   151
#endif // SHARE_PRIMS_JVMTIRAWMONITOR_HPP