< prev index next >
src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
Print this page
*** 95,112 ****
class JVMCITraceMark : public StackObj {
const char* _msg;
public:
JVMCITraceMark(const char* msg) {
_msg = msg;
! if (JVMCITraceLevel >= 1) {
! tty->print_cr(PTR_FORMAT " JVMCITrace-1: Enter %s", p2i(JavaThread::current()), _msg);
! }
}
~JVMCITraceMark() {
! if (JVMCITraceLevel >= 1) {
! tty->print_cr(PTR_FORMAT " JVMCITrace-1: Exit %s", p2i(JavaThread::current()), _msg);
! }
}
};
Handle JavaArgumentUnboxer::next_arg(BasicType expectedType) {
--- 95,108 ----
class JVMCITraceMark : public StackObj {
const char* _msg;
public:
JVMCITraceMark(const char* msg) {
_msg = msg;
! TRACE_jvmci_2("Enter %s", _msg);
}
~JVMCITraceMark() {
! TRACE_jvmci_2(" Exit %s", _msg);
}
};
Handle JavaArgumentUnboxer::next_arg(BasicType expectedType) {
*** 129,178 ****
TRACE_CALL(result_type, jvmci_ ## name signature) \
JVMCI_VM_ENTRY_MARK; \
ResourceMark rm; \
JNI_JVMCIENV(thread, env);
! static Thread* get_current_thread() {
! return Thread::current_or_null_safe();
}
// 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 { \
! Thread* base_thread = get_current_thread(); \
! if (base_thread == NULL) { \
env->ThrowNew(JNIJVMCI::InternalError::clazz(), \
err_msg("Cannot call into HotSpot from JVMCI shared library without attaching current thread")); \
return; \
} \
- assert(base_thread->is_Java_thread(), "just checking");\
- JavaThread* thread = (JavaThread*) base_thread; \
JVMCITraceMark jtm("CompilerToVM::" #name); \
C2V_BLOCK(result_type, name, signature)
#define C2V_VMENTRY_(result_type, name, signature, result) \
JNIEXPORT result_type JNICALL c2v_ ## name signature { \
! Thread* base_thread = get_current_thread(); \
! if (base_thread == NULL) { \
env->ThrowNew(JNIJVMCI::InternalError::clazz(), \
err_msg("Cannot call into HotSpot from JVMCI shared library without attaching current thread")); \
return result; \
} \
- assert(base_thread->is_Java_thread(), "just checking");\
- JavaThread* thread = (JavaThread*) base_thread; \
JVMCITraceMark jtm("CompilerToVM::" #name); \
C2V_BLOCK(result_type, name, signature)
#define C2V_VMENTRY_NULL(result_type, name, signature) C2V_VMENTRY_(result_type, name, signature, NULL)
#define C2V_VMENTRY_0(result_type, name, signature) C2V_VMENTRY_(result_type, name, signature, 0)
// Entry to native method implementation that does not transition
// current thread to '_thread_in_vm'.
#define C2V_VMENTRY_PREFIX(result_type, name, signature) \
JNIEXPORT result_type JNICALL c2v_ ## name signature { \
! Thread* base_thread = get_current_thread();
#define C2V_END }
#define JNI_THROW(caller, name, msg) do { \
jint __throw_res = env->ThrowNew(JNIJVMCI::name::clazz(), msg); \
--- 125,176 ----
TRACE_CALL(result_type, jvmci_ ## name signature) \
JVMCI_VM_ENTRY_MARK; \
ResourceMark rm; \
JNI_JVMCIENV(thread, env);
! static JavaThread* get_current_thread(bool allow_null=true) {
! Thread* thread = Thread::current_or_null_safe();
! if (thread == NULL) {
! assert(allow_null, "npe");
! return NULL;
! }
! assert(thread->is_Java_thread(), "must be");
! return (JavaThread*) thread;
}
// 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 { \
! JavaThread* thread = get_current_thread(); \
! if (thread == NULL) { \
env->ThrowNew(JNIJVMCI::InternalError::clazz(), \
err_msg("Cannot call into HotSpot from JVMCI shared library without attaching current thread")); \
return; \
} \
JVMCITraceMark jtm("CompilerToVM::" #name); \
C2V_BLOCK(result_type, name, signature)
#define C2V_VMENTRY_(result_type, name, signature, result) \
JNIEXPORT result_type JNICALL c2v_ ## name signature { \
! JavaThread* thread = get_current_thread(); \
! if (thread == NULL) { \
env->ThrowNew(JNIJVMCI::InternalError::clazz(), \
err_msg("Cannot call into HotSpot from JVMCI shared library without attaching current thread")); \
return result; \
} \
JVMCITraceMark jtm("CompilerToVM::" #name); \
C2V_BLOCK(result_type, name, signature)
#define C2V_VMENTRY_NULL(result_type, name, signature) C2V_VMENTRY_(result_type, name, signature, NULL)
#define C2V_VMENTRY_0(result_type, name, signature) C2V_VMENTRY_(result_type, name, signature, 0)
// Entry to native method implementation that does not transition
// current thread to '_thread_in_vm'.
#define C2V_VMENTRY_PREFIX(result_type, name, signature) \
JNIEXPORT result_type JNICALL c2v_ ## name signature { \
! JavaThread* thread = get_current_thread();
#define C2V_END }
#define JNI_THROW(caller, name, msg) do { \
jint __throw_res = env->ThrowNew(JNIJVMCI::name::clazz(), msg); \
*** 1572,1582 ****
// from HotSpot if it wasn't already attached when entering the scope.
extern "C" void jio_printf(const char *fmt, ...);
class AttachDetach : public StackObj {
public:
bool _attached;
! AttachDetach(JNIEnv* env, Thread* current_thread) {
if (current_thread == NULL) {
extern struct JavaVM_ main_vm;
JNIEnv* hotspotEnv;
jint res = main_vm.AttachCurrentThread((void**)&hotspotEnv, NULL);
_attached = res == JNI_OK;
--- 1570,1580 ----
// from HotSpot if it wasn't already attached when entering the scope.
extern "C" void jio_printf(const char *fmt, ...);
class AttachDetach : public StackObj {
public:
bool _attached;
! AttachDetach(JNIEnv* env, JavaThread* current_thread) {
if (current_thread == NULL) {
extern struct JavaVM_ main_vm;
JNIEnv* hotspotEnv;
jint res = main_vm.AttachCurrentThread((void**)&hotspotEnv, NULL);
_attached = res == JNI_OK;
*** 1601,1622 ****
}
}
};
C2V_VMENTRY_PREFIX(jint, writeDebugOutput, (JNIEnv* env, jobject, jbyteArray bytes, jint offset, jint length, bool flush, bool can_throw))
! AttachDetach ad(env, base_thread);
bool use_tty = true;
! if (base_thread == NULL) {
if (!ad._attached) {
// Can only use tty if the current thread is attached
return 0;
}
! base_thread = get_current_thread();
}
JVMCITraceMark jtm("writeDebugOutput");
- assert(base_thread->is_Java_thread(), "just checking");
- JavaThread* thread = (JavaThread*) base_thread;
C2V_BLOCK(void, writeDebugOutput, (JNIEnv* env, jobject, jbyteArray bytes, jint offset, jint length))
if (bytes == NULL) {
if (can_throw) {
JVMCI_THROW_0(NullPointerException);
}
--- 1599,1619 ----
}
}
};
C2V_VMENTRY_PREFIX(jint, writeDebugOutput, (JNIEnv* env, jobject, jbyteArray bytes, jint offset, jint length, bool flush, bool can_throw))
! AttachDetach ad(env, thread);
bool use_tty = true;
! if (thread == NULL) {
if (!ad._attached) {
// Can only use tty if the current thread is attached
+ TRACE_jvmci_1("Cannot write to tty on unattached thread");
return 0;
}
! thread = get_current_thread();
}
JVMCITraceMark jtm("writeDebugOutput");
C2V_BLOCK(void, writeDebugOutput, (JNIEnv* env, jobject, jbyteArray bytes, jint offset, jint length))
if (bytes == NULL) {
if (can_throw) {
JVMCI_THROW_0(NullPointerException);
}
*** 2208,2252 ****
}
C2V_VMENTRY(void, deleteGlobalHandle, (JNIEnv* env, jobject, jlong h))
jobject handle = (jobject)(address)h;
if (handle != NULL) {
! JVMCI::destroy_global(handle);
}
}
static void requireJVMCINativeLibrary(JVMCI_TRAPS) {
if (!UseJVMCINativeLibrary) {
JVMCI_THROW_MSG(UnsupportedOperationException, "JVMCI shared library is not enabled (requires -XX:+UseJVMCINativeLibrary)");
}
}
- static JavaVM* requireNativeLibraryJavaVM(const char* caller, JVMCI_TRAPS) {
- JavaVM* javaVM = JVMCIEnv::get_shared_library_javavm();
- if (javaVM == NULL) {
- JVMCI_THROW_MSG_NULL(IllegalStateException, err_msg("Require JVMCI shared library to be initialized in %s", caller));
- }
- return javaVM;
- }
-
C2V_VMENTRY_NULL(jlongArray, registerNativeMethods, (JNIEnv* env, jobject, jclass mirror))
requireJVMCINativeLibrary(JVMCI_CHECK_NULL);
requireInHotSpot("registerNativeMethods", JVMCI_CHECK_NULL);
! void* shared_library = JVMCIEnv::get_shared_library_handle();
! if (shared_library == NULL) {
// Ensure the JVMCI shared library runtime is initialized.
JVMCIEnv __peer_jvmci_env__(thread, false, __FILE__, __LINE__);
JVMCIEnv* peerEnv = &__peer_jvmci_env__;
HandleMark hm;
- JVMCIRuntime* runtime = JVMCI::compiler_runtime();
JVMCIObject receiver = runtime->get_HotSpotJVMCIRuntime(peerEnv);
if (peerEnv->has_pending_exception()) {
peerEnv->describe_pending_exception(true);
}
! shared_library = JVMCIEnv::get_shared_library_handle();
! if (shared_library == NULL) {
! JVMCI_THROW_MSG_0(InternalError, "Error initializing JVMCI runtime");
}
}
if (mirror == NULL) {
JVMCI_THROW_0(NullPointerException);
--- 2205,2242 ----
}
C2V_VMENTRY(void, deleteGlobalHandle, (JNIEnv* env, jobject, jlong h))
jobject handle = (jobject)(address)h;
if (handle != NULL) {
! JVMCIENV->runtime()->destroy_global(handle);
}
}
static void requireJVMCINativeLibrary(JVMCI_TRAPS) {
if (!UseJVMCINativeLibrary) {
JVMCI_THROW_MSG(UnsupportedOperationException, "JVMCI shared library is not enabled (requires -XX:+UseJVMCINativeLibrary)");
}
}
C2V_VMENTRY_NULL(jlongArray, registerNativeMethods, (JNIEnv* env, jobject, jclass mirror))
requireJVMCINativeLibrary(JVMCI_CHECK_NULL);
requireInHotSpot("registerNativeMethods", JVMCI_CHECK_NULL);
! char* sl_path;
! void* sl_handle;
! JVMCIRuntime* runtime = JVMCI::compiler_runtime();
! {
// Ensure the JVMCI shared library runtime is initialized.
JVMCIEnv __peer_jvmci_env__(thread, false, __FILE__, __LINE__);
JVMCIEnv* peerEnv = &__peer_jvmci_env__;
HandleMark hm;
JVMCIObject receiver = runtime->get_HotSpotJVMCIRuntime(peerEnv);
if (peerEnv->has_pending_exception()) {
peerEnv->describe_pending_exception(true);
}
! sl_handle = JVMCI::get_shared_library(sl_path, false);
! if (sl_handle == NULL) {
! JVMCI_THROW_MSG_0(InternalError, err_msg("Error initializing JVMCI runtime %d", runtime->id()));
}
}
if (mirror == NULL) {
JVMCI_THROW_0(NullPointerException);
*** 2272,2417 ****
os::print_jni_name_prefix_on(&st, args_size);
st.print_raw(pure_name);
os::print_jni_name_suffix_on(&st, args_size);
char* jni_name = st.as_string();
! address entry = (address) os::dll_lookup(shared_library, jni_name);
if (entry == NULL) {
// 2) Try JNI long style
st.reset();
char* long_name = NativeLookup::long_jni_name(method);
os::print_jni_name_prefix_on(&st, args_size);
st.print_raw(pure_name);
st.print_raw(long_name);
os::print_jni_name_suffix_on(&st, args_size);
char* jni_long_name = st.as_string();
! entry = (address) os::dll_lookup(shared_library, jni_long_name);
if (entry == NULL) {
JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [neither %s nor %s exist in %s]",
method->name_and_sig_as_C_string(),
! jni_name, jni_long_name, JVMCIEnv::get_shared_library_path()));
}
}
if (method->has_native_function() && entry != method->native_function()) {
JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [cannot re-link from " PTR_FORMAT " to " PTR_FORMAT "]",
method->name_and_sig_as_C_string(), p2i(method->native_function()), p2i(entry)));
}
method->set_native_function(entry, Method::native_bind_event_is_interesting);
if (PrintJNIResolving) {
! tty->print_cr("[Dynamic-linking native method %s.%s ... JNI]",
method->method_holder()->external_name(),
! method->name()->as_C_string());
}
}
}
! JavaVM* javaVM = JVMCIEnv::get_shared_library_javavm();
! JVMCIPrimitiveArray result = JVMCIENV->new_longArray(4, JVMCI_CHECK_NULL);
! JVMCIENV->put_long_at(result, 0, (jlong) (address) javaVM);
! JVMCIENV->put_long_at(result, 1, (jlong) (address) javaVM->functions->reserved0);
! JVMCIENV->put_long_at(result, 2, (jlong) (address) javaVM->functions->reserved1);
! JVMCIENV->put_long_at(result, 3, (jlong) (address) javaVM->functions->reserved2);
! return (jlongArray) JVMCIENV->get_jobject(result);
}
C2V_VMENTRY_PREFIX(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject c2vm))
! if (base_thread == NULL) {
// Called from unattached JVMCI shared library thread
return false;
}
JVMCITraceMark jtm("isCurrentThreadAttached");
- assert(base_thread->is_Java_thread(), "just checking");
- JavaThread* thread = (JavaThread*) base_thread;
if (thread->jni_environment() == env) {
C2V_BLOCK(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject))
requireJVMCINativeLibrary(JVMCI_CHECK_0);
! JavaVM* javaVM = requireNativeLibraryJavaVM("isCurrentThreadAttached", JVMCI_CHECK_0);
JNIEnv* peerEnv;
! return javaVM->GetEnv((void**)&peerEnv, JNI_VERSION_1_2) == JNI_OK;
}
return true;
C2V_END
C2V_VMENTRY_PREFIX(jlong, getCurrentJavaThread, (JNIEnv* env, jobject c2vm))
! if (base_thread == NULL) {
// Called from unattached JVMCI shared library thread
return 0L;
}
JVMCITraceMark jtm("getCurrentJavaThread");
! assert(base_thread->is_Java_thread(), "just checking");
! return (jlong) p2i(base_thread);
C2V_END
C2V_VMENTRY_PREFIX(jboolean, attachCurrentThread, (JNIEnv* env, jobject c2vm, jboolean as_daemon))
! if (base_thread == NULL) {
// Called from unattached JVMCI shared library thread
extern struct JavaVM_ main_vm;
JNIEnv* hotspotEnv;
! jint res = as_daemon ? main_vm.AttachCurrentThreadAsDaemon((void**)&hotspotEnv, NULL) :
! main_vm.AttachCurrentThread((void**)&hotspotEnv, NULL);
if (res != JNI_OK) {
JNI_THROW_("attachCurrentThread", InternalError, err_msg("Trying to attach thread returned %d", res), false);
}
return true;
}
JVMCITraceMark jtm("attachCurrentThread");
- assert(base_thread->is_Java_thread(), "just checking");\
- JavaThread* thread = (JavaThread*) base_thread;
if (thread->jni_environment() == env) {
// Called from HotSpot
C2V_BLOCK(jboolean, attachCurrentThread, (JNIEnv* env, jobject, jboolean))
requireJVMCINativeLibrary(JVMCI_CHECK_0);
! JavaVM* javaVM = requireNativeLibraryJavaVM("attachCurrentThread", JVMCI_CHECK_0);
JavaVMAttachArgs attach_args;
attach_args.version = JNI_VERSION_1_2;
attach_args.name = thread->name();
attach_args.group = NULL;
! JNIEnv* peerEnv;
! if (javaVM->GetEnv((void**)&peerEnv, JNI_VERSION_1_2) == JNI_OK) {
return false;
}
! jint res = as_daemon ? javaVM->AttachCurrentThreadAsDaemon((void**)&peerEnv, &attach_args) :
! javaVM->AttachCurrentThread((void**)&peerEnv, &attach_args);
if (res == JNI_OK) {
! guarantee(peerEnv != NULL, "must be");
return true;
}
JVMCI_THROW_MSG_0(InternalError, err_msg("Error %d while attaching %s", res, attach_args.name));
}
// Called from JVMCI shared library
return false;
C2V_END
C2V_VMENTRY_PREFIX(void, detachCurrentThread, (JNIEnv* env, jobject c2vm))
! if (base_thread == NULL) {
// Called from unattached JVMCI shared library thread
! JNI_THROW("detachCurrentThread", IllegalStateException, err_msg("Cannot detach non-attached thread"));
}
JVMCITraceMark jtm("detachCurrentThread");
- assert(base_thread->is_Java_thread(), "just checking");\
- JavaThread* thread = (JavaThread*) base_thread;
if (thread->jni_environment() == env) {
// Called from HotSpot
C2V_BLOCK(void, detachCurrentThread, (JNIEnv* env, jobject))
requireJVMCINativeLibrary(JVMCI_CHECK);
requireInHotSpot("detachCurrentThread", JVMCI_CHECK);
! JavaVM* javaVM = requireNativeLibraryJavaVM("detachCurrentThread", JVMCI_CHECK);
! JNIEnv* peerEnv;
! if (javaVM->GetEnv((void**)&peerEnv, JNI_VERSION_1_2) != JNI_OK) {
JVMCI_THROW_MSG(IllegalStateException, err_msg("Cannot detach non-attached thread: %s", thread->name()));
}
! jint res = javaVM->DetachCurrentThread();
if (res != JNI_OK) {
JVMCI_THROW_MSG(InternalError, err_msg("Error %d while attaching %s", res, thread->name()));
}
} else {
// Called from attached JVMCI shared library thread
extern struct JavaVM_ main_vm;
jint res = main_vm.DetachCurrentThread();
if (res != JNI_OK) {
! JNI_THROW("detachCurrentThread", InternalError, err_msg("Cannot detach non-attached thread"));
}
}
C2V_END
C2V_VMENTRY_0(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle))
--- 2262,2409 ----
os::print_jni_name_prefix_on(&st, args_size);
st.print_raw(pure_name);
os::print_jni_name_suffix_on(&st, args_size);
char* jni_name = st.as_string();
! address entry = (address) os::dll_lookup(sl_handle, jni_name);
if (entry == NULL) {
// 2) Try JNI long style
st.reset();
char* long_name = NativeLookup::long_jni_name(method);
os::print_jni_name_prefix_on(&st, args_size);
st.print_raw(pure_name);
st.print_raw(long_name);
os::print_jni_name_suffix_on(&st, args_size);
char* jni_long_name = st.as_string();
! entry = (address) os::dll_lookup(sl_handle, jni_long_name);
if (entry == NULL) {
JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [neither %s nor %s exist in %s]",
method->name_and_sig_as_C_string(),
! jni_name, jni_long_name, sl_path));
}
}
if (method->has_native_function() && entry != method->native_function()) {
JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [cannot re-link from " PTR_FORMAT " to " PTR_FORMAT "]",
method->name_and_sig_as_C_string(), p2i(method->native_function()), p2i(entry)));
}
method->set_native_function(entry, Method::native_bind_event_is_interesting);
if (PrintJNIResolving) {
! tty->print_cr("[Dynamic-linking native method %s.%s ... JNI] @ " PTR_FORMAT,
method->method_holder()->external_name(),
! method->name()->as_C_string(), p2i((void*) entry));
}
}
}
! typeArrayOop info_oop = oopFactory::new_longArray(4, CHECK_0);
! jlongArray info = (jlongArray) JNIHandles::make_local(info_oop);
! runtime->init_JavaVM_info(info, JVMCI_CHECK_0);
! return info;
}
C2V_VMENTRY_PREFIX(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject c2vm))
! if (thread == NULL) {
// Called from unattached JVMCI shared library thread
return false;
}
JVMCITraceMark jtm("isCurrentThreadAttached");
if (thread->jni_environment() == env) {
C2V_BLOCK(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject))
requireJVMCINativeLibrary(JVMCI_CHECK_0);
! JVMCIRuntime* runtime = JVMCI::compiler_runtime();
! if (runtime == NULL || !runtime->has_shared_library_javavm()) {
! JVMCI_THROW_MSG_0(IllegalStateException, "Require JVMCI shared library JavaVM to be initialized in isCurrentThreadAttached");
! }
JNIEnv* peerEnv;
! return runtime->GetEnv(thread, (void**) &peerEnv, JNI_VERSION_1_2) == JNI_OK;
}
return true;
C2V_END
C2V_VMENTRY_PREFIX(jlong, getCurrentJavaThread, (JNIEnv* env, jobject c2vm))
! if (thread == NULL) {
// Called from unattached JVMCI shared library thread
return 0L;
}
JVMCITraceMark jtm("getCurrentJavaThread");
! return (jlong) p2i(thread);
C2V_END
C2V_VMENTRY_PREFIX(jboolean, attachCurrentThread, (JNIEnv* env, jobject c2vm, jboolean as_daemon))
! if (thread == NULL) {
// Called from unattached JVMCI shared library thread
extern struct JavaVM_ main_vm;
JNIEnv* hotspotEnv;
! jint res = as_daemon ? main_vm.AttachCurrentThreadAsDaemon((void**) &hotspotEnv, NULL) :
! main_vm.AttachCurrentThread((void**) &hotspotEnv, NULL);
if (res != JNI_OK) {
JNI_THROW_("attachCurrentThread", InternalError, err_msg("Trying to attach thread returned %d", res), false);
}
return true;
}
JVMCITraceMark jtm("attachCurrentThread");
if (thread->jni_environment() == env) {
// Called from HotSpot
C2V_BLOCK(jboolean, attachCurrentThread, (JNIEnv* env, jobject, jboolean))
requireJVMCINativeLibrary(JVMCI_CHECK_0);
! JVMCIRuntime* runtime = JVMCI::compiler_runtime();
! if (runtime == NULL || !runtime->has_shared_library_javavm()) {
! JVMCI_THROW_MSG_0(IllegalStateException, "Require JVMCI shared library JavaVM to be initialized in attachCurrentThread");
! }
!
JavaVMAttachArgs attach_args;
attach_args.version = JNI_VERSION_1_2;
attach_args.name = thread->name();
attach_args.group = NULL;
! JNIEnv* peerJNIEnv;
! if (runtime->GetEnv(thread, (void**) &peerJNIEnv, JNI_VERSION_1_2) == JNI_OK) {
return false;
}
! jint res = as_daemon ? runtime->AttachCurrentThreadAsDaemon(thread, (void**) &peerJNIEnv, &attach_args) :
! runtime->AttachCurrentThread(thread, (void**) &peerJNIEnv, &attach_args);
!
if (res == JNI_OK) {
! guarantee(peerJNIEnv != NULL, "must be");
! TRACE_jvmci_1("attached to JavaVM for JVMCI runtime %d", runtime->id());
return true;
}
JVMCI_THROW_MSG_0(InternalError, err_msg("Error %d while attaching %s", res, attach_args.name));
}
// Called from JVMCI shared library
return false;
C2V_END
C2V_VMENTRY_PREFIX(void, detachCurrentThread, (JNIEnv* env, jobject c2vm))
! if (thread == NULL) {
// Called from unattached JVMCI shared library thread
! JNI_THROW("detachCurrentThread", IllegalStateException, "Cannot detach non-attached thread");
}
JVMCITraceMark jtm("detachCurrentThread");
if (thread->jni_environment() == env) {
// Called from HotSpot
C2V_BLOCK(void, detachCurrentThread, (JNIEnv* env, jobject))
requireJVMCINativeLibrary(JVMCI_CHECK);
requireInHotSpot("detachCurrentThread", JVMCI_CHECK);
! JVMCIRuntime* runtime = JVMCI::compiler_runtime();
! if (runtime == NULL || !runtime->has_shared_library_javavm()) {
! JVMCI_THROW_MSG(IllegalStateException, "Require JVMCI shared library JavaVM to be initialized in detachCurrentThread");
! }
! JNIEnv* peerJNIEnv;
! if (runtime->GetEnv(thread, (void**) &peerJNIEnv, JNI_VERSION_1_2) != JNI_OK) {
JVMCI_THROW_MSG(IllegalStateException, err_msg("Cannot detach non-attached thread: %s", thread->name()));
}
! jint res = runtime->DetachCurrentThread(thread);
if (res != JNI_OK) {
JVMCI_THROW_MSG(InternalError, err_msg("Error %d while attaching %s", res, thread->name()));
}
} else {
// Called from attached JVMCI shared library thread
extern struct JavaVM_ main_vm;
jint res = main_vm.DetachCurrentThread();
if (res != JNI_OK) {
! JNI_THROW("detachCurrentThread", InternalError, "Cannot detach non-attached thread");
}
}
C2V_END
C2V_VMENTRY_0(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle))
< prev index next >