Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[java] Remove org.simgrid.msg.Process to xbt_main_func_t cast hack
authorGabriel Corona <gabriel.corona@loria.fr>
Tue, 8 Dec 2015 11:05:24 +0000 (12:05 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Tue, 8 Dec 2015 11:07:54 +0000 (12:07 +0100)
src/bindings/java/JavaContext.cpp
src/bindings/java/JavaContext.hpp
src/bindings/java/jmsg.cpp
src/bindings/java/jmsg_process.cpp

index f371d6f..12ebf6a 100644 (file)
@@ -70,10 +70,7 @@ JavaContext::JavaContext(xbt_main_func_t code,
   /* If the user provided a function for the process then use it
      otherwise is the context for maestro */
   if (code) {
-    if (argc == 0)
-      this->jprocess = (jobject) code;
-    else
-      this->jprocess = nullptr;
+    this->jprocess = nullptr;
     this->begin = xbt_os_sem_init(0);
     this->end = xbt_os_sem_init(0);
 
@@ -116,30 +113,7 @@ void* JavaContext::wrapper(void *data)
   //Wait for the first scheduling round to happen.
   xbt_os_sem_acquire(context->begin);
   //Create the "Process" object if needed.
-  if (context->argc_ > 0)
-    (*context)();
-  else {
-    smx_process_t process = SIMIX_process_self();
-    env->SetLongField(context->jprocess, jprocess_field_Process_bind,
-                         (intptr_t)process);
-  }
-
-  // Adrien, ugly path, just to bypass creation of context at low levels
-  // (i.e such as for the VM migration for instance)
-  if (context->jprocess != nullptr){
-    xbt_assert((context->jprocess != nullptr), "Process not created...");
-    //wait for the process to be able to begin
-    //TODO: Cache it
-    jfieldID jprocess_field_Process_startTime = jxbt_get_sfield(env, "org/simgrid/msg/Process", "startTime", "D");
-    jdouble startTime =  env->GetDoubleField(context->jprocess, jprocess_field_Process_startTime);
-    if (startTime > MSG_get_clock()) {
-      MSG_process_sleep(startTime - MSG_get_clock());
-    }
-    //Execution of the "run" method.
-    jmethodID id = jxbt_get_smethod(env, "org/simgrid/msg/Process", "run", "()V");
-    xbt_assert( (id != nullptr), "Method not found...");
-    env->CallVoidMethod(context->jprocess, id);
-  }
+  (*context)();
   context->stop();
   return nullptr;
 }
index fbad882..164732a 100644 (file)
@@ -27,14 +27,14 @@ class JavacontextFactory;
 class JavaContext : public simgrid::simix::Context {
 public:
   // The java process instance bound with the msg process structure:
-  jobject jprocess;
+  jobject jprocess = nullptr;
   // JNI interface pointer associated to this thread:
-  JNIEnv *jenv;
-  xbt_os_thread_t thread;
+  JNIEnv *jenv = nullptr;
+  xbt_os_thread_t thread = nullptr;
   // Sempahore used to schedule/yield the process:
-  xbt_os_sem_t begin;
+  xbt_os_sem_t begin = nullptr;
   // Semaphore used to schedule/unschedule the process:
-  xbt_os_sem_t end;
+  xbt_os_sem_t end = nullptr;
 public:
   friend class JavaContextFactory;
   JavaContext(xbt_main_func_t code,
@@ -62,6 +62,7 @@ public:
 };
 
 XBT_PRIVATE simgrid::simix::ContextFactory* java_factory();
+XBT_PRIVATE int java_main(int argc, char *argv[]);
 
 }
 }
index 4a7d546..aea5885 100644 (file)
@@ -39,8 +39,6 @@ SG_BEGIN_DECL()
 int JAVA_HOST_LEVEL;
 int JAVA_STORAGE_LEVEL;
 
-static int create_jprocess(int argc, char *argv[]);
-
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
 
 JavaVM *__java_vm = NULL;
@@ -260,7 +258,7 @@ Java_org_simgrid_msg_Msg_deployApplication(JNIEnv * env, jclass cls,
   const char *deploymentFile =
       env->GetStringUTFChars(jdeploymentFile, 0);
 
-  SIMIX_function_register_default(create_jprocess);
+  SIMIX_function_register_default(simgrid::java::java_main);
   MSG_launch_application(deploymentFile);
 }
 /**
@@ -310,3 +308,46 @@ static int create_jprocess(int argc, char *argv[]) {
 }
 
 SG_END_DECL()
+
+
+
+namespace simgrid {
+namespace java {
+
+int java_main(int argc, char *argv[])
+{
+  JNIEnv *env = get_current_thread_env();
+  simgrid::java::JavaContext* context =
+    (simgrid::java::JavaContext*) SIMIX_context_self();
+
+  if (argc > 0)
+    create_jprocess(argc, argv);
+  else {
+    smx_process_t process = SIMIX_process_self();
+    context->jprocess = (jobject) MSG_process_get_data(process);
+    jprocess_bind(context->jprocess, process, env);
+  }
+
+  // Adrien, ugly path, just to bypass creation of context at low levels
+  // (i.e such as for the VM migration for instance)
+  if (context->jprocess != nullptr){
+    xbt_assert((context->jprocess != nullptr), "Process not created...");
+    //wait for the process to be able to begin
+    //TODO: Cache it
+    jfieldID jprocess_field_Process_startTime = jxbt_get_sfield(env, "org/simgrid/msg/Process", "startTime", "D");
+    jdouble startTime =  env->GetDoubleField(context->jprocess, jprocess_field_Process_startTime);
+    if (startTime > MSG_get_clock()) {
+      MSG_process_sleep(startTime - MSG_get_clock());
+    }
+    //Execution of the "run" method.
+    jmethodID id = jxbt_get_smethod(env, "org/simgrid/msg/Process", "run", "()V");
+    xbt_assert( (id != nullptr), "Method not found...");
+    env->CallVoidMethod(context->jprocess, id);
+  }
+
+  return 0;
+}
+
+}
+}
+
index f8daf99..3684a16 100644 (file)
@@ -105,6 +105,7 @@ Java_org_simgrid_msg_Process_nativeInit(JNIEnv *env, jclass cls) {
     jxbt_throw_native(env,bprintf("Can't find some fields in Java class. You should report this bug."));
   }
 }
+
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_Process_create(JNIEnv * env,
                                     jobject jprocess_arg,
@@ -152,8 +153,7 @@ Java_org_simgrid_msg_Process_create(JNIEnv * env,
   jdouble jkill = env->GetDoubleField(jprocess, jprocess_field_Process_killTime);
   /* Actually build the MSG process */
   process = MSG_process_create_with_environment(name,
-                                               (xbt_main_func_t) jprocess,
-                                               /*data*/ jprocess,
+                                               simgrid::java::java_main, jprocess,
                                                host,
                                                /*argc, argv, properties*/
                                                0,NULL,NULL);