jclass jtask_class_Task = (*env)->FindClass(env, "org/simgrid/msg/Task");
jtask_method_Comm_constructor = (*env)->GetMethodID(env, jtask_class_Comm, "<init>", "()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
(*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
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;
alias = (*env)->GetStringUTFChars(env, jalias, 0);
TRY {
- rv = MSG_task_receive_ext(&task, alias, (double) jtimeout, host);
+ 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));