hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp
author acorn
Fri, 22 Oct 2010 15:59:34 -0400
changeset 6975 dc9b63952682
child 7397 5b173b4ca846
permissions -rw-r--r--
6988353: refactor contended sync subsystem Summary: reduce complexity by factoring synchronizer.cpp Reviewed-by: dholmes, never, coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6975
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
     1
/*
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
     2
 * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
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
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    25
# include "incls/_precompiled.incl"
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    26
# include "incls/_jvmtiRawMonitor.cpp.incl"
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    27
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    28
GrowableArray<JvmtiRawMonitor*> *JvmtiPendingMonitors::_monitors = new (ResourceObj::C_HEAP) GrowableArray<JvmtiRawMonitor*>(1,true);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    29
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    30
void JvmtiPendingMonitors::transition_raw_monitors() {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    31
  assert((Threads::number_of_threads()==1),
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    32
         "Java thread has not created yet or more than one java thread \
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    33
is running. Raw monitor transition will not work");
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    34
  JavaThread *current_java_thread = JavaThread::current();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    35
  assert(current_java_thread->thread_state() == _thread_in_vm, "Must be in vm");
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    36
  {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    37
    ThreadBlockInVM __tbivm(current_java_thread);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    38
    for(int i=0; i< count(); i++) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    39
      JvmtiRawMonitor *rmonitor = monitors()->at(i);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    40
      int r = rmonitor->raw_enter(current_java_thread);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    41
      assert(r == ObjectMonitor::OM_OK, "raw_enter should have worked");
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    42
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    43
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    44
  // pending monitors are converted to real monitor so delete them all.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    45
  dispose();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    46
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    47
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    48
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    49
// class JvmtiRawMonitor
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    50
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    51
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    52
JvmtiRawMonitor::JvmtiRawMonitor(const char *name) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    53
#ifdef ASSERT
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    54
  _name = strcpy(NEW_C_HEAP_ARRAY(char, strlen(name) + 1), name);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    55
#else
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    56
  _name = NULL;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    57
#endif
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    58
  _magic = JVMTI_RM_MAGIC;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    59
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    60
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    61
JvmtiRawMonitor::~JvmtiRawMonitor() {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    62
#ifdef ASSERT
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    63
  FreeHeap(_name);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    64
#endif
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    65
  _magic = 0;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    66
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    67
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    68
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    69
bool
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    70
JvmtiRawMonitor::is_valid() {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    71
  int value = 0;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    72
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    73
  // This object might not be a JvmtiRawMonitor so we can't assume
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    74
  // the _magic field is properly aligned. Get the value in a safe
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    75
  // way and then check against JVMTI_RM_MAGIC.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    76
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    77
  switch (sizeof(_magic)) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    78
  case 2:
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    79
    value = Bytes::get_native_u2((address)&_magic);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    80
    break;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    81
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    82
  case 4:
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    83
    value = Bytes::get_native_u4((address)&_magic);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    84
    break;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    85
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    86
  case 8:
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    87
    value = Bytes::get_native_u8((address)&_magic);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    88
    break;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    89
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    90
  default:
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    91
    guarantee(false, "_magic field is an unexpected size");
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    92
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    93
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    94
  return value == JVMTI_RM_MAGIC;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    95
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    96
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    97
// -------------------------------------------------------------------------
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    98
// The raw monitor subsystem is entirely distinct from normal
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
    99
// java-synchronization or jni-synchronization.  raw monitors are not
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   100
// associated with objects.  They can be implemented in any manner
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   101
// that makes sense.  The original implementors decided to piggy-back
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   102
// the raw-monitor implementation on the existing Java objectMonitor mechanism.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   103
// This flaw needs to fixed.  We should reimplement raw monitors as sui-generis.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   104
// Specifically, we should not implement raw monitors via java monitors.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   105
// Time permitting, we should disentangle and deconvolve the two implementations
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   106
// and move the resulting raw monitor implementation over to the JVMTI directories.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   107
// Ideally, the raw monitor implementation would be built on top of
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   108
// park-unpark and nothing else.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   109
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   110
// raw monitors are used mainly by JVMTI
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   111
// The raw monitor implementation borrows the ObjectMonitor structure,
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   112
// but the operators are degenerate and extremely simple.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   113
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   114
// Mixed use of a single objectMonitor instance -- as both a raw monitor
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   115
// and a normal java monitor -- is not permissible.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   116
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   117
// Note that we use the single RawMonitor_lock to protect queue operations for
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   118
// _all_ raw monitors.  This is a scalability impediment, but since raw monitor usage
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   119
// is deprecated and rare, this is not of concern.  The RawMonitor_lock can not
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   120
// be held indefinitely.  The critical sections must be short and bounded.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   121
//
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   122
// -------------------------------------------------------------------------
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   123
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   124
int JvmtiRawMonitor::SimpleEnter (Thread * Self) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   125
  for (;;) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   126
    if (Atomic::cmpxchg_ptr (Self, &_owner, NULL) == NULL) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   127
       return OS_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   128
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   129
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   130
    ObjectWaiter Node (Self) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   131
    Self->_ParkEvent->reset() ;     // strictly optional
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   132
    Node.TState = ObjectWaiter::TS_ENTER ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   133
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   134
    RawMonitor_lock->lock_without_safepoint_check() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   135
    Node._next  = _EntryList ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   136
    _EntryList  = &Node ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   137
    OrderAccess::fence() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   138
    if (_owner == NULL && Atomic::cmpxchg_ptr (Self, &_owner, NULL) == NULL) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   139
        _EntryList = Node._next ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   140
        RawMonitor_lock->unlock() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   141
        return OS_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   142
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   143
    RawMonitor_lock->unlock() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   144
    while (Node.TState == ObjectWaiter::TS_ENTER) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   145
       Self->_ParkEvent->park() ;
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
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   149
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   150
int JvmtiRawMonitor::SimpleExit (Thread * Self) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   151
  guarantee (_owner == Self, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   152
  OrderAccess::release_store_ptr (&_owner, NULL) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   153
  OrderAccess::fence() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   154
  if (_EntryList == NULL) return OS_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   155
  ObjectWaiter * w ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   156
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   157
  RawMonitor_lock->lock_without_safepoint_check() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   158
  w = _EntryList ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   159
  if (w != NULL) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   160
      _EntryList = w->_next ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   161
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   162
  RawMonitor_lock->unlock() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   163
  if (w != NULL) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   164
      guarantee (w ->TState == ObjectWaiter::TS_ENTER, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   165
      ParkEvent * ev = w->_event ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   166
      w->TState = ObjectWaiter::TS_RUN ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   167
      OrderAccess::fence() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   168
      ev->unpark() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   169
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   170
  return OS_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   171
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   172
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   173
int JvmtiRawMonitor::SimpleWait (Thread * Self, jlong millis) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   174
  guarantee (_owner == Self  , "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   175
  guarantee (_recursions == 0, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   176
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   177
  ObjectWaiter Node (Self) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   178
  Node._notified = 0 ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   179
  Node.TState    = ObjectWaiter::TS_WAIT ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   180
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   181
  RawMonitor_lock->lock_without_safepoint_check() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   182
  Node._next     = _WaitSet ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   183
  _WaitSet       = &Node ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   184
  RawMonitor_lock->unlock() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   185
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   186
  SimpleExit (Self) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   187
  guarantee (_owner != Self, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   188
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   189
  int ret = OS_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   190
  if (millis <= 0) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   191
    Self->_ParkEvent->park();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   192
  } else {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   193
    ret = Self->_ParkEvent->park(millis);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   194
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   195
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   196
  // If thread still resides on the waitset then unlink it.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   197
  // Double-checked locking -- the usage is safe in this context
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   198
  // as we TState is volatile and the lock-unlock operators are
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   199
  // serializing (barrier-equivalent).
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   200
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   201
  if (Node.TState == ObjectWaiter::TS_WAIT) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   202
    RawMonitor_lock->lock_without_safepoint_check() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   203
    if (Node.TState == ObjectWaiter::TS_WAIT) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   204
      // Simple O(n) unlink, but performance isn't critical here.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   205
      ObjectWaiter * p ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   206
      ObjectWaiter * q = NULL ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   207
      for (p = _WaitSet ; p != &Node; p = p->_next) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   208
         q = p ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   209
      }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   210
      guarantee (p == &Node, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   211
      if (q == NULL) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   212
        guarantee (p == _WaitSet, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   213
        _WaitSet = p->_next ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   214
      } else {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   215
        guarantee (p == q->_next, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   216
        q->_next = p->_next ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   217
      }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   218
      Node.TState = ObjectWaiter::TS_RUN ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   219
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   220
    RawMonitor_lock->unlock() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   221
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   222
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   223
  guarantee (Node.TState == ObjectWaiter::TS_RUN, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   224
  SimpleEnter (Self) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   225
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   226
  guarantee (_owner == Self, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   227
  guarantee (_recursions == 0, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   228
  return ret ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   229
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   230
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   231
int JvmtiRawMonitor::SimpleNotify (Thread * Self, bool All) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   232
  guarantee (_owner == Self, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   233
  if (_WaitSet == NULL) return OS_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   234
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   235
  // We have two options:
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   236
  // A. Transfer the threads from the WaitSet to the EntryList
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   237
  // B. Remove the thread from the WaitSet and unpark() it.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   238
  //
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   239
  // We use (B), which is crude and results in lots of futile
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   240
  // context switching.  In particular (B) induces lots of contention.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   241
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   242
  ParkEvent * ev = NULL ;       // consider using a small auto array ...
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   243
  RawMonitor_lock->lock_without_safepoint_check() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   244
  for (;;) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   245
      ObjectWaiter * w = _WaitSet ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   246
      if (w == NULL) break ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   247
      _WaitSet = w->_next ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   248
      if (ev != NULL) { ev->unpark(); ev = NULL; }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   249
      ev = w->_event ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   250
      OrderAccess::loadstore() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   251
      w->TState = ObjectWaiter::TS_RUN ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   252
      OrderAccess::storeload();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   253
      if (!All) break ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   254
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   255
  RawMonitor_lock->unlock() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   256
  if (ev != NULL) ev->unpark();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   257
  return OS_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   258
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   259
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   260
// Any JavaThread will enter here with state _thread_blocked
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   261
int JvmtiRawMonitor::raw_enter(TRAPS) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   262
  TEVENT (raw_enter) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   263
  void * Contended ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   264
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   265
  // don't enter raw monitor if thread is being externally suspended, it will
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   266
  // surprise the suspender if a "suspended" thread can still enter monitor
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   267
  JavaThread * jt = (JavaThread *)THREAD;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   268
  if (THREAD->is_Java_thread()) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   269
    jt->SR_lock()->lock_without_safepoint_check();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   270
    while (jt->is_external_suspend()) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   271
      jt->SR_lock()->unlock();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   272
      jt->java_suspend_self();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   273
      jt->SR_lock()->lock_without_safepoint_check();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   274
    }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   275
    // guarded by SR_lock to avoid racing with new external suspend requests.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   276
    Contended = Atomic::cmpxchg_ptr (THREAD, &_owner, NULL) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   277
    jt->SR_lock()->unlock();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   278
  } else {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   279
    Contended = Atomic::cmpxchg_ptr (THREAD, &_owner, NULL) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   280
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   281
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   282
  if (Contended == THREAD) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   283
     _recursions ++ ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   284
     return OM_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   285
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   286
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   287
  if (Contended == NULL) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   288
     guarantee (_owner == THREAD, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   289
     guarantee (_recursions == 0, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   290
     return OM_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   291
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   292
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   293
  THREAD->set_current_pending_monitor(this);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   294
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   295
  if (!THREAD->is_Java_thread()) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   296
     // No other non-Java threads besides VM thread would acquire
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   297
     // a raw monitor.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   298
     assert(THREAD->is_VM_thread(), "must be VM thread");
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   299
     SimpleEnter (THREAD) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   300
   } else {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   301
     guarantee (jt->thread_state() == _thread_blocked, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   302
     for (;;) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   303
       jt->set_suspend_equivalent();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   304
       // cleared by handle_special_suspend_equivalent_condition() or
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   305
       // java_suspend_self()
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   306
       SimpleEnter (THREAD) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   307
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   308
       // were we externally suspended while we were waiting?
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   309
       if (!jt->handle_special_suspend_equivalent_condition()) break ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   310
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   311
       // This thread was externally suspended
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   312
       //
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   313
       // This logic isn't needed for JVMTI raw monitors,
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   314
       // but doesn't hurt just in case the suspend rules change. This
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   315
           // logic is needed for the JvmtiRawMonitor.wait() reentry phase.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   316
           // We have reentered the contended monitor, but while we were
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   317
           // waiting another thread suspended us. We don't want to reenter
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   318
           // the monitor while suspended because that would surprise the
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   319
           // thread that suspended us.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   320
           //
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   321
           // Drop the lock -
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   322
       SimpleExit (THREAD) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   323
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   324
           jt->java_suspend_self();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   325
         }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   326
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   327
     assert(_owner == THREAD, "Fatal error with monitor owner!");
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   328
     assert(_recursions == 0, "Fatal error with monitor recursions!");
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   329
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   330
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   331
  THREAD->set_current_pending_monitor(NULL);
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   332
  guarantee (_recursions == 0, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   333
  return OM_OK;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   334
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   335
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   336
// Used mainly for JVMTI raw monitor implementation
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   337
// Also used for JvmtiRawMonitor::wait().
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   338
int JvmtiRawMonitor::raw_exit(TRAPS) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   339
  TEVENT (raw_exit) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   340
  if (THREAD != _owner) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   341
    return OM_ILLEGAL_MONITOR_STATE;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   342
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   343
  if (_recursions > 0) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   344
    --_recursions ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   345
    return OM_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   346
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   347
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   348
  void * List = _EntryList ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   349
  SimpleExit (THREAD) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   350
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   351
  return OM_OK;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   352
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   353
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   354
// Used for JVMTI raw monitor implementation.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   355
// All JavaThreads will enter here with state _thread_blocked
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   356
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   357
int JvmtiRawMonitor::raw_wait(jlong millis, bool interruptible, TRAPS) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   358
  TEVENT (raw_wait) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   359
  if (THREAD != _owner) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   360
    return OM_ILLEGAL_MONITOR_STATE;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   361
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   362
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   363
  // To avoid spurious wakeups we reset the parkevent -- This is strictly optional.
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   364
  // The caller must be able to tolerate spurious returns from raw_wait().
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   365
  THREAD->_ParkEvent->reset() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   366
  OrderAccess::fence() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   367
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   368
  // check interrupt event
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   369
  if (interruptible && Thread::is_interrupted(THREAD, true)) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   370
    return OM_INTERRUPTED;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   371
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   372
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   373
  intptr_t save = _recursions ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   374
  _recursions = 0 ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   375
  _waiters ++ ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   376
  if (THREAD->is_Java_thread()) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   377
    guarantee (((JavaThread *) THREAD)->thread_state() == _thread_blocked, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   378
    ((JavaThread *)THREAD)->set_suspend_equivalent();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   379
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   380
  int rv = SimpleWait (THREAD, millis) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   381
  _recursions = save ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   382
  _waiters -- ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   383
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   384
  guarantee (THREAD == _owner, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   385
  if (THREAD->is_Java_thread()) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   386
     JavaThread * jSelf = (JavaThread *) THREAD ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   387
     for (;;) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   388
        if (!jSelf->handle_special_suspend_equivalent_condition()) break ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   389
        SimpleExit (THREAD) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   390
        jSelf->java_suspend_self();
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   391
        SimpleEnter (THREAD) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   392
        jSelf->set_suspend_equivalent() ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   393
     }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   394
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   395
  guarantee (THREAD == _owner, "invariant") ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   396
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   397
  if (interruptible && Thread::is_interrupted(THREAD, true)) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   398
    return OM_INTERRUPTED;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   399
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   400
  return OM_OK ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   401
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   402
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   403
int JvmtiRawMonitor::raw_notify(TRAPS) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   404
  TEVENT (raw_notify) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   405
  if (THREAD != _owner) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   406
    return OM_ILLEGAL_MONITOR_STATE;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   407
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   408
  SimpleNotify (THREAD, false) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   409
  return OM_OK;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   410
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   411
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   412
int JvmtiRawMonitor::raw_notifyAll(TRAPS) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   413
  TEVENT (raw_notifyAll) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   414
  if (THREAD != _owner) {
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   415
    return OM_ILLEGAL_MONITOR_STATE;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   416
  }
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   417
  SimpleNotify (THREAD, true) ;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   418
  return OM_OK;
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   419
}
dc9b63952682 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
   420