Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[java] Switch Java bindings to .cpp
[simgrid.git] / src / bindings / java / jmsg_task.cpp
1 /* Functions related to the java task instances.                            */
2
3 /* Copyright (c) 2007, 2009-2010, 2013-2015. The SimGrid Team.
4  * All rights reserved.                                                     */
5
6 /* This program is free software; you can redistribute it and/or modify it
7  * under the terms of the license (GNU LGPL) which comes with this package. */
8
9 #include "jmsg.h"
10
11 #include "jmsg_host.h"
12 #include "jmsg_task.h"
13
14 #include "jxbt_utilities.h"
15
16 #include <simgrid/msg.h>
17
18 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
19
20 jobject native_to_java_process(msg_process_t process);
21
22 static jmethodID jtask_method_Comm_constructor;
23
24 static jfieldID jtask_field_Task_bind;
25 static jfieldID jtask_field_Task_name;
26 static jfieldID jtask_field_Task_messageSize;
27 static jfieldID jtask_field_Comm_bind;
28 static jfieldID jtask_field_Comm_taskBind;
29 static jfieldID jtask_field_Comm_receiving;
30
31 void jtask_bind(jobject jtask, msg_task_t task, JNIEnv * env)
32 {
33   env->SetLongField(jtask, jtask_field_Task_bind, (intptr_t)task);
34 }
35
36 msg_task_t jtask_to_native_task(jobject jtask, JNIEnv * env)
37 {
38   return (msg_task_t)(intptr_t)env->GetLongField(jtask, jtask_field_Task_bind);
39 }
40
41 jboolean jtask_is_valid(jobject jtask, JNIEnv * env)
42 {
43   return env->GetLongField(jtask, jtask_field_Task_bind) ? JNI_TRUE : JNI_FALSE;
44 }
45
46 JNIEXPORT void JNICALL
47 Java_org_simgrid_msg_Task_nativeInit(JNIEnv *env, jclass cls) {
48   jclass jtask_class_Comm = env->FindClass("org/simgrid/msg/Comm");
49   jclass jtask_class_Task = env->FindClass("org/simgrid/msg/Task");
50
51   jtask_method_Comm_constructor = env->GetMethodID(jtask_class_Comm, "<init>", "()V");
52   jtask_field_Task_bind = jxbt_get_jfield(env, jtask_class_Task, "bind", "J");
53   jtask_field_Task_name = jxbt_get_jfield(env, jtask_class_Task, "name", "Ljava/lang/String;");
54   jtask_field_Task_messageSize = jxbt_get_jfield(env, jtask_class_Task, "messageSize", "D");
55   jtask_field_Comm_bind = jxbt_get_jfield(env, jtask_class_Comm, "bind", "J");
56   jtask_field_Comm_taskBind = jxbt_get_jfield(env, jtask_class_Comm, "taskBind", "J");
57   jtask_field_Comm_receiving = jxbt_get_jfield(env, jtask_class_Comm, "receiving", "Z");
58   if (!jtask_field_Task_bind || !jtask_class_Task || !jtask_field_Comm_bind || !jtask_field_Comm_taskBind ||
59         !jtask_field_Comm_receiving || !jtask_method_Comm_constructor) {
60           jxbt_throw_native(env,bprintf("Can't find some fields in Java class."));
61   }
62 }
63
64 JNIEXPORT void JNICALL
65 Java_org_simgrid_msg_Task_create(JNIEnv * env,
66                                       jobject jtask, jstring jname,
67                                       jdouble jflopsAmount,
68                                       jdouble jbytesAmount)
69 {
70   msg_task_t task;                /* the native task to create                            */
71   const char *name = NULL;      /* the name of the task                                 */
72
73   if (jflopsAmount < 0) {
74     jxbt_throw_illegal(env,
75                        bprintf
76                        ("Task flopsAmount (%f) cannot be negative",
77                         (double) jflopsAmount));
78     return;
79   }
80
81   if (jbytesAmount < 0) {
82     jxbt_throw_illegal(env,
83                        bprintf("Task bytesAmount (%f) cannot be negative",
84                        (double) jbytesAmount));
85     return;
86   }
87
88   if (jname) {
89     /* get the C string from the java string */
90     name = env->GetStringUTFChars(jname, 0);
91   }
92
93   /* create the task */
94   task =
95       MSG_task_create(name, (double) jflopsAmount,
96                      (double) jbytesAmount, NULL);
97   if (jname)
98     env->ReleaseStringUTFChars(jname, name);
99   /* sets the task name */
100   env->SetObjectField(jtask, jtask_field_Task_name, jname);
101   /* bind & store the task */
102   jtask_bind(jtask, task, env);
103   MSG_task_set_data(task, jtask);
104 }
105
106 JNIEXPORT void JNICALL
107 Java_org_simgrid_msg_Task_parallelCreate(JNIEnv * env,
108                                          jobject jtask,
109                                          jstring jname,
110                                          jobjectArray jhosts,
111                                          jdoubleArray
112                                          jcomputeDurations_arg,
113                                          jdoubleArray
114                                          jmessageSizes_arg) {
115
116   msg_task_t task;                /* the native parallel task to create           */
117   const char *name;             /* the name of the task                         */
118   int host_count;
119   msg_host_t *hosts;
120   double *computeDurations;
121   double *messageSizes;
122   jdouble *jcomputeDurations;
123   jdouble *jmessageSizes;
124
125   jobject jhost;
126   int index;
127
128   if (!jcomputeDurations_arg) {
129     jxbt_throw_null(env,
130                     xbt_strdup
131                     ("Parallel task flops amounts cannot be null"));
132     return;
133   }
134
135   if (!jmessageSizes_arg) {
136     jxbt_throw_null(env,
137                     xbt_strdup
138                     ("Parallel task bytes amounts cannot be null"));
139     return;
140   }
141
142   if (!jname) {
143     jxbt_throw_null(env, xbt_strdup("Parallel task name cannot be null"));
144     return;
145   }
146
147   host_count = (int) env->GetArrayLength(jhosts);
148
149
150   hosts = xbt_new0(msg_host_t, host_count);
151   computeDurations = xbt_new0(double, host_count);
152   messageSizes = xbt_new0(double, host_count * host_count);
153
154   jcomputeDurations =
155       env->GetDoubleArrayElements(jcomputeDurations_arg, 0);
156   jmessageSizes =
157       env->GetDoubleArrayElements(jmessageSizes_arg, 0);
158
159   for (index = 0; index < host_count; index++) {
160     jhost = env->GetObjectArrayElement(jhosts, index);
161     hosts[index] = jhost_get_native(env, jhost);
162     computeDurations[index] = jcomputeDurations[index];
163   }
164   for (index = 0; index < host_count * host_count; index++) {
165     messageSizes[index] = jmessageSizes[index];
166   }
167
168   env->ReleaseDoubleArrayElements(jcomputeDurations_arg,
169                                      jcomputeDurations, 0);
170   env->ReleaseDoubleArrayElements(jmessageSizes_arg, jmessageSizes, 0);
171
172   /* get the C string from the java string */
173   name = env->GetStringUTFChars(jname, 0);
174
175   task =
176       MSG_parallel_task_create(name, host_count, hosts, computeDurations,
177                                messageSizes, NULL);
178
179   env->ReleaseStringUTFChars(jname, name);
180   /* sets the task name */
181   env->SetObjectField(jtask, jtask_field_Task_name, jname);
182   /* associate the java task object and the native task */
183   jtask_bind(jtask, task, env);
184
185   MSG_task_set_data(task, (void *) jtask);
186
187   if (!MSG_task_get_data(task))
188     jxbt_throw_jni(env, "global ref allocation failed");
189 }
190
191 JNIEXPORT void JNICALL
192 Java_org_simgrid_msg_Task_cancel(JNIEnv * env,
193                                       jobject jtask)
194 {
195   msg_task_t ptask = jtask_to_native_task(jtask, env);
196
197   if (!ptask) {
198     jxbt_throw_notbound(env, "task", jtask);
199     return;
200   }
201
202   msg_error_t rv = MSG_task_cancel(ptask);
203
204   jxbt_check_res("MSG_task_cancel()", rv, MSG_OK,
205                  bprintf("unexpected error , please report this bug"));
206 }
207
208 JNIEXPORT void JNICALL
209 Java_org_simgrid_msg_Task_execute(JNIEnv * env, jobject jtask)
210 {
211   msg_task_t task = jtask_to_native_task(jtask, env);
212
213   if (!task) {
214     jxbt_throw_notbound(env, "task", jtask);
215     return;
216   }
217   msg_error_t rv;
218   rv = MSG_task_execute(task);
219   if (env->ExceptionOccurred())
220     return;
221   if (rv != MSG_OK) {
222     jmsg_throw_status(env, rv);
223   }
224 }
225
226 JNIEXPORT void JNICALL
227 Java_org_simgrid_msg_Task_setBound(JNIEnv * env, jobject jtask, jdouble load)
228 {
229   msg_task_t task = jtask_to_native_task(jtask, env);
230
231   if (!task) {
232     jxbt_throw_notbound(env, "task", jtask);
233     return;
234   }
235   MSG_task_set_bound(task, load);
236 }
237
238 JNIEXPORT jstring JNICALL
239 Java_org_simgrid_msg_Task_getName(JNIEnv * env,
240                                        jobject jtask) {
241   msg_task_t task = jtask_to_native_task(jtask, env);
242
243   if (!task) {
244     jxbt_throw_notbound(env, "task", jtask);
245     return NULL;
246   }
247
248   return env->NewStringUTF(MSG_task_get_name(task));
249 }
250
251 JNIEXPORT jobject JNICALL
252 Java_org_simgrid_msg_Task_getSender(JNIEnv * env,
253                                          jobject jtask) {
254   msg_process_t process;
255
256   msg_task_t task = jtask_to_native_task(jtask, env);
257
258   if (!task) {
259     jxbt_throw_notbound(env, "task", jtask);
260     return NULL;
261   }
262
263   process = MSG_task_get_sender(task);
264   if (process == NULL) {
265         return NULL;
266   }
267   return (jobject) native_to_java_process(process);
268 }
269
270 JNIEXPORT jobject JNICALL
271 Java_org_simgrid_msg_Task_getSource(JNIEnv * env,
272                                          jobject jtask)
273 {
274   msg_host_t host;
275   msg_task_t task = jtask_to_native_task(jtask, env);
276
277   if (!task) {
278     jxbt_throw_notbound(env, "task", jtask);
279     return NULL;
280   }
281
282   host = MSG_task_get_source(task);
283   if (host == NULL) {
284         return NULL;
285   }
286   if (!xbt_lib_get_level(host, JAVA_HOST_LEVEL)) {
287     jxbt_throw_jni(env, "MSG_task_get_source() failed");
288     return NULL;
289   }
290
291   return (jobject) xbt_lib_get_level(host, JAVA_HOST_LEVEL);
292 }
293
294 JNIEXPORT jdouble JNICALL
295 Java_org_simgrid_msg_Task_getFlopsAmount(JNIEnv * env, jobject jtask)
296 {
297   msg_task_t ptask = jtask_to_native_task(jtask, env);
298
299   if (!ptask) {
300     jxbt_throw_notbound(env, "task", jtask);
301     return -1;
302   }
303   return (jdouble) MSG_task_get_flops_amount(ptask);
304 }
305
306 JNIEXPORT void JNICALL
307 Java_org_simgrid_msg_Task_setName(JNIEnv *env, jobject jtask, jobject jname) {
308         msg_task_t task = jtask_to_native_task(jtask, env);
309
310         if (!task) {
311                 jxbt_throw_notbound(env, "task", jtask);
312                 return;
313         }
314         const char *name = env->GetStringUTFChars((jstring) jname, 0);
315
316         env->SetObjectField(jtask, jtask_field_Task_name, jname);
317         MSG_task_set_name(task, name);
318
319         env->ReleaseStringUTFChars((jstring) jname, name);
320 }
321 JNIEXPORT void JNICALL
322 Java_org_simgrid_msg_Task_setPriority(JNIEnv * env,
323                                            jobject jtask, jdouble priority)
324 {
325   msg_task_t task = jtask_to_native_task(jtask, env);
326
327   if (!task) {
328     jxbt_throw_notbound(env, "task", jtask);
329     return;
330   }
331   MSG_task_set_priority(task, (double) priority);
332 }
333 JNIEXPORT void JNICALL
334 Java_org_simgrid_msg_Task_setFlopsAmount
335                 (JNIEnv *env, jobject jtask, jdouble computationAmount) {
336         msg_task_t task = jtask_to_native_task(jtask, env);
337
338         if (!task) {
339     jxbt_throw_notbound(env, "task", jtask);
340     return;
341         }
342         MSG_task_set_flops_amount(task, (double) computationAmount);
343 }
344 JNIEXPORT void JNICALL
345 Java_org_simgrid_msg_Task_setBytesAmount
346                 (JNIEnv *env, jobject jtask, jdouble dataSize) {
347         msg_task_t task = jtask_to_native_task(jtask, env);
348
349         if (!task) {
350     jxbt_throw_notbound(env, "task", jtask);
351     return;
352         }
353   env->SetDoubleField(jtask, jtask_field_Task_messageSize, dataSize);
354         MSG_task_set_bytes_amount(task, (double) dataSize);
355 }
356
357 JNIEXPORT void JNICALL
358 Java_org_simgrid_msg_Task_send(JNIEnv * env,jobject jtask,
359                                jstring jalias,
360                                jdouble jtimeout)
361 {
362   msg_error_t rv;
363   const char *alias = env->GetStringUTFChars(jalias, 0);
364
365   msg_task_t task = jtask_to_native_task(jtask, env);
366
367
368   if (!task) {
369     env->ReleaseStringUTFChars(jalias, alias);
370     jxbt_throw_notbound(env, "task", jtask);
371     return;
372   }
373
374   /* Pass a global ref to the Jtask into the Ctask so that the receiver can use it */
375   MSG_task_set_data(task, (void *) env->NewGlobalRef(jtask));
376   rv = MSG_task_send_with_timeout(task, alias, (double) jtimeout);
377   env->ReleaseStringUTFChars(jalias, alias);
378
379   if (rv != MSG_OK) {
380     jmsg_throw_status(env, rv);
381   }
382 }
383
384 JNIEXPORT void JNICALL
385 Java_org_simgrid_msg_Task_sendBounded(JNIEnv * env,jobject jtask,
386                                       jstring jalias,
387                                       jdouble jtimeout,
388                                       jdouble maxrate)
389 {
390   msg_error_t rv;
391   const char *alias = env->GetStringUTFChars(jalias, 0);
392
393   msg_task_t task = jtask_to_native_task(jtask, env);
394
395
396   if (!task) {
397     env->ReleaseStringUTFChars(jalias, alias);
398     jxbt_throw_notbound(env, "task", jtask);
399     return;
400   }
401
402   /* Pass a global ref to the Jtask into the Ctask so that the receiver can use it */
403   MSG_task_set_data(task, (void *) env->NewGlobalRef(jtask));
404   rv = MSG_task_send_with_timeout_bounded(task, alias, (double) jtimeout, (double) maxrate);
405   env->ReleaseStringUTFChars(jalias, alias);
406
407   if (rv != MSG_OK) {
408     jmsg_throw_status(env, rv);
409   }
410 }
411
412 JNIEXPORT jobject JNICALL
413 Java_org_simgrid_msg_Task_receive(JNIEnv * env, jclass cls,
414                                   jstring jalias, jdouble jtimeout,
415                                   jobject jhost)
416 {
417   msg_error_t rv;
418   msg_task_t *task = xbt_new(msg_task_t,1);
419   *task = NULL;
420
421   msg_host_t host = NULL;
422   jobject jtask_global, jtask_local;
423   const char *alias;
424
425   if (jhost) {
426     host = jhost_get_native(env, jhost);
427
428     if (!host) {
429       jxbt_throw_notbound(env, "host", jhost);
430       return NULL;
431     }
432   }
433
434   alias = env->GetStringUTFChars(jalias, 0);
435   rv = MSG_task_receive_ext(task, alias, (double) jtimeout, host);
436   if (env->ExceptionOccurred())
437     return NULL;
438   if (rv != MSG_OK) {
439     jmsg_throw_status(env,rv);
440     return NULL;
441   }
442   jtask_global = (jobject) MSG_task_get_data(*task);
443
444   /* Convert the global ref into a local ref so that the JVM can free the stuff */
445   jtask_local = env->NewLocalRef(jtask_global);
446   env->DeleteGlobalRef(jtask_global);
447   MSG_task_set_data(*task, NULL);
448
449   env->ReleaseStringUTFChars(jalias, alias);
450
451   xbt_free(task);
452
453   return (jobject) jtask_local;
454 }
455
456
457 JNIEXPORT jobject JNICALL
458 Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) {
459         msg_comm_t comm;
460         const char *mailbox;
461         jclass comm_class;
462         //pointer to store the task object pointer.
463         msg_task_t *task = xbt_new(msg_task_t,1);
464         *task = NULL;
465         /* There should be a cache here */
466         comm_class = env->FindClass("org/simgrid/msg/Comm");
467
468         if (!comm_class) {
469                 jxbt_throw_native(env,bprintf("fieldID or methodID or class not found."));
470                 return NULL;
471         }
472
473         jobject jcomm = env->NewObject(comm_class, jtask_method_Comm_constructor);
474         if (!jcomm) {
475                 jxbt_throw_native(env,bprintf("Can't create a Comm object."));
476                 return NULL;
477         }
478
479         mailbox = env->GetStringUTFChars(jmailbox, 0);
480
481         comm = MSG_task_irecv(task,mailbox);
482
483         env->SetLongField(jcomm, jtask_field_Comm_bind, (jlong) (uintptr_t)(comm));
484         env->SetLongField(jcomm, jtask_field_Comm_taskBind, (jlong) (uintptr_t)(task));
485         env->SetBooleanField(jcomm, jtask_field_Comm_receiving, JNI_TRUE);
486
487         env->ReleaseStringUTFChars(jmailbox, mailbox);
488
489         return jcomm;
490 }
491
492
493 JNIEXPORT jobject JNICALL
494 Java_org_simgrid_msg_Task_receiveBounded(JNIEnv * env, jclass cls,
495                                   jstring jalias, jdouble jtimeout,
496                                   jobject jhost, jdouble rate)
497 {
498   msg_error_t rv;
499   msg_task_t *task = xbt_new(msg_task_t,1);
500   *task = NULL;
501
502   msg_host_t host = NULL;
503   jobject jtask_global, jtask_local;
504   const char *alias;
505
506   if (jhost) {
507     host = jhost_get_native(env, jhost);
508
509     if (!host) {
510       jxbt_throw_notbound(env, "host", jhost);
511       return NULL;
512     }
513   }
514
515   alias = env->GetStringUTFChars(jalias, 0);
516   rv = MSG_task_receive_ext_bounded(task, alias, (double) jtimeout, host, (double) rate);
517   if (env->ExceptionOccurred())
518     return NULL;
519   if (rv != MSG_OK) {
520     jmsg_throw_status(env,rv);
521     return NULL;
522   }
523   jtask_global = (jobject) MSG_task_get_data(*task);
524
525   /* Convert the global ref into a local ref so that the JVM can free the stuff */
526   jtask_local = env->NewLocalRef(jtask_global);
527   env->DeleteGlobalRef(jtask_global);
528   MSG_task_set_data(*task, NULL);
529
530   env->ReleaseStringUTFChars(jalias, alias);
531
532   xbt_free(task);
533
534   return (jobject) jtask_local;
535 }
536
537
538 JNIEXPORT jobject JNICALL
539 Java_org_simgrid_msg_Task_irecvBounded(JNIEnv * env, jclass cls,
540                 jstring jmailbox, jdouble rate) {
541         msg_comm_t comm;
542         const char *mailbox;
543         jclass comm_class;
544         //pointer to store the task object pointer.
545         msg_task_t *task = xbt_new(msg_task_t,1);
546         *task = NULL;
547         /* There should be a cac hee */
548         comm_class = env->FindClass("org/simgrid/msg/Comm");
549
550         if (!comm_class) {
551                 jxbt_throw_native(env,bprintf("fieldID or methodID or class not found."));
552                 return NULL;
553         }
554
555         jobject jcomm = env->NewObject(comm_class, jtask_method_Comm_constructor);
556         if (!jcomm) {
557                 jxbt_throw_native(env,bprintf("Can't create a Comm object."));
558                 return NULL;
559         }
560
561         mailbox = env->GetStringUTFChars(jmailbox, 0);
562
563         comm = MSG_task_irecv_bounded(task,mailbox, (double) rate);
564
565         env->SetLongField(jcomm, jtask_field_Comm_bind, (jlong) (uintptr_t)(comm));
566         env->SetLongField(jcomm, jtask_field_Comm_taskBind, (jlong) (uintptr_t)(task));
567         env->SetBooleanField(jcomm, jtask_field_Comm_receiving, JNI_TRUE);
568
569         env->ReleaseStringUTFChars(jmailbox, mailbox);
570
571         return jcomm;
572 }
573
574 JNIEXPORT jobject JNICALL
575 Java_org_simgrid_msg_Task_isend(JNIEnv *env, jobject jtask, jstring jmailbox) {
576   jclass comm_class;
577
578   const char *mailbox;
579
580   msg_task_t task;
581
582   jobject jcomm;
583   msg_comm_t comm;
584
585   comm_class = env->FindClass("org/simgrid/msg/Comm");
586
587   if (!comm_class) return NULL;
588
589   jcomm = env->NewObject(comm_class, jtask_method_Comm_constructor);
590   mailbox = env->GetStringUTFChars(jmailbox, 0);
591
592   task = jtask_to_native_task(jtask, env);
593
594   if (!task) {
595     env->ReleaseStringUTFChars(jmailbox, mailbox);
596     env->DeleteLocalRef(jcomm);
597     jxbt_throw_notbound(env, "task", jtask);
598         return NULL;
599   }
600
601 MSG_task_set_data(task, (void *) env->NewGlobalRef(jtask));
602   comm = MSG_task_isend(task,mailbox);
603
604   env->SetLongField(jcomm, jtask_field_Comm_bind, (jlong) (uintptr_t)(comm));
605   env->SetLongField(jcomm, jtask_field_Comm_taskBind, (jlong) (uintptr_t)(NULL));
606   env->SetBooleanField(jcomm, jtask_field_Comm_receiving, JNI_FALSE);
607
608   env->ReleaseStringUTFChars(jmailbox, mailbox);
609
610   return jcomm;
611 }
612
613 JNIEXPORT jobject JNICALL
614 Java_org_simgrid_msg_Task_isendBounded(JNIEnv *env, jobject jtask, jstring jmailbox, jdouble maxrate) {
615   jclass comm_class;
616
617   const char *mailbox;
618
619   msg_task_t task;
620
621   jobject jcomm;
622   msg_comm_t comm;
623
624   comm_class = env->FindClass("org/simgrid/msg/Comm");
625
626   if (!comm_class) return NULL;
627
628   jcomm = env->NewObject(comm_class, jtask_method_Comm_constructor);
629   mailbox = env->GetStringUTFChars(jmailbox, 0);
630
631   task = jtask_to_native_task(jtask, env);
632
633   if (!task) {
634     env->ReleaseStringUTFChars(jmailbox, mailbox);
635     env->DeleteLocalRef(jcomm);
636     jxbt_throw_notbound(env, "task", jtask);
637         return NULL;
638   }
639
640   MSG_task_set_data(task, (void *) env->NewGlobalRef(jtask));
641   comm = MSG_task_isend_bounded(task,mailbox,maxrate);
642
643   env->SetLongField(jcomm, jtask_field_Comm_bind, (jlong) (uintptr_t)(comm));
644   env->SetLongField(jcomm, jtask_field_Comm_taskBind, (jlong) (uintptr_t)(NULL));
645   env->SetBooleanField(jcomm, jtask_field_Comm_receiving, JNI_FALSE);
646
647   env->ReleaseStringUTFChars(jmailbox, mailbox);
648
649   return jcomm;
650 }
651
652 JNIEXPORT void JNICALL
653 Java_org_simgrid_msg_Task_nativeFinalize(JNIEnv * env, jobject jtask) {
654           msg_task_t task = jtask_to_native_task(jtask, env);
655
656           if (!task) {
657             jxbt_throw_notbound(env, "task", jtask);
658             return;
659           }
660
661           MSG_task_destroy(task);
662 }
663
664 static void msg_task_cancel_on_failed_dsend(void*t) {
665   msg_task_t task = (msg_task_t) t;
666   JNIEnv *env =get_current_thread_env();
667   jobject jtask_global = (jobject) MSG_task_get_data(task);
668
669   /* Destroy the global ref so that the JVM can free the stuff */
670   env->DeleteGlobalRef(jtask_global);
671   MSG_task_set_data(task, NULL);
672   MSG_task_destroy(task);
673 }
674
675 JNIEXPORT void JNICALL
676 Java_org_simgrid_msg_Task_dsend(JNIEnv * env, jobject jtask,
677                                 jstring jalias) {
678   const char *alias = env->GetStringUTFChars(jalias, 0);
679
680   msg_task_t task = jtask_to_native_task(jtask, env);
681
682
683   if (!task) {
684     env->ReleaseStringUTFChars(jalias, alias);
685     jxbt_throw_notbound(env, "task", jtask);
686     return;
687   }
688
689   /* Pass a global ref to the Jtask into the Ctask so that the receiver can use it */
690   MSG_task_set_data(task, (void *) env->NewGlobalRef(jtask));
691   MSG_task_dsend(task, alias, msg_task_cancel_on_failed_dsend);
692
693   env->ReleaseStringUTFChars(jalias, alias);
694 }
695
696 JNIEXPORT void JNICALL
697 Java_org_simgrid_msg_Task_dsendBounded(JNIEnv * env, jobject jtask,
698                                 jstring jalias, jdouble maxrate) {
699   const char *alias = env->GetStringUTFChars(jalias, 0);
700
701   msg_task_t task = jtask_to_native_task(jtask, env);
702
703
704   if (!task) {
705     env->ReleaseStringUTFChars(jalias, alias);
706     jxbt_throw_notbound(env, "task", jtask);
707     return;
708   }
709
710   /* Pass a global ref to the Jtask into the Ctask so that the receiver can use it */
711   MSG_task_set_data(task, (void *) env->NewGlobalRef(jtask));
712   MSG_task_dsend_bounded(task, alias, msg_task_cancel_on_failed_dsend,(double)maxrate);
713
714   env->ReleaseStringUTFChars(jalias, alias);
715 }
716
717
718
719 JNIEXPORT jboolean JNICALL
720 Java_org_simgrid_msg_Task_listen(JNIEnv * env, jclass cls, jstring jalias)
721 {
722   const char *alias;
723   int rv;
724
725   alias = env->GetStringUTFChars(jalias, 0);
726   rv = MSG_task_listen(alias);
727   env->ReleaseStringUTFChars(jalias, alias);
728
729   return (jboolean) rv;
730 }
731
732 JNIEXPORT jint JNICALL
733 Java_org_simgrid_msg_Task_listenFromHost(JNIEnv * env, jclass cls, jstring jalias, jobject jhost)
734  {
735   int rv;
736   const char *alias;
737
738   msg_host_t host = jhost_get_native(env, jhost);
739
740   if (!host) {
741     jxbt_throw_notbound(env, "host", jhost);
742     return -1;
743   }
744   alias = env->GetStringUTFChars(jalias, 0);
745   rv = MSG_task_listen_from_host(alias, host);
746   env->ReleaseStringUTFChars(jalias, alias);
747
748   return (jint) rv;
749 }
750
751
752 JNIEXPORT jint JNICALL
753 Java_org_simgrid_msg_Task_listenFrom(JNIEnv * env, jclass cls, jstring jalias)
754 {
755   int rv;
756   const char *alias = env->GetStringUTFChars(jalias, 0);
757   rv = MSG_task_listen_from(alias);
758   env->ReleaseStringUTFChars(jalias, alias);
759
760   return (jint) rv;
761 }