/* 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);
//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;
}
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,
};
XBT_PRIVATE simgrid::simix::ContextFactory* java_factory();
+XBT_PRIVATE int java_main(int argc, char *argv[]);
}
}
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;
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);
}
/**
}
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;
+}
+
+}
+}
+
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,
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);