Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid
[simgrid.git] / src / bindings / java / jmsg_task.c
index a2e4b92..3ad8167 100644 (file)
@@ -23,18 +23,19 @@ static jmethodID jtask_method_Comm_constructor;
 
 static jfieldID jtask_field_Task_bind;
 static jfieldID jtask_field_Task_name;
+static jfieldID jtask_field_Task_messageSize;
 static jfieldID jtask_field_Comm_bind;
 static jfieldID jtask_field_Comm_taskBind;
 static jfieldID jtask_field_Comm_receiving;
 
 void jtask_bind(jobject jtask, msg_task_t task, JNIEnv * env)
 {
-  (*env)->SetLongField(env, jtask, jtask_field_Task_bind, (jlong) (long) (task));
+  (*env)->SetLongField(env, jtask, jtask_field_Task_bind, (intptr_t)task);
 }
 
 msg_task_t jtask_to_native_task(jobject jtask, JNIEnv * env)
 {
-  return (msg_task_t) (long) (*env)->GetLongField(env, jtask, jtask_field_Task_bind);
+  return (msg_task_t)(intptr_t)(*env)->GetLongField(env, jtask, jtask_field_Task_bind);
 }
 
 jboolean jtask_is_valid(jobject jtask, JNIEnv * env)
@@ -50,6 +51,7 @@ Java_org_simgrid_msg_Task_nativeInit(JNIEnv *env, jclass cls) {
   jtask_method_Comm_constructor = (*env)->GetMethodID(env, jtask_class_Comm, "<init>", "()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_Task_messageSize = jxbt_get_jfield(env, jtask_class_Task, "messageSize", "D");
   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");
@@ -206,8 +208,7 @@ Java_org_simgrid_msg_Task_cancel(JNIEnv * env,
 }
 
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_Task_execute(JNIEnv * env,
-                                       jobject jtask)
+Java_org_simgrid_msg_Task_execute(JNIEnv * env, jobject jtask)
 {
   msg_task_t task = jtask_to_native_task(jtask, env);
 
@@ -215,17 +216,12 @@ Java_org_simgrid_msg_Task_execute(JNIEnv * env,
     jxbt_throw_notbound(env, "task", jtask);
     return;
   }
-  xbt_ex_t e;
   msg_error_t rv;
-  TRY {
-     rv = MSG_task_execute(task);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-       return;
-  }
+  rv = MSG_task_execute(task);
+  if ((*env)->ExceptionOccurred(env))
+    return;
   if (rv != MSG_OK) {
-       jmsg_throw_status(env, rv);
+    jmsg_throw_status(env, rv);
   }
 }
 
@@ -356,13 +352,14 @@ Java_org_simgrid_msg_Task_setDataSize
     jxbt_throw_notbound(env, "task", jtask);
     return;
        }
+        (*env)->SetDoubleField(env, jtask, jtask_field_Task_messageSize, dataSize);
        MSG_task_set_data_size(task, (double) dataSize);
 }
 
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_Task_send(JNIEnv * env,jobject jtask,
-                                    jstring jalias,
-                                    jdouble jtimeout)
+                               jstring jalias,
+                               jdouble jtimeout)
 {
   msg_error_t rv;
   const char *alias = (*env)->GetStringUTFChars(env, jalias, 0);
@@ -378,25 +375,19 @@ 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));
-  xbt_ex_t e;
-  TRY {
-    rv = MSG_task_send_with_timeout(task, alias, (double) jtimeout);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-  }
+  rv = MSG_task_send_with_timeout(task, alias, (double) jtimeout);
   (*env)->ReleaseStringUTFChars(env, jalias, alias);
 
   if (rv != MSG_OK) {
-       jmsg_throw_status(env, rv);
+    jmsg_throw_status(env, rv);
   }
 }
 
 JNIEXPORT void JNICALL
 Java_org_simgrid_msg_Task_sendBounded(JNIEnv * env,jobject jtask,
-                                    jstring jalias,
-                                    jdouble jtimeout,
-                                   jdouble maxrate)
+                                      jstring jalias,
+                                      jdouble jtimeout,
+                                      jdouble maxrate)
 {
   msg_error_t rv;
   const char *alias = (*env)->GetStringUTFChars(env, jalias, 0);
@@ -412,24 +403,18 @@ Java_org_simgrid_msg_Task_sendBounded(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));
-  xbt_ex_t e;
-  TRY {
-    rv = MSG_task_send_with_timeout_bounded(task, alias, (double) jtimeout, (double) maxrate);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-  }
+  rv = MSG_task_send_with_timeout_bounded(task, alias, (double) jtimeout, (double) maxrate);
   (*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,
-                                       jobject jhost)
+                                  jstring jalias, jdouble jtimeout,
+                                  jobject jhost)
 {
   msg_error_t rv;
   msg_task_t *task = xbt_new(msg_task_t,1);
@@ -449,17 +434,12 @@ Java_org_simgrid_msg_Task_receive(JNIEnv * env, jclass cls,
   }
 
   alias = (*env)->GetStringUTFChars(env, jalias, 0);
-  xbt_ex_t e;
-  TRY {
-       rv = MSG_task_receive_ext(task, alias, (double) jtimeout, host);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-       return NULL;
-  }
+  rv = MSG_task_receive_ext(task, alias, (double) jtimeout, host);
+  if ((*env)->ExceptionOccurred(env))
+    return NULL;
   if (rv != MSG_OK) {
-       jmsg_throw_status(env,rv);
-       return NULL;
+    jmsg_throw_status(env,rv);
+    return NULL;
   }
   jtask_global = MSG_task_get_data(*task);
 
@@ -511,6 +491,88 @@ Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) {
        return jcomm;
 }
 
