Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add cache for jfieldID/jmethodID on jtask/jcomm
[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 static jmethodID jtask_field_Comm_constructor;
17
18 static jfieldID jtask_field_Task_bind;
19 static jfieldID jtask_field_Comm_bind;
20 static jfieldID jtask_field_Comm_taskBind;
21 static jfieldID jtask_field_Comm_receiving;
22
23 void jtask_bind(jobject jtask, m_task_t task, JNIEnv * env)
24 {
25   (*env)->SetLongField(env, jtask, jtask_field_Task_bind, (jlong) (long) (task));
26 }
27
28 m_task_t jtask_to_native_task(jobject jtask, JNIEnv * env)
29 {
30   return (m_task_t) (long) (*env)->GetLongField(env, jtask, jtask_field_Task_bind);
31 }
32
33 jboolean jtask_is_valid(jobject jtask, JNIEnv * env)
34 {
35   return (*env)->GetLongField(env, jtask, jtask_field_Task_bind) ? JNI_TRUE : JNI_FALSE;
36 }
37
38 JNIEXPORT void JNICALL
39 Java_org_simgrid_msg_Task_nativeInit(JNIEnv *env, jclass cls) {
40         jclass jtask_class_Comm = (*env)->FindClass(env, "org/simgrid/msg/Comm");
41
42         jtask_field_Comm_constructor = (*env)->GetMethodID(env, jtask_class_Comm, "<init>", "()V");
43         //FIXME: Don't use jxbt_get_sfield directly.
44         jtask_field_Task_bind = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J");
45         jtask_field_Comm_bind = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J");
46         jtask_field_Comm_taskBind = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "taskBind", "J");
47         jtask_field_Comm_receiving = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "receiving", "Z");
48 }
49
50 JNIEXPORT jobject JNICALL
51 Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) {
52         msg_comm_t comm;
53         const char *mailbox;
54         jclass comm_class;
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
61         if (!comm_class) {
62                 jxbt_throw_native(env,bprintf("fieldID or methodID or class not found."));
63                 return NULL;
64         }
65
66         jobject jcomm = (*env)->NewObject(env, comm_class, jtask_field_Comm_constructor);
67         if (!jcomm) {
68                 jxbt_throw_native(env,bprintf("Can't create a Comm object."));
69                 return NULL;
70         }
71
72         mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0);
73
74         comm = MSG_task_irecv(task,mailbox);
75
76         (*env)->SetLongField(env, jcomm, jtask_field_Comm_bind, (jlong) (long)(comm));
77         (*env)->SetLongField(env, jcomm, jtask_field_Comm_taskBind, (jlong) (long)(task));
78         (*env)->SetBooleanField(env, jcomm, jtask_field_Comm_receiving, JNI_TRUE);
79
80         (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox);
81
82         return jcomm;
83 }
84
85 JNIEXPORT jobject JNICALL
86 Java_org_simgrid_msg_Task_isend(JNIEnv *env, jobject jtask, jstring jmailbox) {
87         jclass comm_class;
88
89         const char *mailbox;
90
91         m_task_t task;
92
93         jobject jcomm;
94         msg_comm_t comm;
95
96         comm_class = (*env)->FindClass(env, "org/simgrid/msg/Comm");
97
98         if (!comm_class) return NULL;
99
100         jcomm = (*env)->NewObject(env, comm_class, jtask_field_Comm_constructor);
101         mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0);
102
103         task = jtask_to_native_task(jtask, env);
104
105         if (!task) {
106     (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox);
107     (*env)->DeleteLocalRef(env, jcomm);
108     jxbt_throw_notbound(env, "task", jtask);
109                 return NULL;
110         }
111
112   MSG_task_set_data(task, (void *) (*env)->NewGlobalRef(env, jtask));
113         comm = MSG_task_isend(task,mailbox);
114
115         (*env)->SetLongField(env, jcomm, jtask_field_Comm_bind, (jlong) (long)(comm));
116         (*env)->SetLongField(env, jcomm, jtask_field_Comm_taskBind, (jlong) (long)(NULL));
117         (*env)->SetBooleanField(env, jcomm, jtask_field_Comm_receiving, JNI_FALSE);
118
119         (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox);
120
121         return jcomm;
122 }