X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/514c85494408cbf2eab157d78843a5db586a57c0..0b7177aaa933483692b39ba8ed330f531f204fac:/src/jmsg_task.c diff --git a/src/jmsg_task.c b/src/jmsg_task.c index 8b52a30806..b7584644b4 100644 --- a/src/jmsg_task.c +++ b/src/jmsg_task.c @@ -48,16 +48,15 @@ Java_org_simgrid_msg_Task_nativeInit(JNIEnv *env, jclass cls) { jclass jtask_class_Task = (*env)->FindClass(env, "org/simgrid/msg/Task"); jtask_method_Comm_constructor = (*env)->GetMethodID(env, jtask_class_Comm, "", "()V"); - //FIXME: Don't use jxbt_get_sfield directly, it is slower. - jtask_field_Task_bind = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J"); + 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_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"); + 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 @@ -307,7 +306,21 @@ 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) { + m_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) @@ -354,10 +367,10 @@ Java_org_simgrid_msg_Task_send(JNIEnv * env,jobject jtask, (*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); + return; + } } JNIEXPORT void JNICALL @@ -397,7 +410,9 @@ Java_org_simgrid_msg_Task_receive(JNIEnv * env, jclass cls, jobject jhost) { MSG_error_t rv; - m_task_t task = NULL; + m_task_t *task = xbt_new(m_task_t,1); + *task = NULL; + m_host_t host = NULL; jobject jtask_global, jtask_local; const char *alias; @@ -412,33 +427,27 @@ 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); + TRY { + rv = MSG_task_receive_ext(task, alias, (double) jtimeout, host); + } + CATCH_ANONYMOUS { + 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); + xbt_free(task); + jxbt_check_res("MSG_task_receive_ext()", rv, MSG_HOST_FAILURE | MSG_TRANSFER_FAILURE | MSG_TIMEOUT, bprintf("while receiving from mailbox %s", alias)); @@ -562,9 +571,12 @@ Java_org_simgrid_msg_Task_listen(JNIEnv * env, jclass cls, int rv; alias = (*env)->GetStringUTFChars(env, jalias, 0); - - rv = MSG_task_listen(alias); - + TRY { + rv = MSG_task_listen(alias); + } + CATCH_ANONYMOUS { + return 0; + } (*env)->ReleaseStringUTFChars(env, jalias, alias); return (jboolean) rv; @@ -584,9 +596,12 @@ Java_org_simgrid_msg_Task_listenFromHost(JNIEnv * env, jclass cls, return -1; } alias = (*env)->GetStringUTFChars(env, jalias, 0); - - rv = MSG_task_listen_from_host(alias, host); - + TRY { + rv = MSG_task_listen_from_host(alias, host); + } + CATCH_ANONYMOUS { + return 0; + } (*env)->ReleaseStringUTFChars(env, jalias, alias); return (jint) rv; @@ -599,9 +614,12 @@ 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); - + TRY { + rv = MSG_task_listen_from(alias); + } + CATCH_ANONYMOUS { + return 0; + } (*env)->ReleaseStringUTFChars(env, jalias, alias); return (jint) rv;