Logo AND Algorithmique Numérique Distribuée

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