< prev index next > src/hotspot/cpu/x86/interp_masm_x86.cpp
Print this page
// rax, rbx
void InterpreterMacroAssembler::lock_object(Register lock_reg) {
assert(lock_reg == LP64_ONLY(c_rarg1) NOT_LP64(rdx),
"The argument is only for looks. It must be c_rarg1");
+ TSAN_RUNTIME_ONLY(push_ptr(lock_reg));
if (UseHeavyMonitors) {
call_VM(noreg,
CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter),
lock_reg);
} else {
CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter),
lock_reg);
bind(done);
}
+
+ TSAN_RUNTIME_ONLY(
+ pop_ptr(lock_reg);
+ pusha();
+ call_VM(noreg,
+ CAST_FROM_FN_PTR(address, SharedRuntime::tsan_interp_lock),
+ lock_reg);
+ popa();
+ );
}
// Unlocks an object. Used in monitorexit bytecode and
// remove_activation. Throws an IllegalMonitorException if object is
// rax, rbx, rcx, rdx
void InterpreterMacroAssembler::unlock_object(Register lock_reg) {
assert(lock_reg == LP64_ONLY(c_rarg1) NOT_LP64(rdx),
"The argument is only for looks. It must be c_rarg1");
+ TSAN_RUNTIME_ONLY(
+ pusha();
+ call_VM(noreg,
+ CAST_FROM_FN_PTR(address, SharedRuntime::tsan_interp_unlock),
+ lock_reg);
+ popa();
+ );
+
if (UseHeavyMonitors) {
call_VM(noreg,
CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorexit),
lock_reg);
} else {
get_method(rarg);
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry),
rthread, rarg);
}
+ TSAN_RUNTIME_ONLY(call_VM(noreg,
+ CAST_FROM_FN_PTR(address,
+ SharedRuntime::tsan_interp_method_entry)));
+
// RedefineClasses() tracing support for obsolete method entry
if (log_is_enabled(Trace, redefine, class, obsolete)) {
NOT_LP64(get_thread(rthread);)
get_method(rarg);
call_VM_leaf(
CAST_FROM_FN_PTR(address, InterpreterRuntime::post_method_exit));
bind(L);
pop(state);
}
+ TSAN_RUNTIME_ONLY(
+ push(state);
+ call_VM_leaf(CAST_FROM_FN_PTR(address,
+ SharedRuntime::tsan_interp_method_exit));
+ pop(state);
+ );
+
{
SkipIfEqual skip(this, &DTraceMethodProbes, false);
push(state);
NOT_LP64(get_thread(rthread);)
get_method(rarg);
< prev index next >