< prev index next >

src/hotspot/share/prims/jni.cpp

Print this page

        

*** 23,32 **** --- 23,33 ---- * */ #include "precompiled.hpp" #include "jni.h" + #include "jvm.h" #include "ci/ciReplay.hpp" #include "classfile/altHashing.hpp" #include "classfile/classFileStream.hpp" #include "classfile/classLoader.hpp" #include "classfile/javaClasses.hpp"
*** 53,63 **** #include "oops/typeArrayKlass.hpp" #include "oops/typeArrayOop.hpp" #include "prims/jniCheck.hpp" #include "prims/jniExport.hpp" #include "prims/jniFastGetField.hpp" - #include "prims/jvm.h" #include "prims/jvm_misc.hpp" #include "prims/jvmtiExport.hpp" #include "prims/jvmtiThreadState.hpp" #include "runtime/atomic.hpp" #include "runtime/compilationPolicy.hpp" --- 54,63 ----
*** 261,271 **** // Wrapper to trace JNI functions #ifdef ASSERT Histogram* JNIHistogram; ! static volatile jint JNIHistogram_lock = 0; class JNIHistogramElement : public HistogramElement { public: JNIHistogramElement(const char* name); }; --- 261,271 ---- // Wrapper to trace JNI functions #ifdef ASSERT Histogram* JNIHistogram; ! static volatile int JNIHistogram_lock = 0; class JNIHistogramElement : public HistogramElement { public: JNIHistogramElement(const char* name); };
*** 3275,3287 **** JNI_END // Initialization state for three routines below relating to // java.nio.DirectBuffers ! static jint directBufferSupportInitializeStarted = 0; ! static volatile jint directBufferSupportInitializeEnded = 0; ! static volatile jint directBufferSupportInitializeFailed = 0; static jclass bufferClass = NULL; static jclass directBufferClass = NULL; static jclass directByteBufferClass = NULL; static jmethodID directByteBufferConstructor = NULL; static jfieldID directBufferAddressField = NULL; --- 3275,3287 ---- JNI_END // Initialization state for three routines below relating to // java.nio.DirectBuffers ! static int directBufferSupportInitializeStarted = 0; ! static volatile int directBufferSupportInitializeEnded = 0; ! static volatile int directBufferSupportInitializeFailed = 0; static jclass bufferClass = NULL; static jclass directBufferClass = NULL; static jclass directByteBufferClass = NULL; static jmethodID directByteBufferConstructor = NULL; static jfieldID directBufferAddressField = NULL;
*** 3842,3854 **** // Forward declaration extern const struct JNIInvokeInterface_ jni_InvokeInterface; // Global invocation API vars ! volatile jint vm_created = 0; // Indicate whether it is safe to recreate VM ! volatile jint safe_to_recreate_vm = 1; struct JavaVM_ main_vm = {&jni_InvokeInterface}; #define JAVASTACKSIZE (400 * 1024) /* Default size of a thread java stack */ enum { VERIFY_NONE, VERIFY_REMOTE, VERIFY_ALL }; --- 3842,3854 ---- // Forward declaration extern const struct JNIInvokeInterface_ jni_InvokeInterface; // Global invocation API vars ! volatile int vm_created = 0; // Indicate whether it is safe to recreate VM ! volatile int safe_to_recreate_vm = 1; struct JavaVM_ main_vm = {&jni_InvokeInterface}; #define JAVASTACKSIZE (400 * 1024) /* Default size of a thread java stack */ enum { VERIFY_NONE, VERIFY_REMOTE, VERIFY_ALL };
*** 4043,4053 **** // See bug 4367188, the wrapper can sometimes cause VM crashes // JNIWrapper("GetCreatedJavaVMs"); HOTSPOT_JNI_GETCREATEDJAVAVMS_ENTRY((void **) vm_buf, bufLen, (uintptr_t *) numVMs); ! if (vm_created) { if (numVMs != NULL) *numVMs = 1; if (bufLen > 0) *vm_buf = (JavaVM *)(&main_vm); } else { if (numVMs != NULL) *numVMs = 0; } --- 4043,4053 ---- // See bug 4367188, the wrapper can sometimes cause VM crashes // JNIWrapper("GetCreatedJavaVMs"); HOTSPOT_JNI_GETCREATEDJAVAVMS_ENTRY((void **) vm_buf, bufLen, (uintptr_t *) numVMs); ! if (vm_created == 1) { if (numVMs != NULL) *numVMs = 1; if (bufLen > 0) *vm_buf = (JavaVM *)(&main_vm); } else { if (numVMs != NULL) *numVMs = 0; }
*** 4063,4073 **** static jint JNICALL jni_DestroyJavaVM_inner(JavaVM *vm) { HOTSPOT_JNI_DESTROYJAVAVM_ENTRY(vm); jint res = JNI_ERR; DT_RETURN_MARK(DestroyJavaVM, jint, (const jint&)res); ! if (!vm_created) { res = JNI_ERR; return res; } JNIWrapper("DestroyJavaVM"); --- 4063,4073 ---- static jint JNICALL jni_DestroyJavaVM_inner(JavaVM *vm) { HOTSPOT_JNI_DESTROYJAVAVM_ENTRY(vm); jint res = JNI_ERR; DT_RETURN_MARK(DestroyJavaVM, jint, (const jint&)res); ! if (vm_created == 0) { res = JNI_ERR; return res; } JNIWrapper("DestroyJavaVM");
*** 4084,4094 **** // Since this is not a JVM_ENTRY we have to set the thread state manually before entering. JavaThread* thread = JavaThread::current(); ThreadStateTransition::transition_from_native(thread, _thread_in_vm); if (Threads::destroy_vm()) { // Should not change thread state, VM is gone ! vm_created = false; res = JNI_OK; return res; } else { ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native); res = JNI_ERR; --- 4084,4094 ---- // Since this is not a JVM_ENTRY we have to set the thread state manually before entering. JavaThread* thread = JavaThread::current(); ThreadStateTransition::transition_from_native(thread, _thread_in_vm); if (Threads::destroy_vm()) { // Should not change thread state, VM is gone ! vm_created = 0; res = JNI_OK; return res; } else { ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native); res = JNI_ERR;
*** 4224,4234 **** } jint JNICALL jni_AttachCurrentThread(JavaVM *vm, void **penv, void *_args) { HOTSPOT_JNI_ATTACHCURRENTTHREAD_ENTRY(vm, penv, _args); ! if (!vm_created) { HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN((uint32_t) JNI_ERR); return JNI_ERR; } JNIWrapper("AttachCurrentThread"); --- 4224,4234 ---- } jint JNICALL jni_AttachCurrentThread(JavaVM *vm, void **penv, void *_args) { HOTSPOT_JNI_ATTACHCURRENTTHREAD_ENTRY(vm, penv, _args); ! if (vm_created == 0) { HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN((uint32_t) JNI_ERR); return JNI_ERR; } JNIWrapper("AttachCurrentThread");
*** 4283,4293 **** jint JNICALL jni_GetEnv(JavaVM *vm, void **penv, jint version) { HOTSPOT_JNI_GETENV_ENTRY(vm, penv, version); jint ret = JNI_ERR; DT_RETURN_MARK(GetEnv, jint, (const jint&)ret); ! if (!vm_created) { *penv = NULL; ret = JNI_EDETACHED; return ret; } --- 4283,4293 ---- jint JNICALL jni_GetEnv(JavaVM *vm, void **penv, jint version) { HOTSPOT_JNI_GETENV_ENTRY(vm, penv, version); jint ret = JNI_ERR; DT_RETURN_MARK(GetEnv, jint, (const jint&)ret); ! if (vm_created == 0) { *penv = NULL; ret = JNI_EDETACHED; return ret; }
*** 4334,4344 **** } jint JNICALL jni_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *_args) { HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_ENTRY(vm, penv, _args); ! if (!vm_created) { HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_RETURN((uint32_t) JNI_ERR); return JNI_ERR; } JNIWrapper("AttachCurrentThreadAsDaemon"); --- 4334,4344 ---- } jint JNICALL jni_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *_args) { HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_ENTRY(vm, penv, _args); ! if (vm_created == 0) { HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_RETURN((uint32_t) JNI_ERR); return JNI_ERR; } JNIWrapper("AttachCurrentThreadAsDaemon");
< prev index next >