Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[java] New function: msg.Comm.waitAll()
[simgrid.git] / src / bindings / java / jmsg_comm.cpp
index 387768f..c15abe3 100644 (file)
@@ -26,10 +26,10 @@ void jcomm_bind_task(JNIEnv *env, jobject jcomm) {
   if (jreceiving == JNI_TRUE) {
     //bind the task object.
     msg_task_t task = MSG_comm_get_task(comm);
-    xbt_assert(task != NULL, "Task is NULL");
-    jobject jtask_global = (jobject) MSG_task_get_data(task);
+    xbt_assert(task != nullptr, "Task is nullptr");
+    jobject jtask_global = static_cast<jobject>(MSG_task_get_data(task));
     //case where the data has already been retrieved
-    if (jtask_global == NULL) {
+    if (jtask_global == nullptr) {
       return;
     }
 
@@ -39,7 +39,7 @@ void jcomm_bind_task(JNIEnv *env, jobject jcomm) {
 
     env->SetObjectField(jcomm, jtask_field_Comm_task, jtask_local);
 
-    MSG_task_set_data(task, NULL);
+    MSG_task_set_data(task, nullptr);
   }
 }
 
@@ -111,7 +111,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Comm_waitCompletion(JNIEnv *env, job
   }
 
   msg_error_t status;
-  status = MSG_comm_wait(comm,(double)timeout);
+  status = MSG_comm_wait(comm,static_cast<double>(timeout));
   env->SetBooleanField(jcomm, jcomm_field_Comm_finished, JNI_TRUE);
   if (status == MSG_OK) {
     jcomm_bind_task(env,jcomm);
@@ -120,3 +120,31 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Comm_waitCompletion(JNIEnv *env, job
     jmsg_throw_status(env,status);
   }
 }
+
+JNIEXPORT void JNICALL Java_org_simgrid_msg_Comm_waitAll(JNIEnv *env, jclass cls, jobjectArray jcomms, jdouble timeout)
+{
+  int count = env->GetArrayLength(jcomms);
+  msg_comm_t* comms = xbt_new(msg_comm_t, count);
+
+  for (int i=0; i < count; i++) {
+     jobject jcomm = env->GetObjectArrayElement(jcomms, i);
+     if (env->ExceptionOccurred())
+        break;
+
+     comms[i] = (msg_comm_t) (uintptr_t) env->GetLongField(jcomm, jcomm_field_Comm_bind);
+     if (!comms[i]) {
+       jxbt_throw_native(env,bprintf("comm at rank %d is null",i));
+       return;
+     }
+
+     env->DeleteLocalRef(jcomm); // reduce the load on the garbage collector: we don't need that object anymore
+  }
+  MSG_comm_waitall(comms, count, static_cast<double>(timeout));
+  xbt_free(comms);
+}
+/*
+JNIEXPORT void JNICALL Java_org_simgrid_msg_Comm_waitAny(JNIEnv *env, jobject jcomm, jarray comms)
+{
+
+}
+*/