< 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 >