Logo AND Algorithmique Numérique Distribuée

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