X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5724727de91d9bdecc5c89ce31ab12acde2e1232..773834eae5b4c5d52e54bbd464442833dbdcfeef:/src/jmsg.c diff --git a/src/jmsg.c b/src/jmsg.c index 2013fd25c2..f10f465b1c 100644 --- a/src/jmsg.c +++ b/src/jmsg.c @@ -20,6 +20,15 @@ #include "jmsg.h" +/* Shut up some errors in eclipse online compiler. I wish such a pimple wouldn't be needed */ +#ifndef JNIEXPORT +#define JNIEXPORT +#endif +#ifndef JNICALL +#define JNICALL +#endif +/* end of eclipse-mandated pimple */ + XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg); static JavaVM *__java_vm = NULL; @@ -131,6 +140,22 @@ Java_org_simgrid_msg_MsgNative_processSuspend(JNIEnv * env, jclass cls, } +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Process_simulatedSleep(JNIEnv * env, jobject jprocess, + jdouble jseconds) { + m_process_t process = jprocess_to_native_process(jprocess, env); + + if (!process) { + jxbt_throw_notbound(env, "process", jprocess); + return; + } + MSG_error_t rv = MSG_process_sleep((double)jseconds); + + jxbt_check_res("MSG_process_sleep()", rv, MSG_OK, + bprintf("unexpected error , please report this bug")); +} + + JNIEXPORT void JNICALL Java_org_simgrid_msg_MsgNative_processResume(JNIEnv * env, jclass cls, jobject jprocess) @@ -340,7 +365,7 @@ Java_org_simgrid_msg_MsgNative_hostGetByName(JNIEnv * env, jclass cls, if (!MSG_host_get_data(host)) { /* native host not associated yet with java host */ - /* instanciate a new java host */ + /* Instantiate a new java host */ jhost = jhost_new_instance(env); if (!jhost) { @@ -781,7 +806,7 @@ Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs) argc = (int) (*env)->GetArrayLength(env, jargs); argc++; - argv = xbt_new0(char *, argc); + argv = xbt_new(char *, argc + 1); argv[0] = strdup("java"); for (index = 0; index < argc - 1; index++) { @@ -790,6 +815,7 @@ Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs) argv[index + 1] = strdup(tmp); (*env)->ReleaseStringUTFChars(env, jval, tmp); } + argv[argc] = NULL; MSG_global_init(&argc, argv); @@ -957,6 +983,41 @@ Java_org_simgrid_msg_MsgNative_taskSend(JNIEnv * env, jclass cls, MSG_task_get_name(task), alias)); } +static void msg_task_cancel_on_failed_dsend(void*t) { + m_task_t task = t; + JNIEnv *env =get_current_thread_env(); + jobject jtask_global = MSG_task_get_data(task); + + /* Destroy the global ref so that the JVM can free the stuff */ + (*env)->DeleteGlobalRef(env, jtask_global); + MSG_task_set_data(task, NULL); + MSG_task_destroy(task); +} + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_MsgNative_taskDSend(JNIEnv * env, jclass cls, + jstring jalias, jobject jtask) +{ + + const char *alias = (*env)->GetStringUTFChars(env, jalias, 0); + + m_task_t task = jtask_to_native_task(jtask, env); + + + if (!task) { + (*env)->ReleaseStringUTFChars(env, jalias, alias); + jxbt_throw_notbound(env, "task", jtask); + return; + } + + /* Pass a global ref to the Jtask into the Ctask so that the receiver can use it */ + MSG_task_set_data(task, (void *) (*env)->NewGlobalRef(env, jtask)); + MSG_task_dsend(task, alias, msg_task_cancel_on_failed_dsend); + + (*env)->ReleaseStringUTFChars(env, jalias, alias); +} + + JNIEXPORT void JNICALL Java_org_simgrid_msg_MsgNative_taskSendBounded(JNIEnv * env, jclass cls, jstring jalias, jobject jtask,