< prev index next >

src/hotspot/share/runtime/jniHandles.inline.hpp

Print this page




  51 // external_guard is true if called from resolve_external_guard.
  52 template <DecoratorSet decorators, bool external_guard>
  53 inline oop JNIHandles::resolve_impl(jobject handle) {
  54   assert(handle != NULL, "precondition");
  55   assert(!current_thread_in_native(), "must not be in native");
  56   oop result;
  57   if (is_jweak(handle)) {       // Unlikely
  58     result = NativeAccess<ON_PHANTOM_OOP_REF|decorators>::oop_load(jweak_ptr(handle));
  59   } else {
  60     result = NativeAccess<decorators>::oop_load(jobject_ptr(handle));
  61     // Construction of jobjects canonicalize a null value into a null
  62     // jobject, so for non-jweak the pointee should never be null.
  63     assert(external_guard || result != NULL, "Invalid JNI handle");
  64   }
  65   return result;
  66 }
  67 
  68 inline oop JNIHandles::resolve(jobject handle) {
  69   oop result = NULL;
  70   if (handle != NULL) {
  71     result = resolve_impl<0 /* decorators */, false /* external_guard */>(handle);
  72   }
  73   return result;
  74 }
  75 
  76 inline oop JNIHandles::resolve_no_keepalive(jobject handle) {
  77   oop result = NULL;
  78   if (handle != NULL) {
  79     result = resolve_impl<AS_NO_KEEPALIVE, false /* external_guard */>(handle);
  80   }
  81   return result;
  82 }
  83 
  84 inline bool JNIHandles::is_same_object(jobject handle1, jobject handle2) {
  85   oop obj1 = resolve_no_keepalive(handle1);
  86   oop obj2 = resolve_no_keepalive(handle2);
  87   return oopDesc::equals(obj1, obj2);
  88 }
  89 
  90 inline oop JNIHandles::resolve_non_null(jobject handle) {
  91   assert(handle != NULL, "JNI handle should not be null");
  92   oop result = resolve_impl<0 /* decorators */, false /* external_guard */>(handle);
  93   assert(result != NULL, "NULL read from jni handle");
  94   return result;
  95 }
  96 
  97 inline void JNIHandles::destroy_local(jobject handle) {
  98   if (handle != NULL) {
  99     assert(!is_jweak(handle), "Invalid JNI local handle");
 100     NativeAccess<>::oop_store(jobject_ptr(handle), (oop)NULL);
 101   }
 102 }
 103 
 104 #endif // SHARE_RUNTIME_JNIHANDLES_INLINE_HPP
 105 


  51 // external_guard is true if called from resolve_external_guard.
  52 template <DecoratorSet decorators, bool external_guard>
  53 inline oop JNIHandles::resolve_impl(jobject handle) {
  54   assert(handle != NULL, "precondition");
  55   assert(!current_thread_in_native(), "must not be in native");
  56   oop result;
  57   if (is_jweak(handle)) {       // Unlikely
  58     result = NativeAccess<ON_PHANTOM_OOP_REF|decorators>::oop_load(jweak_ptr(handle));
  59   } else {
  60     result = NativeAccess<decorators>::oop_load(jobject_ptr(handle));
  61     // Construction of jobjects canonicalize a null value into a null
  62     // jobject, so for non-jweak the pointee should never be null.
  63     assert(external_guard || result != NULL, "Invalid JNI handle");
  64   }
  65   return result;
  66 }
  67 
  68 inline oop JNIHandles::resolve(jobject handle) {
  69   oop result = NULL;
  70   if (handle != NULL) {
  71     result = resolve_impl<DECORATORS_NONE, false /* external_guard */>(handle);
  72   }
  73   return result;
  74 }
  75 
  76 inline oop JNIHandles::resolve_no_keepalive(jobject handle) {
  77   oop result = NULL;
  78   if (handle != NULL) {
  79     result = resolve_impl<AS_NO_KEEPALIVE, false /* external_guard */>(handle);
  80   }
  81   return result;
  82 }
  83 
  84 inline bool JNIHandles::is_same_object(jobject handle1, jobject handle2) {
  85   oop obj1 = resolve_no_keepalive(handle1);
  86   oop obj2 = resolve_no_keepalive(handle2);
  87   return oopDesc::equals(obj1, obj2);
  88 }
  89 
  90 inline oop JNIHandles::resolve_non_null(jobject handle) {
  91   assert(handle != NULL, "JNI handle should not be null");
  92   oop result = resolve_impl<DECORATORS_NONE, false /* external_guard */>(handle);
  93   assert(result != NULL, "NULL read from jni handle");
  94   return result;
  95 }
  96 
  97 inline void JNIHandles::destroy_local(jobject handle) {
  98   if (handle != NULL) {
  99     assert(!is_jweak(handle), "Invalid JNI local handle");
 100     NativeAccess<>::oop_store(jobject_ptr(handle), (oop)NULL);
 101   }
 102 }
 103 
 104 #endif // SHARE_RUNTIME_JNIHANDLES_INLINE_HPP
 105 
< prev index next >