Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Change function called.
[simgrid.git] / src / java / jmsg.c
index c4e40da..1432365 100644 (file)
@@ -231,13 +231,13 @@ Java_simgrid_msg_MsgNative_processGetHost(JNIEnv * env, jclass cls,
 
   host = MSG_process_get_host(process);
 
-  if (!host->data) {
+  if (!MSG_host_get_data(host)) {
     jxbt_throw_jni(env, "MSG_process_get_host() failed");
     return NULL;
   }
 
   /* return the global reference to the java host instance */
-  return (jobject) host->data;
+  return (jobject) MSG_host_get_data(host);
 
 }
 
@@ -364,7 +364,7 @@ Java_simgrid_msg_MsgNative_hostGetByName(JNIEnv * env, jclass cls,
     return NULL;
   }
 
-  if (!host->data) {            /* native host not associated yet with java host */
+  if (!MSG_host_get_data(host)) {            /* native host not associated yet with java host */
 
     /* instanciate a new java host */
     jhost = jhost_new_instance(env);
@@ -388,11 +388,11 @@ Java_simgrid_msg_MsgNative_hostGetByName(JNIEnv * env, jclass cls,
     /* the native host data field is set with the global reference to the 
      * java host returned by this function 
      */
-    host->data = (void *) jhost;
+    MSG_host_set_data(host,(void *) jhost);
   }
 
   /* return the global reference to the java host instance */
-  return (jobject) host->data;
+  return (jobject) MSG_host_get_data(host);
 }
 
 JNIEXPORT jstring JNICALL
@@ -406,7 +406,7 @@ Java_simgrid_msg_MsgNative_hostGetName(JNIEnv * env, jclass cls,
     return NULL;
   }
 
-  return (*env)->NewStringUTF(env, host->name);
+  return (*env)->NewStringUTF(env, MSG_host_get_name(host));
 }
 
 JNIEXPORT jint JNICALL
@@ -422,7 +422,7 @@ Java_simgrid_msg_MsgNative_hostSelf(JNIEnv * env, jclass cls)
 
   m_host_t host = MSG_host_self();
 
-  if (!host->data) {
+  if (!MSG_host_get_data(host)) {
     /* the native host not yet associated with the java host instance */
 
     /* instanciate a new java host instance */
@@ -443,9 +443,9 @@ Java_simgrid_msg_MsgNative_hostSelf(JNIEnv * env, jclass cls)
 
     /* Bind & store it */
     jhost_bind(jhost, host, env);
-    host->data = (void *) jhost;
+    MSG_host_set_data(host,(void *) jhost);
   } else {
-    jhost = (jobject) host->data;
+    jhost = (jobject) MSG_host_get_data(host);
   }
 
   return jhost;
@@ -537,13 +537,7 @@ Java_simgrid_msg_MsgNative_taskCreate(JNIEnv * env, jclass cls, jobject jtask,
 
   /* bind & store the task */
   jtask_bind(jtask, task, env);
-
-  /* allocate a new global reference to the java task instance */
-  task->data = (void *) jtask_new_global_ref(jtask, env);
-
-  if (!task->data)
-    jxbt_throw_jni(env, "global ref allocation failed");
-
+  MSG_task_set_data(task,jtask);
 }
 
 JNIEXPORT void JNICALL
@@ -624,9 +618,9 @@ Java_simgrid_msg_MsgNative_parallel_taskCreate(JNIEnv * env, jclass cls,
   /* associate the java task object and the native task */
   jtask_bind(jtask, task, env);
 
-  task->data = (void *) jtask;
+  MSG_task_set_data(task,(void*) jtask);
 
-  if (!task->data)
+  if (!MSG_task_get_data(task))
     jxbt_throw_jni(env, "global ref allocation failed");
 }
 
@@ -661,12 +655,12 @@ Java_simgrid_msg_MsgNative_taskGetSource(JNIEnv * env, jclass cls,
 
   host = MSG_task_get_source(task);
 
-  if (!host->data) {
+  if (!MSG_host_get_data(host)) {
     jxbt_throw_jni(env, "MSG_task_get_source() failed");
     return NULL;
   }
 
-  return (jobject) host->data;
+  return (jobject) MSG_host_get_data(host);
 }
 
 
@@ -681,7 +675,7 @@ Java_simgrid_msg_MsgNative_taskGetName(JNIEnv * env, jclass cls,
     return NULL;
   }
 
-  return (*env)->NewStringUTF(env, task->name);
+  return (*env)->NewStringUTF(env, MSG_task_get_name(task));
 }
 
 JNIEXPORT void JNICALL
@@ -752,16 +746,12 @@ Java_simgrid_msg_MsgNative_taskDestroy(JNIEnv * env, jclass cls,
     jxbt_throw_notbound(env, "task", task);
     return;
   }
-  jtask = (jobject) task->data;
+  jtask = (jobject) MSG_task_get_data(task);
     
   MSG_error_t rv = MSG_task_destroy(task);
     
   jxbt_check_res("MSG_task_destroy()",rv,MSG_OK,
     bprintf("unexpected error , please report this bug"));
-
-
-  /* delete the global reference to the java task object */
-  jtask_delete_global_ref(jtask, env);
 }
 
 JNIEXPORT void JNICALL
@@ -935,10 +925,10 @@ Java_simgrid_msg_MsgNative_allHosts(JNIEnv * env, jclass cls_arg)
 
   for (index = 0; index < count; index++) {
     host = table[index];
-    jhost = (jobject) (host->data);
+    jhost = (jobject) (MSG_host_get_data(host));
 
     if (!jhost) {
-      jname = (*env)->NewStringUTF(env, host->name);
+      jname = (*env)->NewStringUTF(env, MSG_host_get_name(host));
 
       jhost = Java_simgrid_msg_MsgNative_hostGetByName(env, cls_arg, jname);
       /* FIXME: leak of jname ? */
@@ -995,6 +985,8 @@ Java_simgrid_msg_MsgNative_taskSend(JNIEnv * env, jclass cls,
     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));
   rv = MSG_task_send_with_timeout(task, alias, (double) jtimeout);
 
   (*env)->ReleaseStringUTFChars(env, jalias, alias);
@@ -1019,6 +1011,8 @@ Java_simgrid_msg_MsgNative_taskSendBounded(JNIEnv * env, jclass cls,
 
   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));
   rv = MSG_task_send_bounded(task, alias, (double) jmaxRate);
 
   (*env)->ReleaseStringUTFChars(env, jalias, alias);
@@ -1036,6 +1030,7 @@ Java_simgrid_msg_MsgNative_taskReceive(JNIEnv * env, jclass cls,
   MSG_error_t rv;
   m_task_t task = NULL;
   m_host_t host = NULL;
+  jobject jtask_global, jtask_local;
   const char *alias;
 
   if (jhost) {
@@ -1050,13 +1045,19 @@ Java_simgrid_msg_MsgNative_taskReceive(JNIEnv * env, jclass cls,
   alias = (*env)->GetStringUTFChars(env, jalias, 0);
 
   rv = MSG_task_receive_ext(&task, alias, (double) jtimeout, host);
+  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);
 
   jxbt_check_res("MSG_task_receive_ext()",rv, MSG_HOST_FAILURE|MSG_TRANSFER_FAILURE|MSG_TIMEOUT,
     bprintf("while receiving from mailbox %s",alias));
 
-  return (jobject) task->data;
+  return (jobject) jtask_local;
 }
 
 JNIEXPORT jboolean JNICALL