1 /* Functions related to the java task instances. */
3 /* Copyright (c) 2007, 2009, 2010. The SimGrid Team.
4 * All rights reserved. */
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. */
10 #include "jmsg_task.h"
11 #include "jxbt_utilities.h"
14 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
16 void jtask_bind(jobject jtask, m_task_t task, JNIEnv * env)
18 jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J");
23 (*env)->SetLongField(env, jtask, id, (jlong) (long) (task));
26 m_task_t jtask_to_native_task(jobject jtask, JNIEnv * env)
28 jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J");
33 return (m_task_t) (long) (*env)->GetLongField(env, jtask, id);
36 jboolean jtask_is_valid(jobject jtask, JNIEnv * env)
38 jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J");
43 return (*env)->GetLongField(env, jtask, id) ? JNI_TRUE : JNI_FALSE;
46 JNIEXPORT jobject JNICALL
47 Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) {
54 jfieldID id_receiving;
55 //pointer to store the task object pointer.
56 m_task_t *task = xbt_new(m_task_t,1);
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");
66 if (!id || !id_task || !comm_class || !cid || !id_receiving) {
67 jxbt_throw_native(env,bprintf("fieldID or methodID or class not found."));
71 jobject jcomm = (*env)->NewObject(env, comm_class, cid);
73 jxbt_throw_native(env,bprintf("Can't create a Comm object."));
77 mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0);
79 comm = MSG_task_irecv(task,mailbox);
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);
85 (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox);
90 JNIEXPORT jobject JNICALL
91 Java_org_simgrid_msg_Task_isend(JNIEnv *env, jobject jtask, jstring jmailbox) {
95 jfieldID id_bind_task;
96 jfieldID id_receiving;
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");
108 if (!comm_class || !cid || !id_bind || !id_bind_task || !id_receiving) return NULL;
110 jcomm = (*env)->NewObject(env, comm_class, cid);
111 mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0);
113 task = jtask_to_native_task(jtask, env);
116 (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox);
117 (*env)->DeleteLocalRef(env, jcomm);
118 jxbt_throw_notbound(env, "task", jtask);
121 MSG_task_set_data(task, (void *) (*env)->NewGlobalRef(env, jtask));
122 comm = MSG_task_isend(task,mailbox);
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);
128 (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox);