< prev index next >
src/share/vm/runtime/synchronizer.cpp
Print this page
*** 38,47 ****
--- 38,48 ----
#include "runtime/synchronizer.hpp"
#include "runtime/thread.inline.hpp"
#include "utilities/dtrace.hpp"
#include "utilities/events.hpp"
#include "utilities/preserveException.hpp"
+ #include "evtrace/traceEvents.hpp"
#ifdef TARGET_OS_FAMILY_linux
# include "os_linux.inline.hpp"
#endif
#ifdef TARGET_OS_FAMILY_solaris
# include "os_solaris.inline.hpp"
*** 278,310 ****
// 2) wait on lock2
// 3) when notified on lock2, unlock lock2
// 4) reenter lock1 with original recursion count
// 5) lock lock2
// NOTE: must use heavy weight monitor to handle complete_exit/reenter()
! intptr_t ObjectSynchronizer::complete_exit(Handle obj, TRAPS) {
TEVENT (complete_exit) ;
if (UseBiasedLocking) {
BiasedLocking::revoke_and_rebias(obj, false, THREAD);
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
}
ObjectMonitor* monitor = ObjectSynchronizer::inflate(THREAD, obj());
! return monitor->complete_exit(THREAD);
}
// NOTE: must use heavy weight monitor to handle complete_exit/reenter()
! void ObjectSynchronizer::reenter(Handle obj, intptr_t recursion, TRAPS) {
TEVENT (reenter) ;
if (UseBiasedLocking) {
BiasedLocking::revoke_and_rebias(obj, false, THREAD);
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
}
ObjectMonitor* monitor = ObjectSynchronizer::inflate(THREAD, obj());
! monitor->reenter(recursion, THREAD);
}
// -----------------------------------------------------------------------------
// JNI locks on java objects
// NOTE: must use heavy weight monitor to handle jni monitor enter
void ObjectSynchronizer::jni_enter(Handle obj, TRAPS) { // possible entry from jni enter
--- 279,311 ----
// 2) wait on lock2
// 3) when notified on lock2, unlock lock2
// 4) reenter lock1 with original recursion count
// 5) lock lock2
// NOTE: must use heavy weight monitor to handle complete_exit/reenter()
! void ObjectSynchronizer::complete_exit(Handle obj, intptr_t *saved_recursions, intptr_t *saved_trace_exit_stack, TRAPS) {
TEVENT (complete_exit) ;
if (UseBiasedLocking) {
BiasedLocking::revoke_and_rebias(obj, false, THREAD);
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
}
ObjectMonitor* monitor = ObjectSynchronizer::inflate(THREAD, obj());
! monitor->complete_exit(saved_recursions, saved_trace_exit_stack, THREAD);
}
// NOTE: must use heavy weight monitor to handle complete_exit/reenter()
! void ObjectSynchronizer::reenter(Handle obj, intptr_t saved_recursions, intptr_t saved_trace_exit_stack, TRAPS) {
TEVENT (reenter) ;
if (UseBiasedLocking) {
BiasedLocking::revoke_and_rebias(obj, false, THREAD);
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
}
ObjectMonitor* monitor = ObjectSynchronizer::inflate(THREAD, obj());
! monitor->reenter(saved_recursions, saved_trace_exit_stack, THREAD);
}
// -----------------------------------------------------------------------------
// JNI locks on java objects
// NOTE: must use heavy weight monitor to handle jni monitor enter
void ObjectSynchronizer::jni_enter(Handle obj, TRAPS) { // possible entry from jni enter
*** 1308,1317 ****
--- 1309,1325 ----
// with CAS. That is, we can avoid the xchg-NULL .... ST idiom.
m->set_owner(mark->locker());
m->set_object(object);
// TODO-FIXME: assert BasicLock->dhw != 0.
+ // must get a sequence number before the monitor is published below
+ No_Safepoint_Verifier nsv(true, false);
+ intptr_t trace_seq;
+ if (EnableEventTracing) {
+ trace_seq = m->next_trace_seq();
+ }
+
// Must preserve store ordering. The monitor state must
// be stable at the time of publishing the monitor address.
guarantee (object->mark() == markOopDesc::INFLATING(), "invariant") ;
object->release_set_mark(markOopDesc::encode(m));
*** 1325,1334 ****
--- 1333,1345 ----
tty->print_cr("Inflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s",
(void *) object, (intptr_t) object->mark(),
object->klass()->external_name());
}
}
+ if (EnableEventTracing) {
+ TraceEvents::write_monitor_inflate(m, trace_seq);
+ }
return m ;
}
// CASE: neutral
// TODO-FIXME: for entry we currently inflate and then try to CAS _owner.
*** 1350,1365 ****
--- 1361,1388 ----
m->OwnerIsThread = 1 ;
m->_recursions = 0 ;
m->_Responsible = NULL ;
m->_SpinDuration = ObjectMonitor::Knob_SpinLimit ; // consider: keep metastats by type/class
+ // must get a sequence number before the monitor is published below
+ No_Safepoint_Verifier nsv(true, false);
+ intptr_t trace_seq;
+ if (EnableEventTracing) {
+ trace_seq = m->next_trace_seq();
+ }
+
if (Atomic::cmpxchg_ptr (markOopDesc::encode(m), object->mark_addr(), mark) != mark) {
m->set_object (NULL) ;
m->set_owner (NULL) ;
m->OwnerIsThread = 0 ;
m->Recycle() ;
omRelease (Self, m, true) ;
+
+ if (EnableEventTracing) { // must still consume our sequence number
+ TraceEvents::write_monitor_dummy(m, trace_seq);
+ }
+
m = NULL ;
continue ;
// interference - the markword changed - just retry.
// The state-transitions are one-way, so there's no chance of
// live-lock -- "Inflated" is an absorbing state.
*** 1375,1384 ****
--- 1398,1410 ----
tty->print_cr("Inflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s",
(void *) object, (intptr_t) object->mark(),
object->klass()->external_name());
}
}
+ if (EnableEventTracing) {
+ TraceEvents::write_monitor_inflate(m, trace_seq);
+ }
return m ;
}
}
// Note that we could encounter some performance loss through false-sharing as
*** 1442,1451 ****
--- 1468,1480 ----
ResourceMark rm;
tty->print_cr("Deflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s",
(void *) obj, (intptr_t) obj->mark(), obj->klass()->external_name());
}
}
+ if (EnableEventTracing) {
+ TraceEvents::write_monitor_deflate(mid);
+ }
// Restore the header back to obj
obj->release_set_mark(mid->header());
mid->clear();
*** 1603,1613 ****
public:
ReleaseJavaMonitorsClosure(Thread* thread) : THREAD(thread) {}
void do_monitor(ObjectMonitor* mid) {
if (mid->owner() == THREAD) {
! (void)mid->complete_exit(CHECK);
}
}
};
// Release all inflated monitors owned by THREAD. Lightweight monitors are
--- 1632,1642 ----
public:
ReleaseJavaMonitorsClosure(Thread* thread) : THREAD(thread) {}
void do_monitor(ObjectMonitor* mid) {
if (mid->owner() == THREAD) {
! mid->complete_exit(NULL, NULL, CHECK);
}
}
};
// Release all inflated monitors owned by THREAD. Lightweight monitors are
< prev index next >