From 054fe0158b9dbabd36c3ca35f808a572b8764b94 Mon Sep 17 00:00:00 2001 From: Jonathan Rouzaud-Cornabas Date: Wed, 30 Jan 2013 00:45:52 +0100 Subject: [PATCH] Add dsendBounded + sendBounded with timeout --- org/simgrid/msg/Task.java | 31 +++++++++++++++++++++++++-- src/jmsg_task.c | 45 +++++++++++++++++++++++++++++---------- src/jmsg_task.h | 16 +++++++++++--- 3 files changed, 76 insertions(+), 16 deletions(-) diff --git a/org/simgrid/msg/Task.java b/org/simgrid/msg/Task.java index 7cd0d8705b..022961d490 100644 --- a/org/simgrid/msg/Task.java +++ b/org/simgrid/msg/Task.java @@ -187,7 +187,15 @@ public class Task { * with no way to retrieve whether the communication succeeded or not * */ - public native void dsend(String mailbox); + public native void dsendBounded(String mailbox, double maxrate); + + + /** Send the task asynchronously on the mailbox identified by the specified name, + * with no way to retrieve whether the communication succeeded or not + * + */ + public native void dsend(String mailbox); + /** * Sends the task on the mailbox identified by the specified name * @@ -220,7 +228,26 @@ public class Task { * @throws HostFailureException * @throws TimeoutException */ - public native void sendBounded(String alias, double maxrate) throws TransferFailureException, HostFailureException, TimeoutException; + public void sendBounded(String alias, double maxrate) throws TransferFailureException, HostFailureException, TimeoutException { + sendBounded(alias,-1,maxrate); + } + + +/** + * Sends the task on the mailbox identified by the specified alias (capping the sending rate to \a maxrate) with a timeout + * + * @param alias + * @param timeout + * @param maxrate + * @throws TransferFailureException + * @throws HostFailureException + * @throws TimeoutException + */ + public void sendBounded(String alias, double timeout, double maxrate) throws TransferFailureException, HostFailureException, TimeoutException { + sendBounded(alias,timeout,maxrate); + } + + /** * Sends the task on the mailbox asynchronously */ diff --git a/src/jmsg_task.c b/src/jmsg_task.c index 5bce01217e..d7a9fea6b7 100644 --- a/src/jmsg_task.c +++ b/src/jmsg_task.c @@ -381,27 +381,28 @@ Java_org_simgrid_msg_Task_send(JNIEnv * env,jobject jtask, } 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) { - msg_task_t task = jtask_to_native_task(jtask, env); msg_error_t rv; - const char *alias; + 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)); - xbt_ex_t e; TRY { - rv = MSG_task_send_bounded(task, alias, (double) jmaxRate); + rv = MSG_task_send_with_timeout_bounded(task, alias, (double) jtimeout, (double) maxrate); } CATCH(e) { xbt_ex_free(e); @@ -409,11 +410,10 @@ Java_org_simgrid_msg_Task_sendBounded(JNIEnv * env, jobject jtask, (*env)->ReleaseStringUTFChars(env, jalias, alias); if (rv != MSG_OK) { - jmsg_throw_status(env, rv); + jmsg_throw_status(env, rv); } } - JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_receive(JNIEnv * env, jclass cls, jstring jalias, jdouble jtimeout, @@ -611,6 +611,29 @@ 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) { diff --git a/src/jmsg_task.h b/src/jmsg_task.h index bd411648f5..99b83e6192 100644 --- a/src/jmsg_task.h +++ b/src/jmsg_task.h @@ -191,13 +191,14 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_send (JNIEnv *, jobject, jstring, jdouble); -/* +/** * Class org_simgrid_msg_Task * Method sendBounded */ JNIEXPORT void JNICALL -Java_org_simgrid_msg_Task_sendBounded(JNIEnv *, jobject, jstring, - jdouble); + Java_org_simgrid_msg_Task_sendBounded + (JNIEnv *, jobject, jstring, jdouble, jdouble); + /** * Class org_simgrid_msg_Task @@ -236,6 +237,15 @@ Java_org_simgrid_msg_Task_isendBounded(JNIEnv *env, jobject jtask, jstring jmail JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_dsend(JNIEnv * env, jobject jtask, jstring jalias); + +/** + * Class org_simgrid_msg_Task + * Method dsendBounded + */ +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Task_dsendBounded(JNIEnv * env, jobject jtask, + jstring jalias, jdouble maxrate); + /** * Class org_simgrid_msg_Task * Method listen -- 2.20.1