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"
|
||||
|
||||
|
||||
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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user