8195972: Refactor oops in JNI to use the Access API

Use Access API in JNIHandles

Reviewed-by: coleenp, eosterlund
This commit is contained in:
Kim Barrett 2018-03-30 21:57:50 -04:00
parent 25fbd2ff16
commit 9fee73ec95
3 changed files with 32 additions and 33 deletions

View File

@ -26,6 +26,7 @@
#include "gc/shared/oopStorage.inline.hpp"
#include "logging/log.hpp"
#include "memory/iterator.hpp"
#include "oops/access.inline.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/jniHandles.inline.hpp"
@ -34,9 +35,6 @@
#include "trace/traceMacros.hpp"
#include "utilities/align.hpp"
#include "utilities/debug.hpp"
#if INCLUDE_ALL_GCS
#include "gc/g1/g1BarrierSet.hpp"
#endif
OopStorage* JNIHandles::_global_handles = NULL;
OopStorage* JNIHandles::_weak_global_handles = NULL;
@ -101,7 +99,8 @@ jobject JNIHandles::make_global(Handle obj, AllocFailType alloc_failmode) {
oop* ptr = _global_handles->allocate();
// Return NULL on allocation failure.
if (ptr != NULL) {
*ptr = obj();
assert(*ptr == NULL, "invariant");
RootAccess<IN_CONCURRENT_ROOT>::oop_store(ptr, obj());
res = reinterpret_cast<jobject>(ptr);
} else {
report_handle_allocation_failure(alloc_failmode, "global");
@ -124,7 +123,8 @@ jobject JNIHandles::make_weak_global(Handle obj, AllocFailType alloc_failmode) {
oop* ptr = _weak_global_handles->allocate();
// Return NULL on allocation failure.
if (ptr != NULL) {
*ptr = obj();
assert(*ptr == NULL, "invariant");
RootAccess<ON_PHANTOM_OOP_REF>::oop_store(ptr, obj());
char* tptr = reinterpret_cast<char*>(ptr) + weak_tag_value;
res = reinterpret_cast<jobject>(tptr);
} else {
@ -151,26 +151,23 @@ oop JNIHandles::resolve_external_guard(jobject handle) {
oop JNIHandles::resolve_jweak(jweak handle) {
assert(handle != NULL, "precondition");
assert(is_jweak(handle), "precondition");
oop result = jweak_ref(handle);
#if INCLUDE_ALL_GCS
if (result != NULL && UseG1GC) {
G1BarrierSet::enqueue(result);
}
#endif // INCLUDE_ALL_GCS
return result;
return RootAccess<ON_PHANTOM_OOP_REF>::oop_load(jweak_ptr(handle));
}
bool JNIHandles::is_global_weak_cleared(jweak handle) {
assert(handle != NULL, "precondition");
assert(is_jweak(handle), "not a weak handle");
return jweak_ref(handle) == NULL;
oop* oop_ptr = jweak_ptr(handle);
oop value = RootAccess<ON_PHANTOM_OOP_REF | AS_NO_KEEPALIVE>::oop_load(oop_ptr);
return value == NULL;
}
void JNIHandles::destroy_global(jobject handle) {
if (handle != NULL) {
assert(!is_jweak(handle), "wrong method for detroying jweak");
jobject_ref(handle) = NULL;
_global_handles->release(&jobject_ref(handle));
oop* oop_ptr = jobject_ptr(handle);
RootAccess<IN_CONCURRENT_ROOT>::oop_store(oop_ptr, (oop)NULL);
_global_handles->release(oop_ptr);
}
}
@ -178,8 +175,9 @@ void JNIHandles::destroy_global(jobject handle) {
void JNIHandles::destroy_weak_global(jobject handle) {
if (handle != NULL) {
assert(is_jweak(handle), "JNI handle not jweak");
jweak_ref(handle) = NULL;
_weak_global_handles->release(&jweak_ref(handle));
oop* oop_ptr = jweak_ptr(handle);
RootAccess<ON_PHANTOM_OOP_REF>::oop_store(oop_ptr, (oop)NULL);
_weak_global_handles->release(oop_ptr);
}
}
@ -218,11 +216,11 @@ jobjectRefType JNIHandles::handle_type(Thread* thread, jobject handle) {
assert(handle != NULL, "precondition");
jobjectRefType result = JNIInvalidRefType;
if (is_jweak(handle)) {
if (is_storage_handle(_weak_global_handles, &jweak_ref(handle))) {
if (is_storage_handle(_weak_global_handles, jweak_ptr(handle))) {
result = JNIWeakGlobalRefType;
}
} else {
switch (_global_handles->allocation_status(&jobject_ref(handle))) {
switch (_global_handles->allocation_status(jobject_ptr(handle))) {
case OopStorage::ALLOCATED_ENTRY:
result = JNIGlobalRefType;
break;
@ -279,13 +277,13 @@ bool JNIHandles::is_frame_handle(JavaThread* thr, jobject handle) {
bool JNIHandles::is_global_handle(jobject handle) {
assert(handle != NULL, "precondition");
return !is_jweak(handle) && is_storage_handle(_global_handles, &jobject_ref(handle));
return !is_jweak(handle) && is_storage_handle(_global_handles, jobject_ptr(handle));
}
bool JNIHandles::is_weak_global_handle(jobject handle) {
assert(handle != NULL, "precondition");
return is_jweak(handle) && is_storage_handle(_weak_global_handles, &jweak_ref(handle));
return is_jweak(handle) && is_storage_handle(_weak_global_handles, jweak_ptr(handle));
}
size_t JNIHandles::global_handle_memory_usage() {
@ -351,6 +349,8 @@ void JNIHandleBlock::zap() {
// Zap block values
_top = 0;
for (int index = 0; index < block_size_in_oops; index++) {
// NOT using Access here; just bare clobbering to NULL, since the
// block no longer contains valid oops.
_handles[index] = NULL;
}
}
@ -506,7 +506,7 @@ jobject JNIHandleBlock::allocate_handle(oop obj) {
// Try last block
if (_last->_top < block_size_in_oops) {
oop* handle = &(_last->_handles)[_last->_top++];
*handle = obj;
RootAccess<AS_DEST_NOT_INITIALIZED>::oop_store(handle, obj);
return (jobject) handle;
}
@ -514,7 +514,7 @@ jobject JNIHandleBlock::allocate_handle(oop obj) {
if (_free_list != NULL) {
oop* handle = _free_list;
_free_list = (oop*) *_free_list;
*handle = obj;
RootAccess<AS_DEST_NOT_INITIALIZED>::oop_store(handle, obj);
return (jobject) handle;
}
// Check if unused block follow last

View File

@ -28,10 +28,8 @@
#include "memory/allocation.hpp"
#include "runtime/handles.hpp"
class JNIHandleBlock;
class OopStorage;
// Interface for creating and resolving local/global JNI handles
class JNIHandles : AllStatic {
@ -41,8 +39,8 @@ class JNIHandles : AllStatic {
static OopStorage* _weak_global_handles;
inline static bool is_jweak(jobject handle);
inline static oop& jobject_ref(jobject handle); // NOT jweak!
inline static oop& jweak_ref(jobject handle);
inline static oop* jobject_ptr(jobject handle); // NOT jweak!
inline static oop* jweak_ptr(jobject handle);
template<bool external_guard> inline static oop resolve_impl(jobject handle);
static oop resolve_jweak(jweak handle);

View File

@ -25,6 +25,7 @@
#ifndef SHARE_RUNTIME_JNIHANDLES_INLINE_HPP
#define SHARE_RUNTIME_JNIHANDLES_INLINE_HPP
#include "oops/access.inline.hpp"
#include "oops/oop.hpp"
#include "runtime/jniHandles.hpp"
#include "utilities/debug.hpp"
@ -36,15 +37,15 @@ inline bool JNIHandles::is_jweak(jobject handle) {
return (reinterpret_cast<uintptr_t>(handle) & weak_tag_mask) != 0;
}
inline oop& JNIHandles::jobject_ref(jobject handle) {
inline oop* JNIHandles::jobject_ptr(jobject handle) {
assert(!is_jweak(handle), "precondition");
return *reinterpret_cast<oop*>(handle);
return reinterpret_cast<oop*>(handle);
}
inline oop& JNIHandles::jweak_ref(jobject handle) {
inline oop* JNIHandles::jweak_ptr(jobject handle) {
assert(is_jweak(handle), "precondition");
char* ptr = reinterpret_cast<char*>(handle) - weak_tag_value;
return *reinterpret_cast<oop*>(ptr);
return reinterpret_cast<oop*>(ptr);
}
// external_guard is true if called from resolve_external_guard.
@ -56,7 +57,7 @@ inline oop JNIHandles::resolve_impl(jobject handle) {
if (is_jweak(handle)) { // Unlikely
result = resolve_jweak(handle);
} else {
result = jobject_ref(handle);
result = RootAccess<IN_CONCURRENT_ROOT>::oop_load(jobject_ptr(handle));
// Construction of jobjects canonicalize a null value into a null
// jobject, so for non-jweak the pointee should never be null.
assert(external_guard || result != NULL, "Invalid JNI handle");
@ -82,7 +83,7 @@ inline oop JNIHandles::resolve_non_null(jobject handle) {
inline void JNIHandles::destroy_local(jobject handle) {
if (handle != NULL) {
assert(!is_jweak(handle), "Invalid JNI local handle");
jobject_ref(handle) = NULL;
RootAccess<>::oop_store(jobject_ptr(handle), (oop)NULL);
}
}