X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4a59f17b3e539abe1a63c83a1645a28321d8de2e..054fe0158b9dbabd36c3ca35f808a572b8764b94:/src/jmsg_task.c diff --git a/src/jmsg_task.c b/src/jmsg_task.c index d376bbc8e9..d7a9fea6b7 100644 --- a/src/jmsg_task.c +++ b/src/jmsg_task.c @@ -16,23 +16,25 @@ #include "jxbt_utilities.h" #include + XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg); -static jmethodID jtask_field_Comm_constructor; +static jmethodID jtask_method_Comm_constructor; static jfieldID jtask_field_Task_bind; +static jfieldID jtask_field_Task_name; static jfieldID jtask_field_Comm_bind; static jfieldID jtask_field_Comm_taskBind; static jfieldID jtask_field_Comm_receiving; -void jtask_bind(jobject jtask, m_task_t task, JNIEnv * env) +void jtask_bind(jobject jtask, msg_task_t task, JNIEnv * env) { (*env)->SetLongField(env, jtask, jtask_field_Task_bind, (jlong) (long) (task)); } -m_task_t jtask_to_native_task(jobject jtask, JNIEnv * env) +msg_task_t jtask_to_native_task(jobject jtask, JNIEnv * env) { - return (m_task_t) (long) (*env)->GetLongField(env, jtask, jtask_field_Task_bind); + return (msg_task_t) (long) (*env)->GetLongField(env, jtask, jtask_field_Task_bind); } jboolean jtask_is_valid(jobject jtask, JNIEnv * env) @@ -42,14 +44,19 @@ jboolean jtask_is_valid(jobject jtask, JNIEnv * env) JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_nativeInit(JNIEnv *env, jclass cls) { - jclass jtask_class_Comm = (*env)->FindClass(env, "org/simgrid/msg/Comm"); - - jtask_field_Comm_constructor = (*env)->GetMethodID(env, jtask_class_Comm, "", "()V"); - //FIXME: Don't use jxbt_get_sfield directly. - jtask_field_Task_bind = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J"); - jtask_field_Comm_bind = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J"); - jtask_field_Comm_taskBind = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "taskBind", "J"); - jtask_field_Comm_receiving = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "receiving", "Z"); + jclass jtask_class_Comm = (*env)->FindClass(env, "org/simgrid/msg/Comm"); + jclass jtask_class_Task = (*env)->FindClass(env, "org/simgrid/msg/Task"); + + jtask_method_Comm_constructor = (*env)->GetMethodID(env, jtask_class_Comm, "", "()V"); + jtask_field_Task_bind = jxbt_get_jfield(env, jtask_class_Task, "bind", "J"); + jtask_field_Task_name = jxbt_get_jfield(env, jtask_class_Task, "name", "Ljava/lang/String;"); + jtask_field_Comm_bind = jxbt_get_jfield(env, jtask_class_Comm, "bind", "J"); + jtask_field_Comm_taskBind = jxbt_get_jfield(env, jtask_class_Comm, "taskBind", "J"); + jtask_field_Comm_receiving = jxbt_get_jfield(env, jtask_class_Comm, "receiving", "Z"); + if (!jtask_field_Task_bind || !jtask_class_Task || !jtask_field_Comm_bind || !jtask_field_Comm_taskBind || + !jtask_field_Comm_receiving || !jtask_method_Comm_constructor) { + jxbt_throw_native(env,bprintf("Can't find some fields in Java class.")); + } } JNIEXPORT void JNICALL @@ -58,7 +65,7 @@ Java_org_simgrid_msg_Task_create(JNIEnv * env, jdouble jcomputeDuration, jdouble jmessageSize) { - m_task_t task; /* the native task to create */ + msg_task_t task; /* the native task to create */ const char *name = NULL; /* the name of the task */ if (jcomputeDuration < 0) { @@ -72,7 +79,7 @@ Java_org_simgrid_msg_Task_create(JNIEnv * env, if (jmessageSize < 0) { jxbt_throw_illegal(env, bprintf("Task MessageSize (%f) cannot be negative", - (double) jmessageSize)); + (double) jmessageSize)); return; } @@ -81,14 +88,14 @@ Java_org_simgrid_msg_Task_create(JNIEnv * env, name = (*env)->GetStringUTFChars(env, jname, 0); } - /* create the task */ task = MSG_task_create(name, (double) jcomputeDuration, - (double) jmessageSize, NULL); + (double) jmessageSize, NULL); if (jname) (*env)->ReleaseStringUTFChars(env, jname, name); - + /* sets the task name */ + (*env)->SetObjectField(env, jtask, jtask_field_Task_name, jname); /* bind & store the task */ jtask_bind(jtask, task, env); MSG_task_set_data(task, jtask); @@ -96,18 +103,18 @@ Java_org_simgrid_msg_Task_create(JNIEnv * env, JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_parallelCreate(JNIEnv * env, - jobject jtask, - jstring jname, - jobjectArray jhosts, - jdoubleArray - jcomputeDurations_arg, - jdoubleArray - jmessageSizes_arg) { - - m_task_t task; /* the native parallel task to create */ + jobject jtask, + jstring jname, + jobjectArray jhosts, + jdoubleArray + jcomputeDurations_arg, + jdoubleArray + jmessageSizes_arg) { + + msg_task_t task; /* the native parallel task to create */ const char *name; /* the name of the task */ int host_count; - m_host_t *hosts; + msg_host_t *hosts; double *computeDurations; double *messageSizes; jdouble *jcomputeDurations; @@ -116,7 +123,6 @@ Java_org_simgrid_msg_Task_parallelCreate(JNIEnv * env, jobject jhost; int index; - if (!jcomputeDurations_arg) { jxbt_throw_null(env, xbt_strdup @@ -139,7 +145,7 @@ Java_org_simgrid_msg_Task_parallelCreate(JNIEnv * env, host_count = (int) (*env)->GetArrayLength(env, jhosts); - hosts = xbt_new0(m_host_t, host_count); + hosts = xbt_new0(msg_host_t, host_count); computeDurations = xbt_new0(double, host_count); messageSizes = xbt_new0(double, host_count * host_count); @@ -171,7 +177,8 @@ Java_org_simgrid_msg_Task_parallelCreate(JNIEnv * env, messageSizes, NULL); (*env)->ReleaseStringUTFChars(env, jname, name); - + /* sets the task name */ + (*env)->SetObjectField(env, jtask, jtask_field_Task_name, jname); /* associate the java task object and the native task */ jtask_bind(jtask, task, env); @@ -185,14 +192,14 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_cancel(JNIEnv * env, jobject jtask) { - m_task_t ptask = jtask_to_native_task(jtask, env); + msg_task_t ptask = jtask_to_native_task(jtask, env); if (!ptask) { jxbt_throw_notbound(env, "task", jtask); return; } - MSG_error_t rv = MSG_task_cancel(ptask); + msg_error_t rv = MSG_task_cancel(ptask); jxbt_check_res("MSG_task_cancel()", rv, MSG_OK, bprintf("unexpected error , please report this bug")); @@ -202,25 +209,30 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_execute(JNIEnv * env, jobject jtask) { - m_task_t task = jtask_to_native_task(jtask, env); + msg_task_t task = jtask_to_native_task(jtask, env); if (!task) { jxbt_throw_notbound(env, "task", jtask); return; } - - MSG_error_t rv = MSG_task_execute(task); - - jxbt_check_res("MSG_task_execute()", rv, - MSG_HOST_FAILURE | MSG_TASK_CANCELED, - bprintf("while executing task %s", - MSG_task_get_name(task))); + xbt_ex_t e; + msg_error_t rv; + TRY { + rv = MSG_task_execute(task); + } + CATCH(e) { + xbt_ex_free(e); + return; + } + if (rv != MSG_OK) { + jmsg_throw_status(env, rv); + } } JNIEXPORT jstring JNICALL Java_org_simgrid_msg_Task_getName(JNIEnv * env, jobject jtask) { - m_task_t task = jtask_to_native_task(jtask, env); + msg_task_t task = jtask_to_native_task(jtask, env); if (!task) { jxbt_throw_notbound(env, "task", jtask); @@ -233,9 +245,9 @@ Java_org_simgrid_msg_Task_getName(JNIEnv * env, JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_getSender(JNIEnv * env, jobject jtask) { - m_process_t process; + msg_process_t process; - m_task_t task = jtask_to_native_task(jtask, env); + msg_task_t task = jtask_to_native_task(jtask, env); if (!task) { jxbt_throw_notbound(env, "task", jtask); @@ -243,6 +255,9 @@ Java_org_simgrid_msg_Task_getSender(JNIEnv * env, } process = MSG_task_get_sender(task); + if (process == NULL) { + return NULL; + } return (jobject) native_to_java_process(process); } @@ -250,8 +265,8 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_getSource(JNIEnv * env, jobject jtask) { - m_host_t host; - m_task_t task = jtask_to_native_task(jtask, env); + msg_host_t host; + msg_task_t task = jtask_to_native_task(jtask, env); if (!task) { jxbt_throw_notbound(env, "task", jtask); @@ -259,7 +274,9 @@ Java_org_simgrid_msg_Task_getSource(JNIEnv * env, } host = MSG_task_get_source(task); - + if (host == NULL) { + return NULL; + } if (!MSG_host_get_data(host)) { jxbt_throw_jni(env, "MSG_task_get_source() failed"); return NULL; @@ -272,7 +289,7 @@ JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Task_getComputeDuration(JNIEnv * env, jobject jtask) { - m_task_t ptask = jtask_to_native_task(jtask, env); + msg_task_t ptask = jtask_to_native_task(jtask, env); if (!ptask) { jxbt_throw_notbound(env, "task", jtask); @@ -284,7 +301,7 @@ Java_org_simgrid_msg_Task_getComputeDuration(JNIEnv * env, JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Task_getRemainingDuration(JNIEnv * env, jobject jtask) { - m_task_t ptask = jtask_to_native_task(jtask, env); + msg_task_t ptask = jtask_to_native_task(jtask, env); if (!ptask) { jxbt_throw_notbound(env, "task", jtask); @@ -292,12 +309,26 @@ Java_org_simgrid_msg_Task_getRemainingDuration(JNIEnv * env, jobject jtask) } return (jdouble) MSG_task_get_remaining_computation(ptask); } +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Task_setName(JNIEnv *env, jobject jtask, jobject jname) { + msg_task_t task = jtask_to_native_task(jtask, env); + + if (!task) { + jxbt_throw_notbound(env, "task", jtask); + return; + } + const char *name = (*env)->GetStringUTFChars(env, jname, 0); + + (*env)->SetObjectField(env, jtask, jtask_field_Task_name, jname); + MSG_task_set_name(task, name); + (*env)->ReleaseStringUTFChars(env, jname, name); +} JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_setPriority(JNIEnv * env, jobject jtask, jdouble priority) { - m_task_t task = jtask_to_native_task(jtask, env); + msg_task_t task = jtask_to_native_task(jtask, env); if (!task) { jxbt_throw_notbound(env, "task", jtask); @@ -306,14 +337,25 @@ Java_org_simgrid_msg_Task_setPriority(JNIEnv * env, MSG_task_set_priority(task, (double) priority); } JNIEXPORT void JNICALL +Java_org_simgrid_msg_Task_setComputeDuration + (JNIEnv *env, jobject jtask, jdouble computationAmount) { + msg_task_t task = jtask_to_native_task(jtask, env); + + if (!task) { + jxbt_throw_notbound(env, "task", jtask); + return; + } + MSG_task_set_compute_duration(task, (double) computationAmount); +} +JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_send(JNIEnv * env,jobject jtask, jstring jalias, jdouble jtimeout) { - MSG_error_t rv; + msg_error_t rv; const char *alias = (*env)->GetStringUTFChars(env, jalias, 0); - m_task_t task = jtask_to_native_task(jtask, env); + msg_task_t task = jtask_to_native_task(jtask, env); if (!task) { @@ -324,55 +366,64 @@ Java_org_simgrid_msg_Task_send(JNIEnv * env,jobject jtask, /* 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)); - rv = MSG_task_send_with_timeout(task, alias, (double) jtimeout); - + xbt_ex_t e; + TRY { + rv = MSG_task_send_with_timeout(task, alias, (double) jtimeout); + } + CATCH(e) { + xbt_ex_free(e); + } (*env)->ReleaseStringUTFChars(env, jalias, alias); - jxbt_check_res("MSG_task_send_with_timeout()", rv, - MSG_HOST_FAILURE | MSG_TRANSFER_FAILURE | MSG_TIMEOUT, - bprintf("while sending task %s to mailbox %s", - MSG_task_get_name(task), alias)); + if (rv != MSG_OK) { + jmsg_throw_status(env, rv); + } } JNIEXPORT void JNICALL -Java_org_simgrid_msg_Task_sendBounded(JNIEnv * env, jobject jtask, - jstring jalias, - jdouble jmaxRate) +Java_org_simgrid_msg_Task_sendBounded(JNIEnv * env,jobject jtask, + jstring jalias, + jdouble jtimeout, + jdouble maxrate) { - m_task_t task = jtask_to_native_task(jtask, env); - MSG_error_t rv; - const char *alias; + msg_error_t rv; + const char *alias = (*env)->GetStringUTFChars(env, jalias, 0); + + msg_task_t task = jtask_to_native_task(jtask, env); + if (!task) { + (*env)->ReleaseStringUTFChars(env, jalias, alias); jxbt_throw_notbound(env, "task", jtask); return; } - alias = (*env)->GetStringUTFChars(env, jalias, 0); - /* 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)); - rv = MSG_task_send_bounded(task, alias, (double) jmaxRate); - + xbt_ex_t e; + TRY { + rv = MSG_task_send_with_timeout_bounded(task, alias, (double) jtimeout, (double) maxrate); + } + CATCH(e) { + xbt_ex_free(e); + } (*env)->ReleaseStringUTFChars(env, jalias, alias); - jxbt_check_res("MSG_task_send_bounded()", rv, - MSG_HOST_FAILURE | MSG_TRANSFER_FAILURE | MSG_TIMEOUT, - bprintf - ("while sending task %s to mailbox %s with max rate %f", - MSG_task_get_name(task), alias, (double) jmaxRate)); - + if (rv != MSG_OK) { + jmsg_throw_status(env, rv); + } } - JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_receive(JNIEnv * env, jclass cls, jstring jalias, jdouble jtimeout, jobject jhost) { - MSG_error_t rv; - m_task_t task = NULL; - m_host_t host = NULL; + msg_error_t rv; + msg_task_t *task = xbt_new(msg_task_t,1); + *task = NULL; + + msg_host_t host = NULL; jobject jtask_global, jtask_local; const char *alias; @@ -386,36 +437,28 @@ Java_org_simgrid_msg_Task_receive(JNIEnv * env, jclass cls, } alias = (*env)->GetStringUTFChars(env, jalias, 0); - - rv = MSG_task_receive_ext(&task, alias, (double) jtimeout, host); + xbt_ex_t e; + TRY { + rv = MSG_task_receive_ext(task, alias, (double) jtimeout, host); + } + CATCH(e) { + xbt_ex_free(e); + return NULL; + } if (rv != MSG_OK) { - switch (rv) { - case MSG_TIMEOUT: - jxbt_throw_time_out_failure(env,NULL); - break; - case MSG_TRANSFER_FAILURE: - jxbt_throw_transfer_failure(env,NULL); - break; - case MSG_HOST_FAILURE: - jxbt_throw_host_failure(env,NULL); - break; - default: - jxbt_throw_native(env,bprintf("receive failed")); - } + jmsg_throw_status(env,rv); return NULL; } - jtask_global = MSG_task_get_data(task); + jtask_global = MSG_task_get_data(*task); /* Convert the global ref into a local ref so that the JVM can free the stuff */ jtask_local = (*env)->NewLocalRef(env, jtask_global); (*env)->DeleteGlobalRef(env, jtask_global); - MSG_task_set_data(task, NULL); + MSG_task_set_data(*task, NULL); (*env)->ReleaseStringUTFChars(env, jalias, alias); - jxbt_check_res("MSG_task_receive_ext()", rv, - MSG_HOST_FAILURE | MSG_TRANSFER_FAILURE | MSG_TIMEOUT, - bprintf("while receiving from mailbox %s", alias)); + xbt_free(task); return (jobject) jtask_local; } @@ -427,7 +470,7 @@ Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) { const char *mailbox; jclass comm_class; //pointer to store the task object pointer. - m_task_t *task = xbt_new(m_task_t,1); + msg_task_t *task = xbt_new(msg_task_t,1); *task = NULL; /* There should be a cache here */ comm_class = (*env)->FindClass(env, "org/simgrid/msg/Comm"); @@ -437,7 +480,7 @@ Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) { return NULL; } - jobject jcomm = (*env)->NewObject(env, comm_class, jtask_field_Comm_constructor); + jobject jcomm = (*env)->NewObject(env, comm_class, jtask_method_Comm_constructor); if (!jcomm) { jxbt_throw_native(env,bprintf("Can't create a Comm object.")); return NULL; @@ -458,61 +501,101 @@ Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) { JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_isend(JNIEnv *env, jobject jtask, jstring jmailbox) { - jclass comm_class; + jclass comm_class; - const char *mailbox; + const char *mailbox; - m_task_t task; + msg_task_t task; - jobject jcomm; - msg_comm_t comm; + jobject jcomm; + msg_comm_t comm; - comm_class = (*env)->FindClass(env, "org/simgrid/msg/Comm"); + comm_class = (*env)->FindClass(env, "org/simgrid/msg/Comm"); - if (!comm_class) return NULL; + if (!comm_class) return NULL; - jcomm = (*env)->NewObject(env, comm_class, jtask_field_Comm_constructor); - mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0); + jcomm = (*env)->NewObject(env, comm_class, jtask_method_Comm_constructor); + mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0); - task = jtask_to_native_task(jtask, env); + task = jtask_to_native_task(jtask, env); - if (!task) { + if (!task) { (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox); (*env)->DeleteLocalRef(env, jcomm); jxbt_throw_notbound(env, "task", jtask); - return NULL; - } + return NULL; + } - MSG_task_set_data(task, (void *) (*env)->NewGlobalRef(env, jtask)); - comm = MSG_task_isend(task,mailbox); +MSG_task_set_data(task, (void *) (*env)->NewGlobalRef(env, jtask)); + comm = MSG_task_isend(task,mailbox); - (*env)->SetLongField(env, jcomm, jtask_field_Comm_bind, (jlong) (long)(comm)); - (*env)->SetLongField(env, jcomm, jtask_field_Comm_taskBind, (jlong) (long)(NULL)); - (*env)->SetBooleanField(env, jcomm, jtask_field_Comm_receiving, JNI_FALSE); + (*env)->SetLongField(env, jcomm, jtask_field_Comm_bind, (jlong) (long)(comm)); + (*env)->SetLongField(env, jcomm, jtask_field_Comm_taskBind, (jlong) (long)(NULL)); + (*env)->SetBooleanField(env, jcomm, jtask_field_Comm_receiving, JNI_FALSE); - (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox); + (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox); - return jcomm; + return jcomm; +} + +JNIEXPORT jobject JNICALL +Java_org_simgrid_msg_Task_isendBounded(JNIEnv *env, jobject jtask, jstring jmailbox, jdouble maxrate) { + jclass comm_class; + + const char *mailbox; + + msg_task_t task; + + jobject jcomm; + msg_comm_t comm; + + comm_class = (*env)->FindClass(env, "org/simgrid/msg/Comm"); + + if (!comm_class) return NULL; + + jcomm = (*env)->NewObject(env, comm_class, jtask_method_Comm_constructor); + mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0); + + task = jtask_to_native_task(jtask, env); + + if (!task) { + (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox); + (*env)->DeleteLocalRef(env, jcomm); + jxbt_throw_notbound(env, "task", jtask); + return NULL; + } + +MSG_task_set_data(task, (void *) (*env)->NewGlobalRef(env, jtask)); + comm = MSG_task_isend_bounded(task,mailbox,maxrate); + + (*env)->SetLongField(env, jcomm, jtask_field_Comm_bind, (jlong) (long)(comm)); + (*env)->SetLongField(env, jcomm, jtask_field_Comm_taskBind, (jlong) (long)(NULL)); + (*env)->SetBooleanField(env, jcomm, jtask_field_Comm_receiving, JNI_FALSE); + + (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox); + + return jcomm; } + + 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); + msg_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_Task_dsend(JNIEnv * env, jobject jtask, jstring jalias) { - const char *alias = (*env)->GetStringUTFChars(env, jalias, 0); - m_task_t task = jtask_to_native_task(jtask, env); + msg_task_t task = jtask_to_native_task(jtask, env); if (!task) { @@ -528,17 +611,45 @@ Java_org_simgrid_msg_Task_dsend(JNIEnv * env, jobject jtask, (*env)->ReleaseStringUTFChars(env, jalias, alias); } +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Task_dsendBounded(JNIEnv * env, jobject jtask, + jstring jalias, jdouble maxrate) { + const char *alias = (*env)->GetStringUTFChars(env, jalias, 0); + + msg_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_bounded(task, alias, msg_task_cancel_on_failed_dsend,(double)maxrate); + + (*env)->ReleaseStringUTFChars(env, jalias, alias); +} + + + JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_Task_listen(JNIEnv * env, jclass cls, jstring jalias) { const char *alias; int rv; + xbt_ex_t e; alias = (*env)->GetStringUTFChars(env, jalias, 0); - - rv = MSG_task_listen(alias); - + TRY { + rv = MSG_task_listen(alias); + } + CATCH(e) { + xbt_ex_free(e); + return 0; + } (*env)->ReleaseStringUTFChars(env, jalias, alias); return (jboolean) rv; @@ -551,16 +662,22 @@ Java_org_simgrid_msg_Task_listenFromHost(JNIEnv * env, jclass cls, int rv; const char *alias; - m_host_t host = jhost_get_native(env, jhost); + msg_host_t host = jhost_get_native(env, jhost); if (!host) { jxbt_throw_notbound(env, "host", jhost); return -1; } alias = (*env)->GetStringUTFChars(env, jalias, 0); + xbt_ex_t e; - rv = MSG_task_listen_from_host(alias, host); - + TRY { + rv = MSG_task_listen_from_host(alias, host); + } + CATCH(e) { + xbt_ex_free(e); + return 0; + } (*env)->ReleaseStringUTFChars(env, jalias, alias); return (jint) rv; @@ -573,9 +690,14 @@ Java_org_simgrid_msg_Task_listenFrom(JNIEnv * env, jclass cls, int rv; const char *alias = (*env)->GetStringUTFChars(env, jalias, 0); - - rv = MSG_task_listen_from(alias); - + xbt_ex_t e; + TRY { + rv = MSG_task_listen_from(alias); + } + CATCH(e) { + xbt_ex_free(e); + return 0; + } (*env)->ReleaseStringUTFChars(env, jalias, alias); return (jint) rv;