< prev index next >
src/share/vm/runtime/objectMonitor.cpp
Print this page
*** 22,31 ****
--- 22,33 ----
*
*/
#include "precompiled.hpp"
#include "classfile/vmSymbols.hpp"
+ #include "jfr/jfrEvents.hpp"
+ #include "jfr/support/jfrThreadId.hpp"
#include "memory/resourceArea.hpp"
#include "oops/markOop.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/interfaceSupport.hpp"
*** 35,46 ****
#include "runtime/orderAccess.inline.hpp"
#include "runtime/osThread.hpp"
#include "runtime/stubRoutines.hpp"
#include "runtime/thread.inline.hpp"
#include "services/threadService.hpp"
- #include "trace/tracing.hpp"
- #include "trace/traceMacros.hpp"
#include "utilities/dtrace.hpp"
#include "utilities/macros.hpp"
#include "utilities/preserveException.hpp"
#ifdef TARGET_OS_FAMILY_linux
# include "os_linux.inline.hpp"
--- 37,46 ----
*** 52,61 ****
--- 52,64 ----
# include "os_windows.inline.hpp"
#endif
#ifdef TARGET_OS_FAMILY_bsd
# include "os_bsd.inline.hpp"
#endif
+ #if INCLUDE_JFR
+ #include "jfr/support/jfrFlush.hpp"
+ #endif
#if defined(__GNUC__) && !defined(IA64) && !defined(PPC64)
// Need to inhibit inlining for older versions of GCC to avoid build-time failures
#define ATTR __attribute__((noinline))
#else
*** 374,384 ****
--- 377,392 ----
// Prevent deflation at STW-time. See deflate_idle_monitors() and is_busy().
// Ensure the object-monitor relationship remains stable while there's contention.
Atomic::inc_ptr(&_count);
+ JFR_ONLY(JfrConditionalFlushWithStacktrace<EventJavaMonitorEnter> flush(jt);)
EventJavaMonitorEnter event;
+ if (event.should_commit()) {
+ event.set_monitorClass(((oop)this->object())->klass());
+ event.set_address((uintptr_t)(this->object_addr()));
+ }
{ // Change java thread status to indicate blocked on monitor enter.
JavaThreadBlockedOnMonitorEnterState jtbmes(jt, this);
Self->set_current_pending_monitor(this);
*** 463,475 ****
// event handler consumed an unpark() issued by the thread that
// just exited the monitor.
}
if (event.should_commit()) {
! event.set_klass(((oop)this->object())->klass());
! event.set_previousOwner((TYPE_JAVALANGTHREAD)_previous_owner_tid);
! event.set_address((TYPE_ADDRESS)(uintptr_t)(this->object_addr()));
event.commit();
}
if (ObjectMonitor::_sync_ContendedLockAttempts != NULL) {
ObjectMonitor::_sync_ContendedLockAttempts->inc() ;
--- 471,481 ----
// event handler consumed an unpark() issued by the thread that
// just exited the monitor.
}
if (event.should_commit()) {
! event.set_previousOwner((uintptr_t)_previous_owner_tid);
event.commit();
}
if (ObjectMonitor::_sync_ContendedLockAttempts != NULL) {
ObjectMonitor::_sync_ContendedLockAttempts->inc() ;
*** 988,1002 ****
// a MEMBAR or other serializing instruction before fetching EntryList|cxq.
if ((SyncFlags & 4) == 0) {
_Responsible = NULL ;
}
! #if INCLUDE_TRACE
// get the owner's thread id for the MonitorEnter event
// if it is enabled and the thread isn't suspended
! if (not_suspended && Tracing::is_event_enabled(TraceJavaMonitorEnterEvent)) {
! _previous_owner_tid = SharedRuntime::get_java_tid(Self);
}
#endif
for (;;) {
assert (THREAD == _owner, "invariant") ;
--- 994,1008 ----
// a MEMBAR or other serializing instruction before fetching EntryList|cxq.
if ((SyncFlags & 4) == 0) {
_Responsible = NULL ;
}
! #if INCLUDE_JFR
// get the owner's thread id for the MonitorEnter event
// if it is enabled and the thread isn't suspended
! if (not_suspended && EventJavaMonitorEnter::is_enabled()) {
! _previous_owner_tid = JFR_THREAD_ID(Self);
}
#endif
for (;;) {
assert (THREAD == _owner, "invariant") ;
*** 1441,1459 ****
for (v = *adr ; Atomic::cmpxchg (v + dx, adr, v) != v; v = *adr) ;
return v ;
}
// helper method for posting a monitor wait event
! void ObjectMonitor::post_monitor_wait_event(EventJavaMonitorWait* event,
jlong notifier_tid,
jlong timeout,
bool timedout) {
! event->set_klass(((oop)this->object())->klass());
! event->set_timeout((TYPE_ULONG)timeout);
! event->set_address((TYPE_ADDRESS)(uintptr_t)(this->object_addr()));
! event->set_notifier((TYPE_OSTHREAD)notifier_tid);
! event->set_timedOut((TYPE_BOOLEAN)timedout);
event->commit();
}
// -----------------------------------------------------------------------------
// Wait/Notify/NotifyAll
--- 1447,1467 ----
for (v = *adr ; Atomic::cmpxchg (v + dx, adr, v) != v; v = *adr) ;
return v ;
}
// helper method for posting a monitor wait event
! static void post_monitor_wait_event(EventJavaMonitorWait* event,
! ObjectMonitor* monitor,
jlong notifier_tid,
jlong timeout,
bool timedout) {
! assert(monitor != NULL, "invariant");
! event->set_monitorClass(((oop)monitor->object())->klass());
! event->set_timeout(timeout);
! event->set_address((uintptr_t)monitor->object_addr());
! event->set_notifier((u8)notifier_tid);
! event->set_timedOut(timedout);
event->commit();
}
// -----------------------------------------------------------------------------
// Wait/Notify/NotifyAll
*** 1487,1497 ****
// JVMTI_EVENT_MONITOR_WAITED event handler cannot accidentally
// consume an unpark() meant for the ParkEvent associated with
// this ObjectMonitor.
}
if (event.should_commit()) {
! post_monitor_wait_event(&event, 0, millis, false);
}
TEVENT (Wait - Throw IEX) ;
THROW(vmSymbols::java_lang_InterruptedException());
return ;
}
--- 1495,1505 ----
// JVMTI_EVENT_MONITOR_WAITED event handler cannot accidentally
// consume an unpark() meant for the ParkEvent associated with
// this ObjectMonitor.
}
if (event.should_commit()) {
! post_monitor_wait_event(&event, this, 0, millis, false);
}
TEVENT (Wait - Throw IEX) ;
THROW(vmSymbols::java_lang_InterruptedException());
return ;
}
*** 1631,1641 ****
node._event->unpark();
}
}
if (event.should_commit()) {
! post_monitor_wait_event(&event, node._notifier_tid, millis, ret == OS_TIMEOUT);
}
OrderAccess::fence() ;
assert (Self->_Stalled != 0, "invariant") ;
--- 1639,1649 ----
node._event->unpark();
}
}
if (event.should_commit()) {
! post_monitor_wait_event(&event, this, node._notifier_tid, millis, ret == OS_TIMEOUT);
}
OrderAccess::fence() ;
assert (Self->_Stalled != 0, "invariant") ;
*** 1714,1724 ****
if (Policy != 4) {
iterator->TState = ObjectWaiter::TS_ENTER ;
}
iterator->_notified = 1 ;
Thread * Self = THREAD;
! iterator->_notifier_tid = Self->osthread()->thread_id();
ObjectWaiter * List = _EntryList ;
if (List != NULL) {
assert (List->_prev == NULL, "invariant") ;
assert (List->TState == ObjectWaiter::TS_ENTER, "invariant") ;
--- 1722,1732 ----
if (Policy != 4) {
iterator->TState = ObjectWaiter::TS_ENTER ;
}
iterator->_notified = 1 ;
Thread * Self = THREAD;
! iterator->_notifier_tid = JFR_THREAD_ID(Self);
ObjectWaiter * List = _EntryList ;
if (List != NULL) {
assert (List->_prev == NULL, "invariant") ;
assert (List->TState == ObjectWaiter::TS_ENTER, "invariant") ;
*** 1840,1850 ****
guarantee (iterator->TState == ObjectWaiter::TS_WAIT, "invariant") ;
guarantee (iterator->_notified == 0, "invariant") ;
iterator->_notified = 1 ;
Thread * Self = THREAD;
! iterator->_notifier_tid = Self->osthread()->thread_id();
if (Policy != 4) {
iterator->TState = ObjectWaiter::TS_ENTER ;
}
ObjectWaiter * List = _EntryList ;
--- 1848,1858 ----
guarantee (iterator->TState == ObjectWaiter::TS_WAIT, "invariant") ;
guarantee (iterator->_notified == 0, "invariant") ;
iterator->_notified = 1 ;
Thread * Self = THREAD;
! iterator->_notifier_tid = JFR_THREAD_ID(Self);
if (Policy != 4) {
iterator->TState = ObjectWaiter::TS_ENTER ;
}
ObjectWaiter * List = _EntryList ;
< prev index next >