+
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_Task_receiveBounded(JNIEnv * env, jclass cls,
+                                  jstring jalias, jdouble jtimeout,
+                                  jobject jhost, jdouble rate)
+{
+  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;
+
+  if (jhost) {
+    host = jhost_get_native(env, jhost);
+
+    if (!host) {
+      jxbt_throw_notbound(env, "host", jhost);
+      return NULL;
+    }
+  }
+
+  alias = (*env)->GetStringUTFChars(env, jalias, 0);
+  rv = MSG_task_receive_ext_bounded(task, alias, (double) jtimeout, host, (double) rate);
+  if ((*env)->ExceptionOccurred(env))
+    return NULL;
+  if (rv != MSG_OK) {
+    jmsg_throw_status(env,rv);
+    return NULL;
+  }
+  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);
+
+  (*env)->ReleaseStringUTFChars(env, jalias, alias);
+
+  xbt_free(task);
+
+  return (jobject) jtask_local;
+}
+
+
+JNIEXPORT jobject JNICALL
+Java_org_simgrid_msg_Task_irecvBounded(JNIEnv * env, jclass cls,
+               jstring jmailbox, jdouble rate) {
+       msg_comm_t comm;
+       const char *mailbox;
+       jclass comm_class;
+       //pointer to store the task object pointer.
+       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");
+
+       if (!comm_class) {
+               jxbt_throw_native(env,bprintf("fieldID or methodID or class not found."));
+               return NULL;
+       }
+
+       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;
+       }
+
+       mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0);
+
+       comm = MSG_task_irecv_bounded(task,mailbox, (double) rate);
+
+       (*env)->SetLongField(env, jcomm, jtask_field_Comm_bind, (jlong) (long)(comm));
+       (*env)->SetLongField(env, jcomm, jtask_field_Comm_taskBind, (jlong) (long)(task));
+       (*env)->SetBooleanField(env, jcomm, jtask_field_Comm_receiving, JNI_TRUE);
+
+       (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox);
+
+       return jcomm;
+}
+
 JNIEXPORT jobject JNICALL
 Java_org_simgrid_msg_Task_isend(JNIEnv *env, jobject jtask, jstring jmailbox) {
   jclass comm_class;
@@ -647,30 +709,21 @@ Java_org_simgrid_msg_Task_dsendBounded(JNIEnv * env, jobject jtask,
 
 
 JNIEXPORT jboolean JNICALL
-Java_org_simgrid_msg_Task_listen(JNIEnv * env, jclass cls,
-                                                                                                          jstring jalias) {
-
+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);
-  TRY {
-       rv = MSG_task_listen(alias);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-       return 0;
-  }
+  rv = MSG_task_listen(alias);
   (*env)->ReleaseStringUTFChars(env, jalias, alias);
 
   return (jboolean) rv;
 }
 
 JNIEXPORT jint JNICALL
-Java_org_simgrid_msg_Task_listenFromHost(JNIEnv * env, jclass cls,
-                                                                                                                                          jstring jalias,
-                                                                                                                                          jobject jhost) {
+Java_org_simgrid_msg_Task_listenFromHost(JNIEnv * env, jclass cls, jstring jalias, jobject jhost)
+ {
   int rv;
   const char *alias;
 
@@ -681,15 +734,7 @@ Java_org_simgrid_msg_Task_listenFromHost(JNIEnv * env, jclass cls,
     return -1;
   }
   alias = (*env)->GetStringUTFChars(env, jalias, 0);
-  xbt_ex_t e;
-
-  TRY {
-       rv = MSG_task_listen_from_host(alias, host);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-       return 0;
-  }
+  rv = MSG_task_listen_from_host(alias, host);
   (*env)->ReleaseStringUTFChars(env, jalias, alias);
 
   return (jint) rv;
@@ -697,19 +742,11 @@ Java_org_simgrid_msg_Task_listenFromHost(JNIEnv * env, jclass cls,
 
 
 JNIEXPORT jint JNICALL
-Java_org_simgrid_msg_Task_listenFrom(JNIEnv * env, jclass cls,
-                                                       jstring jalias) {
-
+Java_org_simgrid_msg_Task_listenFrom(JNIEnv * env, jclass cls, jstring jalias)
+{
   int rv;
   const char *alias = (*env)->GetStringUTFChars(env, jalias, 0);
-  xbt_ex_t e;
-  TRY {
-       rv = MSG_task_listen_from(alias);
-  }
-  CATCH(e) {
-    xbt_ex_free(e);
-       return 0;
-  }
+  rv = MSG_task_listen_from(alias);
   (*env)->ReleaseStringUTFChars(env, jalias, alias);
 
   return (jint) rv;