Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix a potential security hazard
[simgrid.git] / src / bindings / java / JavaContext.cpp
index f371d6f..586fd13 100644 (file)
@@ -6,6 +6,9 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#include <functional>
+#include <utility>
+
 #include <xbt/function_types.h>
 #include <simgrid/simix.h>
 #include <xbt/ex.h>
@@ -41,10 +44,10 @@ JavaContext* JavaContextFactory::self()
 }
 
 JavaContext* JavaContextFactory::create_context(
-  xbt_main_func_t code, int argc, char ** argv,
+  std::function<void()> code,
   void_pfn_smxprocess_t cleanup, smx_process_t process)
 {
-  return this->new_context<JavaContext>(code, argc, argv, cleanup, process);
+  return this->new_context<JavaContext>(std::move(code), cleanup, process);
 }
 
 void JavaContextFactory::run_all()
@@ -58,22 +61,18 @@ void JavaContextFactory::run_all()
 }
 
 
-JavaContext::JavaContext(xbt_main_func_t code,
-        int argc, char **argv,
+JavaContext::JavaContext(std::function<void()> code,
         void_pfn_smxprocess_t cleanup_func,
         smx_process_t process)
-  : Context(code, argc, argv, cleanup_func, process)
+  : Context(std::move(code), cleanup_func, process)
 {
   static int thread_amount=0;
   thread_amount++;
 
   /* 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;
+  if (has_code()) {
+    this->jprocess = nullptr;
     this->begin = xbt_os_sem_init(0);
     this->end = xbt_os_sem_init(0);
 
@@ -116,30 +115,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;
 }