/* This function creates a MSG process. It has the prototype enforced by SIMIX_function_register_process_create */ smx_actor_t MSG_process_create_from_SIMIX( const char *name, std::function<void()> code, void *data, sg_host_t host, double kill_time, xbt_dict_t properties, int auto_restart, smx_actor_t parent_process) { msg_process_t p = MSG_process_create_with_environment(name, std::move(code), data, host, properties); if (p) { MSG_process_set_kill_time(p,kill_time); MSG_process_auto_restart_set(p,auto_restart); } return p; }
/* This function creates a MSG process. It has the prototype enforced by SIMIX_function_register_process_create */ void MSG_process_create_from_SIMIX(smx_process_t* process, const char *name, xbt_main_func_t code, void *data, const char *hostname, double kill_time, int argc, char **argv, xbt_dict_t properties, int auto_restart) { msg_host_t host = MSG_get_host_by_name(hostname); msg_process_t p = MSG_process_create_with_environment(name, code, data, host, argc, argv, properties); if (p) { MSG_process_set_kill_time(p,kill_time); MSG_process_auto_restart_set(p,auto_restart); } *((msg_process_t*) process) = p; }
JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_setKillTime (JNIEnv *env , jobject jprocess, jdouble jkilltime) { msg_process_t process = jprocess_to_native_process(jprocess, env); MSG_process_set_kill_time(process, (double)jkilltime); }
JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_create(JNIEnv * env, jobject jprocess_arg, jobject jhostname) { jobject jprocess; /* the global reference to the java process instance */ jstring jname; /* the name of the java process instance */ const char *name; /* the C name of the process */ const char *hostname; msg_process_t process; /* the native process to create */ msg_host_t host; /* Where that process lives */ hostname = (*env)->GetStringUTFChars(env, jhostname, 0); /* get the name of the java process */ jname = jprocess_get_name(jprocess_arg, env); if (!jname) { jxbt_throw_null(env, xbt_strdup("Internal error: Process name cannot be NULL")); return; } /* bind/retrieve the msg host */ host = MSG_host_by_name(hostname); if (!(host)) { /* not bound */ jxbt_throw_host_not_found(env, hostname); return; } /* create a global java process instance */ jprocess = jprocess_new_global_ref(jprocess_arg, env); if (!jprocess) { jxbt_throw_jni(env, "Can't get a global ref to the java process"); return; } /* build the C name of the process */ name = (*env)->GetStringUTFChars(env, jname, 0); name = xbt_strdup(name); /* Retrieve the kill time from the process */ jdouble jkill = (*env)->GetDoubleField(env, jprocess, jprocess_field_Process_killTime); /* Actually build the MSG process */ process = MSG_process_create_with_environment(name, (xbt_main_func_t) jprocess, /*data*/ jprocess, host, /*argc, argv, properties*/ 0,NULL,NULL); MSG_process_set_kill_time(process, (double)jkill); /* bind the java process instance to the native process */ jprocess_bind(jprocess, process, env); /* release our reference to the process name (variable name becomes invalid) */ //FIXME : This line should be uncommented but with mac it doesn't work. BIG WARNING //(*env)->ReleaseStringUTFChars(env, jname, name); (*env)->ReleaseStringUTFChars(env, jhostname, hostname); /* sets the PID and the PPID of the process */ (*env)->SetIntField(env, jprocess, jprocess_field_Process_pid,(jint) MSG_process_get_PID(process)); (*env)->SetIntField(env, jprocess, jprocess_field_Process_ppid, (jint) MSG_process_get_PPID(process)); /* sets the Host of the process */ jobject jhost = Java_org_simgrid_msg_Host_getByName(env,NULL,jhostname); (*env)->SetObjectField(env, jprocess, jprocess_field_Process_host, jhost); }