1 /* 2 * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "memory/allocation.inline.hpp" 27 #include "prims/jvmtiRawMonitor.hpp" 28 #include "runtime/atomic.hpp" 29 #include "runtime/interfaceSupport.inline.hpp" 30 #include "runtime/orderAccess.hpp" 31 #include "runtime/thread.inline.hpp" 32 33 JvmtiRawMonitor::QNode::QNode(Thread* thread) : _next(NULL), _prev(NULL), 34 _event(thread->_ParkEvent), 35 _notified(0), _t_state(TS_RUN) { 36 } 37 38 GrowableArray<JvmtiRawMonitor*>* JvmtiPendingMonitors::_monitors = 39 new (ResourceObj::C_HEAP, mtInternal) GrowableArray<JvmtiRawMonitor*>(1, true); 40 41 void JvmtiPendingMonitors::transition_raw_monitors() { 42 assert((Threads::number_of_threads()==1), 43 "Java thread has not been created yet or more than one java thread " 44 "is running. Raw monitor transition will not work"); 45 JavaThread* current_java_thread = JavaThread::current(); 46 assert(current_java_thread->thread_state() == _thread_in_vm, "Must be in vm"); 47 for (int i = 0; i < count(); i++) { 48 JvmtiRawMonitor* rmonitor = monitors()->at(i); 49 rmonitor->raw_enter(current_java_thread); 50 } 51 // pending monitors are converted to real monitor so delete them all. 52 dispose(); 53 } 54 55 // 56 // class JvmtiRawMonitor 57 // 58 59 JvmtiRawMonitor::JvmtiRawMonitor(const char* name) : _owner(NULL), 60 _recursions(0), 61 _entry_list(NULL), 62 _wait_set(NULL), 63 _waiters(0), 64 _magic(JVMTI_RM_MAGIC), 65 _name(NULL) { 66 #ifdef ASSERT 67 _name = strcpy(NEW_C_HEAP_ARRAY(char, strlen(name) + 1, mtInternal), name); 68 #endif 69 } 70 71 JvmtiRawMonitor::~JvmtiRawMonitor() { 72 #ifdef ASSERT 73 FreeHeap(_name); 74 #endif 75 _magic = 0; 76 } 77 78 79 bool 80 JvmtiRawMonitor::is_valid() { 81 int value = 0; 82 83 // This object might not be a JvmtiRawMonitor so we can't assume 84 // the _magic field is properly aligned. Get the value in a safe 85 // way and then check against JVMTI_RM_MAGIC. 86 87 switch (sizeof(_magic)) { 88 case 2: 89 value = Bytes::get_native_u2((address)&_magic); 90 break; 91 92 case 4: 93 value = Bytes::get_native_u4((address)&_magic); 94 break; 95 96 case 8: 97 value = Bytes::get_native_u8((address)&_magic); 98 break; 99 100 default: 101 guarantee(false, "_magic field is an unexpected size"); 102 } 103 104 return value == JVMTI_RM_MAGIC; 105 } 106 107 // ------------------------------------------------------------------------- 108 // The JVMTI raw monitor subsystem is entirely distinct from normal 109 // java-synchronization or jni-synchronization. JVMTI raw monitors are not 110 // associated with objects. They can be implemented in any manner 111 // that makes sense. The original implementors decided to piggy-back 112 // the raw-monitor implementation on the existing Java ObjectMonitor mechanism. 113 // Now we just use a simplified form of that ObjectMonitor code. 114 // 115 // Note that we use the single RawMonitor_lock to protect queue operations for 116 // _all_ raw monitors. This is a scalability impediment, but since raw monitor usage 117 // is fairly rare, this is not of concern. The RawMonitor_lock can not 118 // be held indefinitely. The critical sections must be short and bounded. 119 // 120 // ------------------------------------------------------------------------- 121 122 void JvmtiRawMonitor::simple_enter(Thread* self) { 123 for (;;) { 124 if (Atomic::replace_if_null(self, &_owner)) { 125 return; 126 } 127 128 QNode node(self); 129 self->_ParkEvent->reset(); // strictly optional 130 node._t_state = QNode::TS_ENTER; 131 132 RawMonitor_lock->lock_without_safepoint_check(); 133 node._next = _entry_list; 134 _entry_list = &node; 135 OrderAccess::fence(); 136 if (_owner == NULL && Atomic::replace_if_null(self, &_owner)) { 137 _entry_list = node._next; 138 RawMonitor_lock->unlock(); 139 return; 140 } 141 RawMonitor_lock->unlock(); 142 while (node._t_state == QNode::TS_ENTER) { 143 self->_ParkEvent->park(); 144 } 145 } 146 } 147 148 void JvmtiRawMonitor::simple_exit(Thread* self) { 149 guarantee(_owner == self, "invariant"); 150 Atomic::release_store(&_owner, (Thread*)NULL); 151 OrderAccess::fence(); 152 if (_entry_list == NULL) { 153 return; 154 } 155 156 RawMonitor_lock->lock_without_safepoint_check(); 157 QNode* w = _entry_list; 158 if (w != NULL) { 159 _entry_list = w->_next; 160 } 161 RawMonitor_lock->unlock(); 162 if (w != NULL) { 163 guarantee(w ->_t_state == QNode::TS_ENTER, "invariant"); 164 // Once we set _t_state to TS_RUN the waiting thread can complete 165 // simple_enter and 'w' is pointing into random stack space. So we have 166 // to ensure we extract the ParkEvent (which is in type-stable memory) 167 // before we set the state, and then don't access 'w'. 168 ParkEvent* ev = w->_event; 169 OrderAccess::loadstore(); 170 w->_t_state = QNode::TS_RUN; 171 OrderAccess::fence(); 172 ev->unpark(); 173 } 174 return; 175 } 176 177 inline void JvmtiRawMonitor::enqueue_waiter(QNode& node) { 178 node._notified = 0; 179 node._t_state = QNode::TS_WAIT; 180 RawMonitor_lock->lock_without_safepoint_check(); 181 node._next = _wait_set; 182 _wait_set = &node; 183 RawMonitor_lock->unlock(); 184 } 185 186 inline void JvmtiRawMonitor::dequeue_waiter(QNode& node) { 187 // If thread still resides on the waitset then unlink it. 188 // Double-checked locking -- the usage is safe in this context 189 // as _t_state is volatile and the lock-unlock operators are 190 // serializing (barrier-equivalent). 191 192 if (node._t_state == QNode::TS_WAIT) { 193 RawMonitor_lock->lock_without_safepoint_check(); 194 if (node._t_state == QNode::TS_WAIT) { 195 // Simple O(n) unlink, but performance isn't critical here. 196 QNode* p; 197 QNode* q = NULL; 198 for (p = _wait_set; p != &node; p = p->_next) { 199 q = p; 200 } 201 guarantee(p == &node, "invariant"); 202 if (q == NULL) { 203 guarantee (p == _wait_set, "invariant"); 204 _wait_set = p->_next; 205 } else { 206 guarantee(p == q->_next, "invariant"); 207 q->_next = p->_next; 208 } 209 node._t_state = QNode::TS_RUN; 210 } 211 RawMonitor_lock->unlock(); 212 } 213 214 guarantee(node._t_state == QNode::TS_RUN, "invariant"); 215 } 216 217 // simple_wait is not quite so simple as we have to deal with the interaction 218 // with the Thread interrupt state, which resides in the java.lang.Thread object. 219 // That state must only be accessed while _thread_in_vm and requires proper thread-state 220 // transitions. However, we cannot perform such transitions whilst we hold the RawMonitor, 221 // else we can deadlock with the VMThread (which may also use RawMonitors as part of 222 // executing various callbacks). 223 // Returns M_OK usually, but M_INTERRUPTED if the thread is a JavaThread and was 224 // interrupted. 225 int JvmtiRawMonitor::simple_wait(Thread* self, jlong millis) { 226 guarantee(_owner == self , "invariant"); 227 guarantee(_recursions == 0, "invariant"); 228 229 QNode node(self); 230 enqueue_waiter(node); 231 232 simple_exit(self); 233 guarantee(_owner != self, "invariant"); 234 235 int ret = M_OK; 236 if (self->is_Java_thread()) { 237 JavaThread* jt = (JavaThread*) self; 238 // Transition to VM so we can check interrupt state 239 ThreadInVMfromNative tivm(jt); 240 if (jt->is_interrupted(true)) { 241 ret = M_INTERRUPTED; 242 } else { 243 ThreadBlockInVM tbivm(jt); 244 jt->set_suspend_equivalent(); 245 if (millis <= 0) { 246 self->_ParkEvent->park(); 247 } else { 248 self->_ParkEvent->park(millis); 249 } 250 // Return to VM before post-check of interrupt state 251 } 252 if (jt->is_interrupted(true)) { 253 ret = M_INTERRUPTED; 254 } 255 } else { 256 if (millis <= 0) { 257 self->_ParkEvent->park(); 258 } else { 259 self->_ParkEvent->park(millis); 260 } 261 } 262 263 dequeue_waiter(node); 264 265 simple_enter(self); 266 guarantee(_owner == self, "invariant"); 267 guarantee(_recursions == 0, "invariant"); 268 269 return ret; 270 } 271 272 void JvmtiRawMonitor::simple_notify(Thread* self, bool all) { 273 guarantee(_owner == self, "invariant"); 274 if (_wait_set == NULL) { 275 return; 276 } 277 278 // We have two options: 279 // A. Transfer the threads from the _wait_set to the _entry_list 280 // B. Remove the thread from the _wait_set and unpark() it. 281 // 282 // We use (B), which is crude and results in lots of futile 283 // context switching. In particular (B) induces lots of contention. 284 285 ParkEvent* ev = NULL; // consider using a small auto array ... 286 RawMonitor_lock->lock_without_safepoint_check(); 287 for (;;) { 288 QNode* w = _wait_set; 289 if (w == NULL) break; 290 _wait_set = w->_next; 291 if (ev != NULL) { 292 ev->unpark(); 293 ev = NULL; 294 } 295 ev = w->_event; 296 OrderAccess::loadstore(); 297 w->_t_state = QNode::TS_RUN; 298 OrderAccess::storeload(); 299 if (!all) { 300 break; 301 } 302 } 303 RawMonitor_lock->unlock(); 304 if (ev != NULL) { 305 ev->unpark(); 306 } 307 return; 308 } 309 310 // Any JavaThread will enter here with state _thread_blocked 311 void JvmtiRawMonitor::raw_enter(Thread* self) { 312 void* contended; 313 JavaThread* jt = NULL; 314 // don't enter raw monitor if thread is being externally suspended, it will 315 // surprise the suspender if a "suspended" thread can still enter monitor 316 if (self->is_Java_thread()) { 317 jt = (JavaThread*)self; 318 jt->SR_lock()->lock_without_safepoint_check(); 319 while (jt->is_external_suspend()) { 320 jt->SR_lock()->unlock(); 321 jt->java_suspend_self(); 322 jt->SR_lock()->lock_without_safepoint_check(); 323 } 324 // guarded by SR_lock to avoid racing with new external suspend requests. 325 contended = Atomic::cmpxchg(jt, &_owner, (Thread*)NULL); 326 jt->SR_lock()->unlock(); 327 } else { 328 contended = Atomic::cmpxchg(self, &_owner, (Thread*)NULL); 329 } 330 331 if (contended == self) { 332 _recursions++; 333 return; 334 } 335 336 if (contended == NULL) { 337 guarantee(_owner == self, "invariant"); 338 guarantee(_recursions == 0, "invariant"); 339 return; 340 } 341 342 self->set_current_pending_raw_monitor(this); 343 344 if (!self->is_Java_thread()) { 345 simple_enter(self); 346 } else { 347 guarantee(jt->thread_state() == _thread_blocked, "invariant"); 348 for (;;) { 349 jt->set_suspend_equivalent(); 350 // cleared by handle_special_suspend_equivalent_condition() or 351 // java_suspend_self() 352 simple_enter(jt); 353 354 // were we externally suspended while we were waiting? 355 if (!jt->handle_special_suspend_equivalent_condition()) { 356 break; 357 } 358 359 // This thread was externally suspended 360 // We have reentered the contended monitor, but while we were 361 // waiting another thread suspended us. We don't want to reenter 362 // the monitor while suspended because that would surprise the 363 // thread that suspended us. 364 // 365 // Drop the lock 366 simple_exit(jt); 367 368 jt->java_suspend_self(); 369 } 370 } 371 372 self->set_current_pending_raw_monitor(NULL); 373 374 guarantee(_owner == self, "invariant"); 375 guarantee(_recursions == 0, "invariant"); 376 } 377 378 int JvmtiRawMonitor::raw_exit(Thread* self) { 379 if (self != _owner) { 380 return M_ILLEGAL_MONITOR_STATE; 381 } 382 if (_recursions > 0) { 383 _recursions--; 384 } else { 385 simple_exit(self); 386 } 387 388 return M_OK; 389 } 390 391 int JvmtiRawMonitor::raw_wait(jlong millis, Thread* self) { 392 if (self != _owner) { 393 return M_ILLEGAL_MONITOR_STATE; 394 } 395 396 int ret = M_OK; 397 398 // To avoid spurious wakeups we reset the parkevent. This is strictly optional. 399 // The caller must be able to tolerate spurious returns from raw_wait(). 400 self->_ParkEvent->reset(); 401 OrderAccess::fence(); 402 403 intptr_t save = _recursions; 404 _recursions = 0; 405 _waiters++; 406 ret = simple_wait(self, millis); 407 _recursions = save; 408 _waiters--; 409 410 guarantee(self == _owner, "invariant"); 411 412 if (self->is_Java_thread()) { 413 JavaThread* jt = (JavaThread*)self; 414 for (;;) { 415 jt->set_suspend_equivalent(); 416 if (!jt->handle_special_suspend_equivalent_condition()) { 417 break; 418 } else { 419 // We've been suspended whilst waiting and so we have to 420 // relinquish the raw monitor until we are resumed. Of course 421 // after reacquiring we have to re-check for suspension again. 422 // Suspension requires we are _thread_blocked, and we also have to 423 // recheck for being interrupted. 424 simple_exit(jt); 425 { 426 ThreadInVMfromNative tivm(jt); 427 { 428 ThreadBlockInVM tbivm(jt); 429 jt->java_suspend_self(); 430 } 431 if (jt->is_interrupted(true)) { 432 ret = M_INTERRUPTED; 433 } 434 } 435 simple_enter(jt); 436 } 437 } 438 guarantee(jt == _owner, "invariant"); 439 } else { 440 assert(ret != M_INTERRUPTED, "Only JavaThreads can be interrupted"); 441 } 442 443 return ret; 444 } 445 446 int JvmtiRawMonitor::raw_notify(Thread* self) { 447 if (self != _owner) { 448 return M_ILLEGAL_MONITOR_STATE; 449 } 450 simple_notify(self, false); 451 return M_OK; 452 } 453 454 int JvmtiRawMonitor::raw_notifyAll(Thread* self) { 455 if (self != _owner) { 456 return M_ILLEGAL_MONITOR_STATE; 457 } 458 simple_notify(self, true); 459 return M_OK; 460 }