Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Stop using JNI_GetCreatedJavaVMs, cache the java_vm object
authorSamuel Lepetit <samuel.lepetit@inria.fr>
Wed, 23 May 2012 13:31:58 +0000 (15:31 +0200)
committerSamuel Lepetit <samuel.lepetit@inria.fr>
Wed, 23 May 2012 13:31:58 +0000 (15:31 +0200)
src/jmsg.c
src/jmsg.h
src/smx_context_java.c

index 7ace464..aaf5b10 100644 (file)
@@ -34,8 +34,7 @@ static int create_jprocess(int argc, char *argv[]);
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
 
-static JavaVM *__java_vm = NULL;
-
+JavaVM *__java_vm = NULL;
 
 JavaVM *get_java_VM(void)
 {
@@ -86,6 +85,8 @@ Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs)
   jstring jval;
   const char *tmp;
 
+  (*env)->GetJavaVM(env, &__java_vm);
+
   smx_factory_initializer_to_use = SIMIX_ctx_java_factory_init;
 
   setlocale(LC_NUMERIC,"C");
@@ -111,8 +112,6 @@ Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs)
     free(argv[index]);
 
   free(argv);
-
-  (*env)->GetJavaVM(env, &__java_vm);
 }
 
 JNIEXPORT void JNICALL
index c8a3f15..16c10fb 100644 (file)
@@ -12,7 +12,6 @@
 #include <jni.h>
 
 JavaVM *get_java_VM(void);
-
 JNIEnv *get_current_thread_env(void);
 /**
  * This function throws the correct exception according to the status
index 26e54ba..b327df5 100644 (file)
 #include "smx_context_java.h"
 #include "jxbt_utilities.h"
 #include "xbt/dynar.h"
-JavaVM *get_current_vm(void);
-JavaVM *get_current_vm(void)
-{
-       JavaVM *jvm;
-       JNI_GetCreatedJavaVMs(&jvm,1,NULL);
-  return jvm;
-}
-
-
+extern JavaVM *__java_vm;
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(jmsg, bindings, "MSG for Java(TM)");
 
@@ -98,8 +90,7 @@ static void* smx_ctx_java_thread_run(void *data) {
        xbt_os_thread_set_extra_data(context);
        //Attach the thread to the JVM
        JNIEnv *env;
-       JavaVM *jvm = get_current_vm();
-  jint error = (*jvm)->AttachCurrentThread(jvm, (void **) &env, NULL);
+  jint error = (*__java_vm)->AttachCurrentThread(__java_vm, (void **) &env, NULL);
   xbt_assert((error == JNI_OK), "The thread could not be attached to the JVM");
   context->jenv = get_current_thread_env();
   //Wait for the first scheduling round to happen.
@@ -154,8 +145,7 @@ void smx_ctx_java_stop(smx_context_t context)
                /* detach the thread and kills it */
                JNIEnv *env = ctx_java->jenv;
                (*env)->DeleteGlobalRef(env,ctx_java->jprocess);
-               JavaVM *jvm = get_current_vm();
-               jint error = (*jvm)->DetachCurrentThread(jvm);
+               jint error = (*__java_vm)->DetachCurrentThread(__java_vm);
                xbt_assert((error == JNI_OK), "The thread couldn't be detached.");
                xbt_os_sem_release(((smx_ctx_java_t)context)->end);
                xbt_os_thread_exit(NULL);