X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/93c48481b5ba7bf1a72523594d8a3b09ca5571c4..8462a1a27d5d9595a90f6c4f6dc65e70d279e6e3:/src/jmsg.c diff --git a/src/jmsg.c b/src/jmsg.c index dbe6099cf9..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) @@ -176,9 +201,6 @@ Java_org_simgrid_msg_MsgNative_processKill(JNIEnv * env, jclass cls, return; } - /* delete the global reference */ - jprocess_delete_global_ref(native_to_java_process(process), env); - /* kill the native process (this wrapper is call by the destructor of the java * process instance) */ @@ -343,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) { @@ -389,7 +411,10 @@ Java_org_simgrid_msg_MsgNative_hostGetName(JNIEnv * env, jclass cls, JNIEXPORT jint JNICALL Java_org_simgrid_msg_MsgNative_hostGetNumber(JNIEnv * env, jclass cls) { - return (jint) MSG_get_host_number(); + xbt_dynar_t hosts = MSG_hosts_as_dynar(); + int nb_host = xbt_dynar_length(hosts); + xbt_dynar_free(&hosts); + return (jint) nb_host; } JNIEXPORT jobject JNICALL @@ -751,7 +776,7 @@ Java_org_simgrid_msg_MsgNative_taskExecute(JNIEnv * env, jclass cls, MSG_error_t rv = MSG_task_execute(task); jxbt_check_res("MSG_task_execute()", rv, - MSG_HOST_FAILURE | MSG_TASK_CANCELLED, + MSG_HOST_FAILURE | MSG_TASK_CANCELED, bprintf("while executing task %s", MSG_task_get_name(task))); } @@ -760,13 +785,6 @@ Java_org_simgrid_msg_MsgNative_taskExecute(JNIEnv * env, jclass cls, * Unsortable functions * ***************************************************************************************/ - -JNIEXPORT jint JNICALL -Java_org_simgrid_msg_Msg_getErrCode(JNIEnv * env, jclass cls) -{ - return (jint) MSG_get_errno(); -} - JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Msg_getClock(JNIEnv * env, jclass cls) { @@ -788,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++) { @@ -797,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); @@ -813,7 +832,7 @@ JNIEXPORT void JNICALL { MSG_error_t rv; int index; - m_host_t *hosts; + xbt_dynar_t hosts; jobject jhost; /* Run everything */ @@ -828,22 +847,26 @@ JNIEXPORT void JNICALL XBT_INFO("Clean java world"); /* Cleanup java hosts */ - hosts = MSG_get_host_table(); - for (index = 0; index < MSG_get_host_number() - 1; index++) { - jhost = (jobject) hosts[index]->data; + hosts = MSG_hosts_as_dynar(); + for (index = 0; index < xbt_dynar_length(hosts) - 1; index++) { + jhost = (jobject) xbt_dynar_get_as(hosts,index,m_host_t)->data; if (jhost) jhost_unref(env, jhost); } - + xbt_dynar_free(&hosts); XBT_INFO("Clean native world"); - /* cleanup native stuff */ - rv = MSG_OK != MSG_clean(); +} +JNIEXPORT void JNICALL + JNICALL Java_org_simgrid_msg_Msg_clean(JNIEnv * env, jclass cls) +{ + /* cleanup native stuff. Calling it is ... useless since leaking memory at the end of the simulation is a non-issue */ + MSG_error_t rv = MSG_OK != MSG_clean(); jxbt_check_res("MSG_clean()", rv, MSG_OK, bprintf ("unexpected error : MSG_clean() failed .. please report this bug ")); } - + JNIEXPORT jint JNICALL Java_org_simgrid_msg_MsgNative_processKillAll(JNIEnv * env, jclass cls, jint jresetPID) @@ -896,8 +919,8 @@ Java_org_simgrid_msg_MsgNative_allHosts(JNIEnv * env, jclass cls_arg) jstring jname; m_host_t host; - int count = MSG_get_host_number(); - m_host_t *table = MSG_get_host_table(); + xbt_dynar_t table = MSG_hosts_as_dynar(); + int count = xbt_dynar_length(table); jclass cls = jxbt_get_class(env, "org/simgrid/msg/Host"); @@ -913,7 +936,7 @@ Java_org_simgrid_msg_MsgNative_allHosts(JNIEnv * env, jclass cls_arg) } for (index = 0; index < count; index++) { - host = table[index]; + host = xbt_dynar_get_as(table,index,m_host_t); jhost = (jobject) (MSG_host_get_data(host)); if (!jhost) { @@ -926,7 +949,7 @@ Java_org_simgrid_msg_MsgNative_allHosts(JNIEnv * env, jclass cls_arg) (*env)->SetObjectArrayElement(env, jtable, index, jhost); } - + xbt_dynar_free(&table); return jtable; } @@ -960,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,