Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
4800dd784b5dfe27dfa2dc04bef8c2da6c1cd111
[simgrid.git] / src / jmsg_task.c
1 /* Functions related to the java task instances.                            */
2
3 /* Copyright (c) 2007, 2009, 2010. 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 #include "jmsg_task.h"
11 #include "jxbt_utilities.h"
12
13 #include <msg/msg.h>
14 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
15
16 void jtask_bind(jobject jtask, m_task_t task, JNIEnv * env)
17 {
18   jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J");
19
20   if (!id)
21     return;
22
23   (*env)->SetLongField(env, jtask, id, (jlong) (long) (task));
24 }
25
26 m_task_t jtask_to_native_task(jobject jtask, JNIEnv * env)
27 {
28   jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J");
29
30   if (!id)
31     return NULL;
32
33   return (m_task_t) (long) (*env)->GetLongField(env, jtask, id);
34 }
35
36 jboolean jtask_is_valid(jobject jtask, JNIEnv * env)
37 {
38   jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J");
39
40   if (!id)
41     return JNI_FALSE;
42
43   return (*env)->GetLongField(env, jtask, id) ? JNI_TRUE : JNI_FALSE;
44 }
45
46 JNIEXPORT jobject JNICALL
47 Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) {
48         msg_comm_t comm;
49         const char *mailbox;
50         jclass comm_class;
51         jmethodID cid;
52         jfieldID id;
53         jfieldID id_task;
54         jfieldID id_receiving;
55         //pointer to store the task object pointer.
56         m_task_t *task = xbt_new(m_task_t,1);
57         *task = NULL;
58         /* There should be a cache here */
59         comm_class = (*env)->FindClass(env, "org/simgrid/msg/Comm");
60         cid = (*env)->GetMethodID(env, comm_class, "<init>", "()V");
61         id = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J");
62         id_task = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bindTask", "J");
63         id_receiving = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "receiving", "Z");
64
65
66         if (!id || !id_task || !comm_class || !cid || !id_receiving) {
67                 jxbt_throw_native(env,bprintf("fieldID or methodID or class not found."));
68                 return NULL;
69         }
70
71         jobject jcomm = (*env)->NewObject(env, comm_class, cid);
72         if (!jcomm) {
73                 jxbt_throw_native(env,bprintf("Can't create a Comm object."));
74                 return NULL;
75         }
76
77         mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0);
78
79         comm = MSG_task_irecv(task,mailbox);
80
81         (*env)->SetLongField(env, jcomm, id, (jlong) (long)(comm));
82         (*env)->SetLongField(env, jcomm, id_task, (jlong) (long)(task));
83         (*env)->SetBooleanField(env, jcomm, id_receiving, JNI_TRUE);
84
85         (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox);
86
87         return jcomm;
88 }
89
90 JNIEXPORT jobject JNICALL
91 Java_org_simgrid_msg_Task_isend(JNIEnv *env, jobject jtask, jstring jmailbox) {
92         jclass comm_class;
93         jmethodID cid;
94         jfieldID id_bind;
95         jfieldID id_bind_task;
96         jfieldID id_receiving;
97         jobject jcomm;
98         const char *mailbox;
99         m_task_t task;
100         msg_comm_t comm;
101
102         comm_class = (*env)->FindClass(env, "org/simgrid/msg/Comm");
103         cid = (*env)->GetMethodID(env, comm_class, "<init>", "()V");
104         id_bind = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J");
105         id_bind_task = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bindTask", "J");
106         id_receiving = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "receiving", "Z");
107
108         if (!comm_class || !cid || !id_bind || !id_bind_task || !id_receiving) return NULL;
109
110         jcomm = (*env)->NewObject(env, comm_class, cid);
111         mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0);
112
113         task = jtask_to_native_task(jtask, env);
114
115         if (!task) {
116     (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox);
117     (*env)->DeleteLocalRef(env, jcomm);
118     jxbt_throw_notbound(env, "task", jtask);
119                 return NULL;
120         }
121   MSG_task_set_data(task, (void *) (*env)->NewGlobalRef(env, jtask));
122         comm = MSG_task_isend(task,mailbox);
123
124         (*env)->SetLongField(env, jcomm, id_bind, (jlong) (long)(comm));
125         (*env)->SetLongField(env, jcomm, id_bind_task, (jlong) (long)(NULL));
126         (*env)->SetBooleanField(env, jcomm, id_receiving, JNI_FALSE);
127
128         (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox);
129
130         return jcomm;
131 }