From 728b3d40a4cc988c5007fb695c57964c517ba05f Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Wed, 8 Mar 2017 09:40:50 +0100 Subject: [PATCH] stringify exception message in java bindings replaces the existing bprintf+free combo --- src/bindings/java/jmsg.cpp | 16 ++-- src/bindings/java/jmsg_process.cpp | 2 +- src/bindings/java/jxbt_utilities.cpp | 81 +++++++------------ src/bindings/java/jxbt_utilities.h | 25 +++--- teshsuite/java/SleepHostOff/SleepHostOff.tesh | 2 +- 5 files changed, 51 insertions(+), 75 deletions(-) diff --git a/src/bindings/java/jmsg.cpp b/src/bindings/java/jmsg.cpp index 47a8e3be6f..bd23d38733 100644 --- a/src/bindings/java/jmsg.cpp +++ b/src/bindings/java/jmsg.cpp @@ -60,17 +60,17 @@ JNIEnv *get_current_thread_env() void jmsg_throw_status(JNIEnv *env, msg_error_t status) { switch (status) { case MSG_TIMEOUT: - jxbt_throw_time_out_failure(env,nullptr); - break; + jxbt_throw_time_out_failure(env, ""); + break; case MSG_TRANSFER_FAILURE: - jxbt_throw_transfer_failure(env,nullptr); - break; + jxbt_throw_transfer_failure(env, ""); + break; case MSG_HOST_FAILURE: - jxbt_throw_host_failure(env,nullptr); - break; + jxbt_throw_host_failure(env, ""); + break; case MSG_TASK_CANCELED: - jxbt_throw_task_cancelled(env,nullptr); - break; + jxbt_throw_task_cancelled(env, ""); + break; default: xbt_die("undefined message failed (please see jmsg_throw_status function in jmsg.cpp)"); } diff --git a/src/bindings/java/jmsg_process.cpp b/src/bindings/java/jmsg_process.cpp index 90b43ea49b..3181faf080 100644 --- a/src/bindings/java/jmsg_process.cpp +++ b/src/bindings/java/jmsg_process.cpp @@ -290,7 +290,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_sleep(JNIEnv *env, jclass cl // is a cancelled_error, see bindings/java/smx_context_java.c, function void smx_ctx_java_stop(smx_context_t context) and src/msg/msg_gos.c // function msg_error_t MSG_process_sleep(double nb_sec) - jxbt_throw_host_failure(env,nullptr); + jxbt_throw_host_failure(env, ""); } } diff --git a/src/bindings/java/jxbt_utilities.cpp b/src/bindings/java/jxbt_utilities.cpp index ba5d746554..c735ff410c 100644 --- a/src/bindings/java/jxbt_utilities.cpp +++ b/src/bindings/java/jxbt_utilities.cpp @@ -17,9 +17,7 @@ jclass jxbt_get_class(JNIEnv * env, const char *name) jclass cls = env->FindClass(name); if (!cls) { - char *m = bprintf("Class %s not found", name); - jxbt_throw_jni(env, m); - free(m); + jxbt_throw_jni(env, std::string("Class ") + name + " not found"); return nullptr; } @@ -40,13 +38,9 @@ jmethodID jxbt_get_jmethod(JNIEnv * env, jclass cls, const char *name, const cha jstring jclassname = (jstring) env->CallObjectMethod(cls, tostr_id, nullptr); const char *classname = env->GetStringUTFChars(jclassname, 0); - char *m = bprintf("Cannot find method %s(%s) in %s", name, signature, classname); - env->ReleaseStringUTFChars(jclassname, classname); - jxbt_throw_jni(env, m); - - free(m); + jxbt_throw_jni(env, std::string("Cannot find method") + name + "(" + signature + ") in " + classname); return 0; } @@ -66,13 +60,9 @@ jmethodID jxbt_get_static_jmethod(JNIEnv * env, jclass cls, const char *name, co jstring jclassname = (jstring) env->CallObjectMethod(cls, tostr_id, nullptr); const char *classname = env->GetStringUTFChars(jclassname, 0); - char *m = bprintf("Cannot find static method %s(%s) in %s", name, signature, classname); - env->ReleaseStringUTFChars(jclassname, classname); - jxbt_throw_jni(env, m); - - free(m); + jxbt_throw_jni(env, std::string("Cannot find static method") + name + "(" + signature + ") in " + classname); return 0; } @@ -91,11 +81,7 @@ jmethodID jxbt_get_static_smethod(JNIEnv * env, const char *classname, const cha id = env->GetStaticMethodID(cls, name, signature); if (!id) { - char *m = bprintf("Cannot find static method %s(%s) in %s", name, signature, classname); - - jxbt_throw_jni(env, m); - - free(m); + jxbt_throw_jni(env, std::string("Cannot find static method") + name + "(" + signature + ") in " + classname); return 0; } return id; @@ -113,11 +99,7 @@ jmethodID jxbt_get_smethod(JNIEnv * env, const char *classname, const char *name id = env->GetMethodID(cls, name, signature); if (!id) { - char *m = bprintf("Cannot find method %s(%s) in %s", name, signature, classname); - - jxbt_throw_jni(env, m); - - free(m); + jxbt_throw_jni(env, std::string("Cannot find method") + name + "(" + signature + ") in " + classname); return 0; } return id; @@ -136,13 +118,11 @@ jfieldID jxbt_get_jfield(JNIEnv * env, jclass cls, const char *name, const char jmethodID getname_id = env->GetMethodID(cls, "getName", "()Ljava/lang/String;"); jstring jclassname = (jstring) env->CallObjectMethod(cls, getname_id, nullptr); const char *classname = env->GetStringUTFChars(jclassname, 0); - char *m = bprintf("Cannot find field %s %s in %s", signature, name, classname); env->ReleaseStringUTFChars(jclassname, classname); - jxbt_throw_jni(env, m); + jxbt_throw_jni(env, std::string("Cannot find field") + signature + " " + name + " in " + classname); - free(m); return 0; } @@ -160,79 +140,74 @@ jfieldID jxbt_get_sfield(JNIEnv * env, const char *classname, const char *name, id = env->GetFieldID(cls, name, signature); if (!id) { - char *m = bprintf("Cannot find field %s %s in %s", signature, name, classname); - - jxbt_throw_jni(env, m); - - free(m); + jxbt_throw_jni(env, std::string("Cannot find field") + signature + " " + name + " in " + classname); return 0; } return id; } -void jxbt_throw_by_name(JNIEnv * env, const char *name, char *msg) +void jxbt_throw_by_name(JNIEnv* env, const char* name, std::string msg) { jclass cls = env->FindClass(name); - xbt_assert(cls, "%s (Plus severe error: class %s not found)\n", msg, name); - - env->ThrowNew(cls, msg); + xbt_assert(cls, "%s (Plus severe error: class %s not found)\n", msg.c_str(), name); - free(msg); + env->ThrowNew(cls, msg.c_str()); } -void jxbt_throw_jni(JNIEnv * env, const char *msg) +void jxbt_throw_jni(JNIEnv* env, std::string msg) { - jxbt_throw_by_name(env, "org/simgrid/msg/JniException", bprintf("Internal or JNI error: %s", msg)); + jxbt_throw_by_name(env, "org/simgrid/msg/JniException", "Internal or JNI error: " + msg); } -void jxbt_throw_notbound(JNIEnv * env, const char *kind, void *pointer) +void jxbt_throw_notbound(JNIEnv* env, std::string kind, void* pointer) { - jxbt_throw_by_name(env, "org/simgrid/msg/JniException", bprintf("Internal error: %s %p not bound", kind, pointer)); + jxbt_throw_by_name(env, "org/simgrid/msg/JniException", + "Internal error: " + kind + " " + static_cast(pointer) + " not bound"); } -void jxbt_throw_null(JNIEnv * env, char *msg) +void jxbt_throw_null(JNIEnv* env, std::string msg) { jxbt_throw_by_name(env, "java/lang/NullPointerException", msg); } -void jxbt_throw_illegal(JNIEnv * env, char *msg) +void jxbt_throw_illegal(JNIEnv* env, std::string msg) { jxbt_throw_by_name(env, "java/lang/IllegalArgumentException", msg); } -void jxbt_throw_host_not_found(JNIEnv * env, const char *invalid_name) +void jxbt_throw_host_not_found(JNIEnv* env, std::string invalid_name) { - jxbt_throw_by_name(env, "org/simgrid/msg/HostNotFoundException", bprintf("No such host: %s", invalid_name)); + jxbt_throw_by_name(env, "org/simgrid/msg/HostNotFoundException", "No such host: " + invalid_name); } -void jxbt_throw_storage_not_found(JNIEnv * env, const char *invalid_name) +void jxbt_throw_storage_not_found(JNIEnv* env, std::string invalid_name) { - jxbt_throw_by_name(env, "org/simgrid/msg/StorageNotFoundException", bprintf("No such storage: %s", invalid_name)); + jxbt_throw_by_name(env, "org/simgrid/msg/StorageNotFoundException", "No such storage: " + invalid_name); } -void jxbt_throw_process_not_found(JNIEnv * env, const char *invalid_name) +void jxbt_throw_process_not_found(JNIEnv* env, std::string invalid_name) { - jxbt_throw_by_name(env, "org/simgrid/msg/ProcessNotFoundException", bprintf("No such process: %s", invalid_name)); + jxbt_throw_by_name(env, "org/simgrid/msg/ProcessNotFoundException", "No such process: " + invalid_name); } -void jxbt_throw_transfer_failure(JNIEnv * env, char *details) +void jxbt_throw_transfer_failure(JNIEnv* env, std::string details) { jxbt_throw_by_name(env, "org/simgrid/msg/TransferFailureException", details); } -void jxbt_throw_host_failure(JNIEnv * env, char *details) +void jxbt_throw_host_failure(JNIEnv* env, std::string details) { - jxbt_throw_by_name(env, "org/simgrid/msg/HostFailureException", bprintf("Host Failure %s", details)); + jxbt_throw_by_name(env, "org/simgrid/msg/HostFailureException", "Host Failure " + details); } -void jxbt_throw_time_out_failure(JNIEnv * env, char *details) +void jxbt_throw_time_out_failure(JNIEnv* env, std::string details) { jxbt_throw_by_name(env, "org/simgrid/msg/TimeoutException", details); } -void jxbt_throw_task_cancelled(JNIEnv * env, char *details) +void jxbt_throw_task_cancelled(JNIEnv* env, std::string details) { jxbt_throw_by_name(env, "org/simgrid/msg/TaskCancelledException", details); } diff --git a/src/bindings/java/jxbt_utilities.h b/src/bindings/java/jxbt_utilities.h index 4bb2b09ba3..934940de80 100644 --- a/src/bindings/java/jxbt_utilities.h +++ b/src/bindings/java/jxbt_utilities.h @@ -10,6 +10,7 @@ #include #include +#include SG_BEGIN_DECL() @@ -48,30 +49,30 @@ jfieldID jxbt_get_sfield(JNIEnv * env, const char *classname, const char *name, } } while (0) /* Throws an exception according to its name */ -void jxbt_throw_by_name(JNIEnv * env, const char *name, char *msg); +void jxbt_throw_by_name(JNIEnv* env, const char* name, std::string msg); /** Thrown on internal error of this layer, or on problem with JNI */ -void jxbt_throw_jni(JNIEnv * env, const char *msg); +void jxbt_throw_jni(JNIEnv* env, std::string msg); /** Thrown when using an object not bound to a native one where it should, or reverse (kinda JNI issue) */ -void jxbt_throw_notbound(JNIEnv * env, const char *kind, void *pointer); +void jxbt_throw_notbound(JNIEnv* env, std::string kind, void* pointer); /** Thrown if NULL gets used */ -void jxbt_throw_null(JNIEnv * env, char *msg); +void jxbt_throw_null(JNIEnv* env, std::string msg); /** Thrown on illegal arguments */ -void jxbt_throw_illegal(JNIEnv * env, char *msg); +void jxbt_throw_illegal(JNIEnv* env, std::string msg); /** Thrown when looking for an host from name does not lead to anything */ -void jxbt_throw_host_not_found(JNIEnv * env, const char *invalid_name); +void jxbt_throw_host_not_found(JNIEnv* env, std::string invalid_name); /** Thrown when looking for an host from name does not lead to anything */ -void jxbt_throw_process_not_found(JNIEnv * env, const char *invalid_name); +void jxbt_throw_process_not_found(JNIEnv* env, std::string invalid_name); /** Thrown when a transfer failure accure while Sending task */ -void jxbt_throw_transfer_failure(JNIEnv * env, char *detail); +void jxbt_throw_transfer_failure(JNIEnv* env, std::string detail); /** Thrown when a host failure occurs while Sending a task*/ -void jxbt_throw_host_failure(JNIEnv * env, char *details); +void jxbt_throw_host_failure(JNIEnv* env, std::string details); /** Thrown when a timeout occurs while Sending a task */ -void jxbt_throw_time_out_failure(JNIEnv * env, char *details); +void jxbt_throw_time_out_failure(JNIEnv* env, std::string details); /**Thrown when a task is canceled */ -void jxbt_throw_task_cancelled(JNIEnv * env, char *details); +void jxbt_throw_task_cancelled(JNIEnv* env, std::string details); /** Thrown when looking for a storage from name does not lead to anything */ -void jxbt_throw_storage_not_found(JNIEnv * env, const char *invalid_name); +void jxbt_throw_storage_not_found(JNIEnv* env, std::string invalid_name); SG_END_DECL() #endif /* ! JXBT_UTILITY_H */ diff --git a/teshsuite/java/SleepHostOff/SleepHostOff.tesh b/teshsuite/java/SleepHostOff/SleepHostOff.tesh index fa751969d5..7fda994de8 100644 --- a/teshsuite/java/SleepHostOff/SleepHostOff.tesh +++ b/teshsuite/java/SleepHostOff/SleepHostOff.tesh @@ -6,7 +6,7 @@ $ java -classpath ${classpath:=.} SleepHostOff.SleepHostOff ${srcdir:=.}/small_p > [ 0.010000] (2:Sleeper@Tremblay) I'm not dead > [ 0.020000] (1:TestRunner@Fafard) Stop Tremblay > [ 0.020000] (2:Sleeper@Tremblay) I'm not dead -> [ 0.020000] (2:Sleeper@Tremblay) catch HostException: Host Failure (null) +> [ 0.020000] (2:Sleeper@Tremblay) catch HostException: Host Failure > [ 0.020000] (1:TestRunner@Fafard) Tremblay has been stopped > [ 0.320000] (1:TestRunner@Fafard) Test sleep seems ok, cool! (number of Process : 1, it should be 1 (i.e. the Test one)) > [ 0.320000] (0:maestro@) MSG_main finished; Cleaning up the simulation... -- 2.20.1