From 0cc6ec5cc1a5fb9b54ab7118336ae68697cfeeab Mon Sep 17 00:00:00 2001 From: Samuel Lepetit Date: Fri, 4 May 2012 15:12:23 +0200 Subject: [PATCH] Add cache for jfieldID/jmethodID on jtask/jcomm --- org/simgrid/msg/Comm.java | 11 +++++- org/simgrid/msg/Task.java | 8 ++++ src/jmsg_comm.c | 61 ++++++++++++------------------ src/jmsg_comm.h | 12 ++++++ src/jmsg_task.c | 79 +++++++++++++++++---------------------- src/jmsg_task.h | 3 ++ 6 files changed, 90 insertions(+), 84 deletions(-) diff --git a/org/simgrid/msg/Comm.java b/org/simgrid/msg/Comm.java index 899d09498c..bd84cb5671 100644 --- a/org/simgrid/msg/Comm.java +++ b/org/simgrid/msg/Comm.java @@ -25,7 +25,7 @@ public class Comm { /** * Represents the bind for the task object pointer. Don't touch it. */ - public long bindTask = 0; + public long taskBind = 0; /** * Task associated with the comm. Beware, it can be null */ @@ -65,5 +65,12 @@ public class Comm { public Task getTask() { return task; } - + + /** + * Class initializer, to initialize various JNI stuff + */ + public static native void nativeInit(); + static { + nativeInit(); + } } diff --git a/org/simgrid/msg/Task.java b/org/simgrid/msg/Task.java index a680e64cfd..393b2e75ac 100644 --- a/org/simgrid/msg/Task.java +++ b/org/simgrid/msg/Task.java @@ -285,4 +285,12 @@ public class Task { public static int listenFromHost(String alias, Host host) { return MsgNative.taskListenFromHost(alias, host); } + + /** + * Class initializer, to initialize various JNI stuff + */ + public static native void nativeInit(); + static { + nativeInit(); + } } diff --git a/src/jmsg_comm.c b/src/jmsg_comm.c index 3ebc04e449..374461fa5f 100644 --- a/src/jmsg_comm.c +++ b/src/jmsg_comm.c @@ -5,24 +5,23 @@ #include "jxbt_utilities.h" #include XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg); -void jcomm_bind_task(JNIEnv *env, jobject jcomm) { - jfieldID id_receiving = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "receiving", "Z"); - jclass jclass = jxbt_get_class(env,"org/simgrid/msg/Comm"); - jfieldID id_task = jxbt_get_jfield(env, jclass, "task", "Lorg/simgrid/msg/Task;"); - jfieldID id_comm = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J"); - msg_comm_t comm = (msg_comm_t) (long) (*env)->GetLongField(env, jcomm, id_comm); +static jfieldID jtask_field_Comm_task; +static jfieldID jcomm_field_Comm_bind; +static jfieldID jcomm_field_Comm_taskBind; +static jfieldID jcomm_field_Comm_receiving; +void jcomm_bind_task(JNIEnv *env, jobject jcomm) { + msg_comm_t comm = (msg_comm_t) (long) (*env)->GetLongField(env, jcomm, jcomm_field_Comm_bind); //test if we are receiving or sending a task. - jboolean jreceiving = (*env)->GetBooleanField(env, jcomm, id_receiving); + jboolean jreceiving = (*env)->GetBooleanField(env, jcomm, jcomm_field_Comm_receiving); if (jreceiving == JNI_TRUE) { //bind the task object. m_task_t task = MSG_comm_get_task(comm); xbt_assert(task != NULL, "Task is NULL"); jobject jtask_global = MSG_task_get_data(task); //case where the data has already been retrieved - if (jtask_global == NULL) - { + if (jtask_global == NULL) { return; } @@ -30,7 +29,7 @@ void jcomm_bind_task(JNIEnv *env, jobject jcomm) { jobject jtask_local = (*env)->NewLocalRef(env, jtask_global); (*env)->DeleteGlobalRef(env, jtask_global); - (*env)->SetObjectField(env, jcomm, id_task, jtask_local); + (*env)->SetObjectField(env, jcomm, jtask_field_Comm_task, jtask_local); MSG_task_set_data(task, NULL); } @@ -51,39 +50,35 @@ void jcomm_throw(JNIEnv *env, MSG_error_t status) { jxbt_throw_native(env,bprintf("communication failed")); } } + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Comm_nativeInit(JNIEnv *env, jclass cls) { + jclass jfield_class_Comm = (*env)->FindClass(env, "org/simgrid/msg/Comm"); + jcomm_field_Comm_bind = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J"); + jcomm_field_Comm_taskBind = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "taskBind", "J"); + jcomm_field_Comm_receiving = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "receiving", "Z"); + jtask_field_Comm_task = jxbt_get_jfield(env, jfield_class_Comm, "task", "Lorg/simgrid/msg/Task;"); +} + JNIEXPORT void JNICALL Java_org_simgrid_msg_Comm_unbind(JNIEnv *env, jobject jcomm) { - jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J"); - jfieldID id_task = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bindTask", "J"); msg_comm_t comm; m_task_t *task_received; - if (!id || !id_task) - return; - task_received = (m_task_t*) (long) (*env)->GetLongField(env, jcomm, id_task); + task_received = (m_task_t*) (long) (*env)->GetLongField(env, jcomm, jcomm_field_Comm_taskBind); if (task_received != NULL) { xbt_free(task_received); } - comm = (msg_comm_t) (long) (*env)->GetLongField(env, jcomm, id); + comm = (msg_comm_t) (long) (*env)->GetLongField(env, jcomm, jcomm_field_Comm_bind); MSG_comm_destroy(comm); } JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_Comm_test(JNIEnv *env, jobject jcomm) { msg_comm_t comm; + comm = (msg_comm_t) (long) (*env)->GetLongField(env, jcomm, jcomm_field_Comm_bind); - jfieldID idComm = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J"); - jclass jclass = jxbt_get_class(env,"org/simgrid/msg/Comm"); - jfieldID idTask = jxbt_get_jfield(env, jclass, "task", "Lorg/simgrid/msg/Task;"); - - - if (!jclass || !idComm || !idTask) { - jxbt_throw_native(env,bprintf("idTask/idComm/jclass/idComm is null")); - return JNI_FALSE; - } - - comm = (msg_comm_t) (long) (*env)->GetLongField(env, jcomm, idComm); if (!comm) { jxbt_throw_native(env,bprintf("comm is null")); return JNI_FALSE; @@ -106,17 +101,7 @@ Java_org_simgrid_msg_Comm_test(JNIEnv *env, jobject jcomm) { } JNIEXPORT void JNICALL Java_org_simgrid_msg_Comm_waitCompletion(JNIEnv *env, jobject jcomm, jdouble timeout) { - jclass jclass = jxbt_get_class(env,"org/simgrid/msg/Comm"); - jfieldID id_comm = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J"); - jfieldID id_task = jxbt_get_jfield(env, jclass, "task", "Lorg/simgrid/msg/Task;"); - jfieldID id_receiving = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "receiving", "Z"); - - if (!jclass || !id_comm || !id_task || !id_receiving) { - jxbt_throw_native(env,bprintf("idTask/idComm/jclass/idComm is null")); - return; - } - - msg_comm_t comm = (msg_comm_t) (long) (*env)->GetLongField(env, jcomm, id_comm); + msg_comm_t comm = (msg_comm_t) (long) (*env)->GetLongField(env, jcomm, jcomm_field_Comm_bind); if (!comm) { jxbt_throw_native(env,bprintf("comm is null")); return; diff --git a/src/jmsg_comm.h b/src/jmsg_comm.h index 31c033bf0b..2c70d392f2 100644 --- a/src/jmsg_comm.h +++ b/src/jmsg_comm.h @@ -6,8 +6,20 @@ #define MSG_JCOMM_H #include #include +/** + * This function binds the task associated with the communication to + * the java communication object. + */ void jcomm_bind_task(JNIEnv *env, jobject jcomm); +/** + * This function throws the correct exception according to the status + * returned. + */ void jcomm_throw(JNIEnv *env, MSG_error_t status); + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Comm_nativeInit(JNIEnv *env, jclass cls); + JNIEXPORT void JNICALL Java_org_simgrid_msg_Comm_unbind(JNIEnv *env, jobject jcomm); diff --git a/src/jmsg_task.c b/src/jmsg_task.c index 4800dd784b..20c560e8a1 100644 --- a/src/jmsg_task.c +++ b/src/jmsg_task.c @@ -13,34 +13,38 @@ #include XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg); -void jtask_bind(jobject jtask, m_task_t task, JNIEnv * env) -{ - jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J"); +static jmethodID jtask_field_Comm_constructor; - if (!id) - return; +static jfieldID jtask_field_Task_bind; +static jfieldID jtask_field_Comm_bind; +static jfieldID jtask_field_Comm_taskBind; +static jfieldID jtask_field_Comm_receiving; - (*env)->SetLongField(env, jtask, id, (jlong) (long) (task)); +void jtask_bind(jobject jtask, m_task_t task, JNIEnv * env) +{ + (*env)->SetLongField(env, jtask, jtask_field_Task_bind, (jlong) (long) (task)); } m_task_t jtask_to_native_task(jobject jtask, JNIEnv * env) { - jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J"); - - if (!id) - return NULL; - - return (m_task_t) (long) (*env)->GetLongField(env, jtask, id); + return (m_task_t) (long) (*env)->GetLongField(env, jtask, jtask_field_Task_bind); } jboolean jtask_is_valid(jobject jtask, JNIEnv * env) { - jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J"); + return (*env)->GetLongField(env, jtask, jtask_field_Task_bind) ? JNI_TRUE : JNI_FALSE; +} - if (!id) - return JNI_FALSE; +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Task_nativeInit(JNIEnv *env, jclass cls) { + jclass jtask_class_Comm = (*env)->FindClass(env, "org/simgrid/msg/Comm"); - return (*env)->GetLongField(env, jtask, id) ? JNI_TRUE : JNI_FALSE; + jtask_field_Comm_constructor = (*env)->GetMethodID(env, jtask_class_Comm, "", "()V"); + //FIXME: Don't use jxbt_get_sfield directly. + jtask_field_Task_bind = jxbt_get_sfield(env, "org/simgrid/msg/Task", "bind", "J"); + jtask_field_Comm_bind = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J"); + jtask_field_Comm_taskBind = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "taskBind", "J"); + jtask_field_Comm_receiving = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "receiving", "Z"); } JNIEXPORT jobject JNICALL @@ -48,27 +52,18 @@ Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) { msg_comm_t comm; const char *mailbox; jclass comm_class; - jmethodID cid; - jfieldID id; - jfieldID id_task; - jfieldID id_receiving; //pointer to store the task object pointer. m_task_t *task = xbt_new(m_task_t,1); *task = NULL; /* There should be a cache here */ comm_class = (*env)->FindClass(env, "org/simgrid/msg/Comm"); - cid = (*env)->GetMethodID(env, comm_class, "", "()V"); - id = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J"); - id_task = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bindTask", "J"); - id_receiving = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "receiving", "Z"); - - if (!id || !id_task || !comm_class || !cid || !id_receiving) { + if (!comm_class) { jxbt_throw_native(env,bprintf("fieldID or methodID or class not found.")); return NULL; } - jobject jcomm = (*env)->NewObject(env, comm_class, cid); + jobject jcomm = (*env)->NewObject(env, comm_class, jtask_field_Comm_constructor); if (!jcomm) { jxbt_throw_native(env,bprintf("Can't create a Comm object.")); return NULL; @@ -78,9 +73,9 @@ Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) { comm = MSG_task_irecv(task,mailbox); - (*env)->SetLongField(env, jcomm, id, (jlong) (long)(comm)); - (*env)->SetLongField(env, jcomm, id_task, (jlong) (long)(task)); - (*env)->SetBooleanField(env, jcomm, id_receiving, JNI_TRUE); + (*env)->SetLongField(env, jcomm, jtask_field_Comm_bind, (jlong) (long)(comm)); + (*env)->SetLongField(env, jcomm, jtask_field_Comm_taskBind, (jlong) (long)(task)); + (*env)->SetBooleanField(env, jcomm, jtask_field_Comm_receiving, JNI_TRUE); (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox); @@ -90,24 +85,19 @@ Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox) { JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_isend(JNIEnv *env, jobject jtask, jstring jmailbox) { jclass comm_class; - jmethodID cid; - jfieldID id_bind; - jfieldID id_bind_task; - jfieldID id_receiving; - jobject jcomm; + const char *mailbox; + m_task_t task; + + jobject jcomm; msg_comm_t comm; comm_class = (*env)->FindClass(env, "org/simgrid/msg/Comm"); - cid = (*env)->GetMethodID(env, comm_class, "", "()V"); - id_bind = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bind", "J"); - id_bind_task = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "bindTask", "J"); - id_receiving = jxbt_get_sfield(env, "org/simgrid/msg/Comm", "receiving", "Z"); - if (!comm_class || !cid || !id_bind || !id_bind_task || !id_receiving) return NULL; + if (!comm_class) return NULL; - jcomm = (*env)->NewObject(env, comm_class, cid); + jcomm = (*env)->NewObject(env, comm_class, jtask_field_Comm_constructor); mailbox = (*env)->GetStringUTFChars(env, jmailbox, 0); task = jtask_to_native_task(jtask, env); @@ -118,12 +108,13 @@ Java_org_simgrid_msg_Task_isend(JNIEnv *env, jobject jtask, jstring jmailbox) { jxbt_throw_notbound(env, "task", jtask); return NULL; } + MSG_task_set_data(task, (void *) (*env)->NewGlobalRef(env, jtask)); comm = MSG_task_isend(task,mailbox); - (*env)->SetLongField(env, jcomm, id_bind, (jlong) (long)(comm)); - (*env)->SetLongField(env, jcomm, id_bind_task, (jlong) (long)(NULL)); - (*env)->SetBooleanField(env, jcomm, id_receiving, JNI_FALSE); + (*env)->SetLongField(env, jcomm, jtask_field_Comm_bind, (jlong) (long)(comm)); + (*env)->SetLongField(env, jcomm, jtask_field_Comm_taskBind, (jlong) (long)(NULL)); + (*env)->SetBooleanField(env, jcomm, jtask_field_Comm_receiving, JNI_FALSE); (*env)->ReleaseStringUTFChars(env, jmailbox, mailbox); diff --git a/src/jmsg_task.h b/src/jmsg_task.h index 7b9c3d8eb4..08771f41bc 100644 --- a/src/jmsg_task.h +++ b/src/jmsg_task.h @@ -75,6 +75,9 @@ m_task_t jtask_to_native_task(jobject jtask, JNIEnv * env); */ jboolean jtask_is_valid(jobject jtask, JNIEnv * env); +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Task_nativeInit(JNIEnv *env, jclass cls); + JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass cls, jstring jmailbox); -- 2.20.1