< prev index next >

src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp

Print this page
@@ -2440,10 +2440,19 @@
        CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry),
        r15_thread, c_rarg1);
      restore_args(masm, total_c_args, c_arg, out_regs);
    }
  
+   TSAN_RUNTIME_ONLY(
+     // protect the args we've loaded
+     save_args(masm, total_c_args, c_arg, out_regs);
+     __ call_VM(noreg,
+       CAST_FROM_FN_PTR(address, SharedRuntime::tsan_interp_method_entry),
+       r15_thread);
+     restore_args(masm, total_c_args, c_arg, out_regs);
+   );
+ 
    // RedefineClasses() tracing support for obsolete method entry
    if (log_is_enabled(Trace, redefine, class, obsolete)) {
      // protect the args we've loaded
      save_args(masm, total_c_args, c_arg, out_regs);
      __ mov_metadata(c_rarg1, method());

@@ -2519,10 +2528,18 @@
      __ jcc(Assembler::notEqual, slow_path_lock);
  
      // Slow path will re-enter here
  
      __ bind(lock_done);
+ 
+     TSAN_RUNTIME_ONLY(
+       __ pusha();
+       __ call_VM(noreg,
+                  CAST_FROM_FN_PTR(address, SharedRuntime::tsan_oop_lock),
+                  obj_reg);
+       __ popa();
+     );
    }
  
  
    // Finally just about ready to make the JNI call
  

@@ -2654,10 +2671,18 @@
  
      // Get locked oop from the handle we passed to jni
      __ movptr(obj_reg, Address(oop_handle_reg, 0));
      __ resolve(IS_NOT_NULL, obj_reg);
  
+     TSAN_RUNTIME_ONLY(
+       __ pusha();
+       __ call_VM(noreg, CAST_FROM_FN_PTR(address,
+                                          SharedRuntime::tsan_oop_unlock),
+                  obj_reg);
+       __ popa();
+     );
+ 
      Label done;
  
      if (UseBiasedLocking) {
        __ biased_locking_exit(obj_reg, old_hdr, done);
      }

@@ -2690,10 +2715,18 @@
      }
  
      __ bind(done);
  
    }
+ 
+   TSAN_RUNTIME_ONLY(
+     save_native_result(masm, ret_type, stack_slots);
+     __ call_VM_leaf(
+          CAST_FROM_FN_PTR(address, SharedRuntime::tsan_interp_method_exit));
+     restore_native_result(masm, ret_type, stack_slots);
+   );
+ 
    {
      SkipIfEqual skip(masm, &DTraceMethodProbes, false);
      save_native_result(masm, ret_type, stack_slots);
      __ mov_metadata(c_rarg1, method());
      __ call_VM_leaf(
< prev index next >