8175917: [JVMCI] Avoid long JNI handle chains

Reviewed-by: never, kvn
This commit is contained in:
Christian Haeubl 2017-02-27 17:36:36 +01:00
parent 9e4e386872
commit 5bd3dfadc6
2 changed files with 38 additions and 0 deletions

View File

@ -56,6 +56,31 @@
#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'.
#define C2V_VMENTRY(result_type, name, signature) \
JNIEXPORT result_type JNICALL c2v_ ## name signature { \
@ -89,6 +114,7 @@ oop CompilerToVM::get_jvmci_type(KlassHandle klass, TRAPS) {
return NULL;
}
int CompilerToVM::Data::Klass_vtable_start_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))
ResourceMark rm;
HandleMark hm;
JNIHandleMark jni_hm;
Handle target_handle = JNIHandles::resolve(target);
Handle compiled_code_handle = JNIHandles::resolve(compiled_code);
CodeBlob* cb = NULL;

View File

@ -206,4 +206,14 @@ class JavaArgumentUnboxer : public SignatureIterator {
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