From 5b98a105384bfed06a3c9fadddaaeeea03b1fa2f Mon Sep 17 00:00:00 2001 From: Samuel Lepetit Date: Wed, 9 May 2012 15:50:29 +0200 Subject: [PATCH 1/1] Add cache on jmsg_syncro.c/Mutex.java --- org/simgrid/msg/Mutex.java | 9 +++++++++ src/jmsg_synchro.c | 29 +++++++++++++---------------- src/jmsg_synchro.h | 3 +++ 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/org/simgrid/msg/Mutex.java b/org/simgrid/msg/Mutex.java index 5f88151904..b88e4d2bb9 100644 --- a/org/simgrid/msg/Mutex.java +++ b/org/simgrid/msg/Mutex.java @@ -24,4 +24,13 @@ public class Mutex { public native void acquire(); public native void release(); + /** + * Class initializer, to initialize various JNI stuff + */ + public static native void nativeInit(); + static { + nativeInit(); + } } + + diff --git a/src/jmsg_synchro.c b/src/jmsg_synchro.c index d7399caf81..abffec41a6 100644 --- a/src/jmsg_synchro.c +++ b/src/jmsg_synchro.c @@ -8,24 +8,27 @@ #include "jmsg_synchro.h" #include "jxbt_utilities.h" +static jfieldID jsyncro_field_Mutex_bind; + +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Mutex_nativeInit(JNIEnv *env, jclass cls) { + jsyncro_field_Mutex_bind = jxbt_get_sfield(env, "org/simgrid/msg/Mutex", "bind", "J"); + if (!jsyncro_field_Mutex_bind) { + jxbt_throw_native(env,bprintf("Can't find some fields in Java class. You should report this bug.")); + } +} JNIEXPORT void JNICALL Java_org_simgrid_msg_Mutex_init(JNIEnv * env, jobject obj) { xbt_mutex_t mutex = xbt_mutex_init(); - jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Mutex", "bind", "J"); - if (!id) return; - - (*env)->SetLongField(env, obj, id, (jlong) (long) (mutex)); + (*env)->SetLongField(env, obj, jsyncro_field_Mutex_bind, (jlong) (long) (mutex)); } JNIEXPORT void JNICALL Java_org_simgrid_msg_Mutex_acquire(JNIEnv * env, jobject obj) { xbt_mutex_t mutex; - jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Mutex", "bind", "J"); - if (!id) return; - - mutex = (xbt_mutex_t) (long) (*env)->GetLongField(env, obj, id); + mutex = (xbt_mutex_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Mutex_bind); xbt_mutex_acquire(mutex); } @@ -33,10 +36,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Mutex_release(JNIEnv * env, jobject obj) { xbt_mutex_t mutex; - jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Mutex", "bind", "J"); - if (!id) return; - - mutex = (xbt_mutex_t) (long) (*env)->GetLongField(env, obj, id); + mutex = (xbt_mutex_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Mutex_bind); xbt_mutex_release(mutex); } @@ -44,9 +44,6 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Mutex_exit(JNIEnv * env, jobject obj) { xbt_mutex_t mutex; - jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Mutex", "bind", "J"); - if (!id) return; - - mutex = (xbt_mutex_t) (long) (*env)->GetLongField(env, obj, id); + mutex = (xbt_mutex_t) (long) (*env)->GetLongField(env, obj, jsyncro_field_Mutex_bind); xbt_mutex_destroy(mutex); } diff --git a/src/jmsg_synchro.h b/src/jmsg_synchro.h index 24488a37cf..46aefc82cc 100644 --- a/src/jmsg_synchro.h +++ b/src/jmsg_synchro.h @@ -13,6 +13,9 @@ #include #include +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Mutex_nativeInit(JNIEnv *env, jclass cls); + JNIEXPORT void JNICALL Java_org_simgrid_msg_Mutex_init(JNIEnv * env, jobject obj); -- 2.20.1