hotspot/src/share/vm/prims/unsafe.cpp
changeset 10967 e13ea25b2f0b
parent 10739 91935236600e
child 13293 c2b4f191c489
child 13195 be27e1b6a4b9
equal deleted inserted replaced
10966:0c9ed2dfc6a2 10967:e13ea25b2f0b
   300   return JNIHandles::make_local(env, v);
   300   return JNIHandles::make_local(env, v);
   301 UNSAFE_END
   301 UNSAFE_END
   302 
   302 
   303 UNSAFE_ENTRY(void, Unsafe_SetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
   303 UNSAFE_ENTRY(void, Unsafe_SetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
   304   UnsafeWrapper("Unsafe_SetObjectVolatile");
   304   UnsafeWrapper("Unsafe_SetObjectVolatile");
       
   305   {
       
   306     // Catch VolatileCallSite.target stores (via
       
   307     // CallSite.setTargetVolatile) and check call site dependencies.
       
   308     oop p = JNIHandles::resolve(obj);
       
   309     if ((offset == java_lang_invoke_CallSite::target_offset_in_bytes()) && p->is_a(SystemDictionary::CallSite_klass())) {
       
   310       Handle call_site    (THREAD, p);
       
   311       Handle method_handle(THREAD, JNIHandles::resolve(x_h));
       
   312       assert(call_site    ->is_a(SystemDictionary::CallSite_klass()),     "must be");
       
   313       assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), "must be");
       
   314       {
       
   315         // Walk all nmethods depending on this call site.
       
   316         MutexLocker mu(Compile_lock, thread);
       
   317         Universe::flush_dependents_on(call_site(), method_handle());
       
   318       }
       
   319     }
       
   320   }
   305   oop x = JNIHandles::resolve(x_h);
   321   oop x = JNIHandles::resolve(x_h);
   306   oop p = JNIHandles::resolve(obj);
   322   oop p = JNIHandles::resolve(obj);
   307   // Catch VolatileCallSite.target stores (via
       
   308   // CallSite.setTargetVolatile) and check call site dependencies.
       
   309   if ((offset == java_lang_invoke_CallSite::target_offset_in_bytes()) && p->is_a(SystemDictionary::CallSite_klass())) {
       
   310     oop call_site     = p;
       
   311     oop method_handle = x;
       
   312     assert(call_site    ->is_a(SystemDictionary::CallSite_klass()),     "must be");
       
   313     assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), "must be");
       
   314     {
       
   315       // Walk all nmethods depending on this call site.
       
   316       MutexLocker mu(Compile_lock, thread);
       
   317       Universe::flush_dependents_on(call_site, method_handle);
       
   318     }
       
   319   }
       
   320   void* addr = index_oop_from_field_offset_long(p, offset);
   323   void* addr = index_oop_from_field_offset_long(p, offset);
   321   OrderAccess::release();
   324   OrderAccess::release();
   322   if (UseCompressedOops) {
   325   if (UseCompressedOops) {
   323     oop_store((narrowOop*)addr, x);
   326     oop_store((narrowOop*)addr, x);
   324   } else {
   327   } else {