8175917: [JVMCI] Avoid long JNI handle chains
Reviewed-by: never, kvn
This commit is contained in:
parent
9e4e386872
commit
5bd3dfadc6
@ -56,6 +56,31 @@
|
|||||||
#include "utilities/resourceHash.hpp"
|
#include "utilities/resourceHash.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
void JNIHandleMark::push_jni_handle_block() {
|
||||||
|
JavaThread* thread = JavaThread::current();
|
||||||
|
if (thread != NULL) {
|
||||||
|
// Allocate a new block for JNI handles.
|
||||||
|
// Inlined code from jni_PushLocalFrame()
|
||||||
|
JNIHandleBlock* java_handles = ((JavaThread*)thread)->active_handles();
|
||||||
|
JNIHandleBlock* compile_handles = JNIHandleBlock::allocate_block(thread);
|
||||||
|
assert(compile_handles != NULL && java_handles != NULL, "should not be NULL");
|
||||||
|
compile_handles->set_pop_frame_link(java_handles);
|
||||||
|
thread->set_active_handles(compile_handles);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JNIHandleMark::pop_jni_handle_block() {
|
||||||
|
JavaThread* thread = JavaThread::current();
|
||||||
|
if (thread != NULL) {
|
||||||
|
// Release our JNI handle block
|
||||||
|
JNIHandleBlock* compile_handles = thread->active_handles();
|
||||||
|
JNIHandleBlock* java_handles = compile_handles->pop_frame_link();
|
||||||
|
thread->set_active_handles(java_handles);
|
||||||
|
compile_handles->set_pop_frame_link(NULL);
|
||||||
|
JNIHandleBlock::release_block(compile_handles, thread); // may block
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Entry to native method implementation that transitions current thread to '_thread_in_vm'.
|
// Entry to native method implementation that transitions current thread to '_thread_in_vm'.
|
||||||
#define C2V_VMENTRY(result_type, name, signature) \
|
#define C2V_VMENTRY(result_type, name, signature) \
|
||||||
JNIEXPORT result_type JNICALL c2v_ ## name signature { \
|
JNIEXPORT result_type JNICALL c2v_ ## name signature { \
|
||||||
@ -89,6 +114,7 @@ oop CompilerToVM::get_jvmci_type(KlassHandle klass, TRAPS) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int CompilerToVM::Data::Klass_vtable_start_offset;
|
int CompilerToVM::Data::Klass_vtable_start_offset;
|
||||||
int CompilerToVM::Data::Klass_vtable_length_offset;
|
int CompilerToVM::Data::Klass_vtable_length_offset;
|
||||||
|
|
||||||
@ -985,6 +1011,8 @@ C2V_END
|
|||||||
C2V_VMENTRY(jint, installCode, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject installed_code, jobject speculation_log))
|
C2V_VMENTRY(jint, installCode, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject installed_code, jobject speculation_log))
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
HandleMark hm;
|
HandleMark hm;
|
||||||
|
JNIHandleMark jni_hm;
|
||||||
|
|
||||||
Handle target_handle = JNIHandles::resolve(target);
|
Handle target_handle = JNIHandles::resolve(target);
|
||||||
Handle compiled_code_handle = JNIHandles::resolve(compiled_code);
|
Handle compiled_code_handle = JNIHandles::resolve(compiled_code);
|
||||||
CodeBlob* cb = NULL;
|
CodeBlob* cb = NULL;
|
||||||
|
@ -206,4 +206,14 @@ class JavaArgumentUnboxer : public SignatureIterator {
|
|||||||
inline void do_void() { }
|
inline void do_void() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class JNIHandleMark : public StackObj {
|
||||||
|
public:
|
||||||
|
JNIHandleMark() { push_jni_handle_block(); }
|
||||||
|
~JNIHandleMark() { pop_jni_handle_block(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void push_jni_handle_block();
|
||||||
|
static void pop_jni_handle_block();
|
||||||
|
};
|
||||||
|
|
||||||
#endif // SHARE_VM_JVMCI_JVMCI_COMPILER_TO_VM_HPP
|
#endif // SHARE_VM_JVMCI_JVMCI_COMPILER_TO_VM_HPP
|
||||||
|
Loading…
x
Reference in New Issue
Block a user