Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
java: setup a RAII wrapper to properly deal with GetStringUTFChars/ReleaseStringUTFChar
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Mon, 27 Dec 2021 21:32:36 +0000 (22:32 +0100)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Mon, 27 Dec 2021 21:32:36 +0000 (22:32 +0100)
src/bindings/java/jmsg.cpp
src/bindings/java/jmsg_as.cpp
src/bindings/java/jmsg_host.cpp
src/bindings/java/jmsg_process.cpp
src/bindings/java/jmsg_task.cpp
src/bindings/java/jmsg_vm.cpp
src/bindings/java/jtrace.cpp
src/bindings/java/jxbt_utilities.cpp
src/bindings/java/jxbt_utilities.hpp

index 010838b..bdc6661 100644 (file)
@@ -104,9 +104,8 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_init(JNIEnv* env, jclass, jobjec
   args.emplace_back("java");
   for (int index = 1; index < argc; index++) {
     auto jval       = (jstring)env->GetObjectArrayElement(jargs, index - 1);
-    const char* tmp = env->GetStringUTFChars(jval, nullptr);
-    args.emplace_back(tmp);
-    env->ReleaseStringUTFChars(jval, tmp);
+    jstring_wrapper tmp(env, jval);
+    args.emplace_back(tmp.value);
   }
 
   std::unique_ptr<char* []> argv(new char*[argc + 1]);
@@ -150,11 +149,8 @@ JNIEXPORT void JNICALL JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv* env, jclass)
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv* env, jclass, jstring jplatformFile)
 {
-  const char* platformFile = env->GetStringUTFChars(jplatformFile, nullptr);
-
+  jstring_wrapper platformFile(env, jplatformFile);
   simgrid_load_platform(platformFile);
-
-  env->ReleaseStringUTFChars(jplatformFile, platformFile);
 }
 
 JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Msg_environmentGetRoutingRoot(JNIEnv* env, jclass)
@@ -177,51 +173,45 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Msg_environmentGetRoutingRoot(JNI
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_debug(JNIEnv* env, jclass, jstring js)
 {
-  const char* s = env->GetStringUTFChars(js, nullptr);
-  XBT_DEBUG("%s", s);
-  env->ReleaseStringUTFChars(js, s);
+  jstring_wrapper s(env, js);
+  XBT_DEBUG("%s", s.value);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_verb(JNIEnv* env, jclass, jstring js)
 {
-  const char* s = env->GetStringUTFChars(js, nullptr);
-  XBT_VERB("%s", s);
-  env->ReleaseStringUTFChars(js, s);
+  jstring_wrapper s(env, js);
+  XBT_VERB("%s", s.value);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_info(JNIEnv* env, jclass, jstring js)
 {
-  const char* s = env->GetStringUTFChars(js, nullptr);
-  XBT_INFO("%s", s);
-  env->ReleaseStringUTFChars(js, s);
+  jstring_wrapper s(env, js);
+  XBT_INFO("%s", s.value);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_warn(JNIEnv* env, jclass, jstring js)
 {
-  const char* s = env->GetStringUTFChars(js, nullptr);
-  XBT_WARN("%s", s);
-  env->ReleaseStringUTFChars(js, s);
+  jstring_wrapper s(env, js);
+  XBT_WARN("%s", s.value);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_error(JNIEnv* env, jclass, jstring js)
 {
-  const char* s = env->GetStringUTFChars(js, nullptr);
-  XBT_ERROR("%s", s);
-  env->ReleaseStringUTFChars(js, s);
+  jstring_wrapper s(env, js);
+  XBT_ERROR("%s", s.value);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_critical(JNIEnv* env, jclass, jstring js)
 {
-  const char* s = env->GetStringUTFChars(js, nullptr);
-  XBT_CRITICAL("%s", s);
-  env->ReleaseStringUTFChars(js, s);
+  jstring_wrapper s(env, js);
+  XBT_CRITICAL("%s", s.value);
 }
 
 static void java_main(int argc, char* argv[]);
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_deployApplication(JNIEnv* env, jclass, jstring jdeploymentFile)
 {
-  const char* deploymentFile = env->GetStringUTFChars(jdeploymentFile, nullptr);
+  jstring_wrapper deploymentFile(env, jdeploymentFile);
 
   simgrid_register_default(java_main);
   simgrid_load_deployment(deploymentFile);
index 44e0795..b040fd9 100644 (file)
@@ -102,7 +102,7 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_As_getProperty(JNIEnv *env, jobje
     jxbt_throw_notbound(env, "as", jas);
     return nullptr;
   }
-  const char* name = env->GetStringUTFChars(static_cast<jstring>(jname), nullptr);
+  jstring_wrapper name(env, static_cast<jstring>(jname));
 
   const char* property = sg_zone_get_property_value(as, name);
   if (not property) {
@@ -111,8 +111,6 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_As_getProperty(JNIEnv *env, jobje
 
   jobject jproperty = env->NewStringUTF(property);
 
-  env->ReleaseStringUTFChars(static_cast<jstring>(jname), name);
-
   return jproperty;
 }
 
index 68bc9a0..1b27606 100644 (file)
@@ -58,16 +58,14 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Host_getByName(JNIEnv* env, jclas
     jxbt_throw_null(env, "No host can have a null name");
     return nullptr;
   }
-  const char* name = env->GetStringUTFChars(jname, nullptr);
+  jstring_wrapper name(env, jname);
   /* get the host by name       (the hosts are created during the grid resolution) */
   sg_host_t host = sg_host_by_name(name);
 
   if (not host) { /* invalid name */
     jxbt_throw_host_not_found(env, name);
-    env->ReleaseStringUTFChars(jname, name);
     return nullptr;
   }
-  env->ReleaseStringUTFChars(jname, name);
 
   if (not host->extension(JAVA_HOST_LEVEL)) { /* native host not associated yet with java host */
     /* Instantiate a new java host */
@@ -178,7 +176,7 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Host_getProperty(JNIEnv *env, job
     jxbt_throw_notbound(env, "host", jhost);
     return nullptr;
   }
-  const char* name = env->GetStringUTFChars((jstring)jname, nullptr);
+  jstring_wrapper name(env, (jstring)jname);
 
   const char* property = sg_host_get_property_value(host, name);
   if (not property) {
@@ -187,8 +185,6 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Host_getProperty(JNIEnv *env, job
 
   jobject jproperty = env->NewStringUTF(property);
 
-  env->ReleaseStringUTFChars((jstring) jname, name);
-
   return jproperty;
 }
 
@@ -200,14 +196,11 @@ Java_org_simgrid_msg_Host_setProperty(JNIEnv *env, jobject jhost, jobject jname,
     jxbt_throw_notbound(env, "host", jhost);
     return;
   }
-  const char* name       = env->GetStringUTFChars((jstring)jname, nullptr);
-  const char* value_java = env->GetStringUTFChars((jstring)jvalue, nullptr);
+  jstring_wrapper name(env, (jstring)jname);
+  jstring_wrapper value_java(env, (jstring)jvalue);
   const char* value      = xbt_strdup(value_java);
 
   sg_host_set_property_value(host, name, value);
-
-  env->ReleaseStringUTFChars((jstring) jvalue, value_java);
-  env->ReleaseStringUTFChars((jstring) jname, name);
 }
 
 JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_Host_isOn(JNIEnv * env, jobject jhost)
@@ -254,9 +247,8 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Host_all(JNIEnv * env, jclas
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_setAsyncMailbox(JNIEnv * env, jclass cls_arg, jobject jname)
 {
-  const char* name = env->GetStringUTFChars((jstring)jname, nullptr);
+  jstring_wrapper name(env, (jstring)jname);
   sg_mailbox_set_receiver(name);
-  env->ReleaseStringUTFChars((jstring) jname, name);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_updateAllEnergyConsumptions(JNIEnv* env, jclass cls)
index 88f3347..b325939 100644 (file)
@@ -141,7 +141,7 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Process_getProperty(JNIEnv *env,
     jxbt_throw_notbound(env, "process", jprocess);
     return nullptr;
   }
-  const char* name = env->GetStringUTFChars((jstring)jname, nullptr);
+  jstring_wrapper name(env, (jstring)jname);
 
   const char* property = actor->get_property(name);
   if (not property)
@@ -149,8 +149,6 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Process_getProperty(JNIEnv *env,
 
   jobject jproperty = env->NewStringUTF(property);
 
-  env->ReleaseStringUTFChars((jstring)jname, name);
-
   return jproperty;
 }
 
index fc8c867..1e6a33b 100644 (file)
@@ -57,13 +57,8 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_nativeInit(JNIEnv *env, jclass
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_create(JNIEnv * env, jobject jtask, jstring jname,
                                       jdouble jflopsAmount, jdouble jbytesAmount)
 {
-  const char *name = nullptr;      /* the name of the task                                 */
-
-  if (jname)
-    name = env->GetStringUTFChars(jname, nullptr);
-  msg_task_t task = MSG_task_create(name, jflopsAmount, jbytesAmount, jtask);
-  if (jname)
-    env->ReleaseStringUTFChars(jname, name);
+  jstring_wrapper task_name(env, jname);
+  msg_task_t task = MSG_task_create(task_name, jflopsAmount, jbytesAmount, jtask);
 
   /* bind & store the task */
   jtask_bind(jtask, task, env);
@@ -93,9 +88,8 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_parallelCreate(JNIEnv * env, jo
   env->ReleaseDoubleArrayElements(jmessageSizes_arg, jmessageSizes, 0);
 
   /* get the C string from the java string */
-  const char* name = env->GetStringUTFChars(jname, nullptr);
+  jstring_wrapper name(env, jname);
   msg_task_t task  = MSG_parallel_task_create(name, host_count, hosts, computeDurations, messageSizes, jtask);
-  env->ReleaseStringUTFChars(jname, name);
 
   /* associate the java task object and the native task */
   jtask_bind(jtask, task, env);
@@ -214,12 +208,11 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_setName(JNIEnv *env, jobject jt
     jxbt_throw_notbound(env, "task", jtask);
     return;
   }
-  const char* name = env->GetStringUTFChars((jstring)jname, nullptr);
+  jstring_wrapper name(env, static_cast<jstring>(jname));
 
   env->SetObjectField(jtask, jtask_field_Task_name, jname);
   MSG_task_set_name(task, name);
 
-  env->ReleaseStringUTFChars((jstring) jname, name);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_setPriority(JNIEnv * env, jobject jtask, jdouble priority)
@@ -268,9 +261,8 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_sendBounded(JNIEnv * env,jobjec
   /* Add a global ref into the Ctask so that the receiver can use it */
   MSG_task_set_data(task, env->NewGlobalRef(jtask));
 
-  const char* alias = env->GetStringUTFChars(jalias, nullptr);
+  jstring_wrapper alias(env, jalias);
   msg_error_t res   = MSG_task_send_with_timeout_bounded(task, alias, jtimeout, maxrate);
-  env->ReleaseStringUTFChars(jalias, alias);
 
   if (res != MSG_OK)
     jmsg_throw_status(env, res);
@@ -280,13 +272,12 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_receive(JNIEnv* env, jclass
 {
   msg_task_t task = nullptr;
 
-  const char* alias = env->GetStringUTFChars(jalias, nullptr);
+  jstring_wrapper alias(env, jalias);
   msg_error_t rv;
   if (not simgrid::ForcefulKillException::try_n_catch(
           [&rv, &task, &alias, &jtimeout]() { rv = MSG_task_receive_with_timeout(&task, alias, (double)jtimeout); })) {
     jxbt_throw_by_name(env, "org/simgrid/msg/ProcessKilledError", "Process killed");
   }
-  env->ReleaseStringUTFChars(jalias, alias);
   if (env->ExceptionOccurred())
     return nullptr;
   if (rv != MSG_OK) {
@@ -318,9 +309,8 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_irecv(JNIEnv * env, jclass c
     return nullptr;
   }
 
-  const char* mailbox = env->GetStringUTFChars(jmailbox, nullptr);
+  jstring_wrapper mailbox(env, jmailbox);
   msg_comm_t comm     = MSG_task_irecv(task, mailbox);
-  env->ReleaseStringUTFChars(jmailbox, mailbox);
 
   env->SetLongField(jcomm, jtask_field_Comm_bind, (jlong) (uintptr_t)(comm));
   env->SetLongField(jcomm, jtask_field_Comm_taskBind, (jlong) (uintptr_t)(task));
@@ -334,7 +324,7 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_receiveBounded(JNIEnv* env,
 {
   msg_task_t task = nullptr;
 
-  const char* alias = env->GetStringUTFChars(jalias, nullptr);
+  jstring_wrapper alias(env, jalias);
   msg_error_t res   = MSG_task_receive_with_timeout_bounded(&task, alias, jtimeout, rate);
   if (env->ExceptionOccurred())
     return nullptr;
@@ -349,8 +339,6 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_receiveBounded(JNIEnv* env,
   env->DeleteGlobalRef(jtask_global);
   MSG_task_set_data(task, nullptr);
 
-  env->ReleaseStringUTFChars(jalias, alias);
-
   return (jobject) jtask_local;
 }
 
@@ -370,9 +358,8 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_irecvBounded(JNIEnv * env, j
     return nullptr;
   }
 
-  const char* mailbox = env->GetStringUTFChars(jmailbox, nullptr);
+  jstring_wrapper mailbox(env, jmailbox);
   msg_comm_t comm     = MSG_task_irecv_bounded(task, mailbox, rate);
-  env->ReleaseStringUTFChars(jmailbox, mailbox);
 
   env->SetLongField(jcomm, jtask_field_Comm_bind, (jlong) (uintptr_t)(comm));
   env->SetLongField(jcomm, jtask_field_Comm_taskBind, (jlong) (uintptr_t)(task));
@@ -391,12 +378,11 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_isend(JNIEnv *env, jobject j
     return nullptr;
 
   jobject jcomm       = env->NewObject(comm_class, jtask_method_Comm_constructor);
-  const char* mailbox = env->GetStringUTFChars(jmailbox, nullptr);
+  jstring_wrapper mailbox(env, jmailbox);
 
   msg_task_t task = jtask_to_native(jtask, env);
 
   if (not task) {
-    env->ReleaseStringUTFChars(jmailbox, mailbox);
     env->DeleteLocalRef(jcomm);
     jxbt_throw_notbound(env, "task", jtask);
         return nullptr;
@@ -409,8 +395,6 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_isend(JNIEnv *env, jobject j
   env->SetLongField(jcomm, jtask_field_Comm_taskBind, (jlong) (uintptr_t)(nullptr));
   env->SetBooleanField(jcomm, jtask_field_Comm_receiving, JNI_FALSE);
 
-  env->ReleaseStringUTFChars(jmailbox, mailbox);
-
   return jcomm;
 }
 
@@ -420,19 +404,17 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_isendBounded(JNIEnv *env, jo
   msg_task_t task;
   jobject jcomm;
   msg_comm_t comm;
-  const char *mailbox;
 
   jclass comm_class = env->FindClass("org/simgrid/msg/Comm");
   if (not comm_class)
     return nullptr;
 
   jcomm = env->NewObject(comm_class, jtask_method_Comm_constructor);
-  mailbox = env->GetStringUTFChars(jmailbox, nullptr);
+  jstring_wrapper mailbox(env, jmailbox);
 
   task = jtask_to_native(jtask, env);
 
   if (not task) {
-    env->ReleaseStringUTFChars(jmailbox, mailbox);
     env->DeleteLocalRef(jcomm);
     jxbt_throw_notbound(env, "task", jtask);
         return nullptr;
@@ -445,8 +427,6 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_isendBounded(JNIEnv *env, jo
   env->SetLongField(jcomm, jtask_field_Comm_taskBind, (jlong) (uintptr_t)(nullptr));
   env->SetBooleanField(jcomm, jtask_field_Comm_receiving, JNI_FALSE);
 
-  env->ReleaseStringUTFChars(jmailbox, mailbox);
-
   return jcomm;
 }
 
@@ -479,12 +459,11 @@ static void msg_task_cancel_on_failed_dsend(void*t) {
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_dsend(JNIEnv * env, jobject jtask, jstring jalias)
 {
-  const char* alias = env->GetStringUTFChars(jalias, nullptr);
+  jstring_wrapper alias(env, jalias);
 
   msg_task_t task = jtask_to_native(jtask, env);
 
   if (not task) {
-    env->ReleaseStringUTFChars(jalias, alias);
     jxbt_throw_notbound(env, "task", jtask);
     return;
   }
@@ -492,19 +471,16 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_dsend(JNIEnv * env, jobject jta
   /* Pass a global ref to the Jtask into the Ctask so that the receiver can use it */
   MSG_task_set_data(task, env->NewGlobalRef(jtask));
   MSG_task_dsend(task, alias, msg_task_cancel_on_failed_dsend);
-
-  env->ReleaseStringUTFChars(jalias, alias);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_dsendBounded(JNIEnv * env, jobject jtask, jstring jalias,
                                                               jdouble maxrate)
 {
-  const char* alias = env->GetStringUTFChars(jalias, nullptr);
+  jstring_wrapper alias(env, jalias);
 
   msg_task_t task = jtask_to_native(jtask, env);
 
   if (not task) {
-    env->ReleaseStringUTFChars(jalias, alias);
     jxbt_throw_notbound(env, "task", jtask);
     return;
   }
@@ -512,24 +488,16 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_dsendBounded(JNIEnv * env, jobj
   /* Pass a global ref to the Jtask into the Ctask so that the receiver can use it */
   MSG_task_set_data(task, env->NewGlobalRef(jtask));
   MSG_task_dsend_bounded(task, alias, msg_task_cancel_on_failed_dsend, maxrate);
-
-  env->ReleaseStringUTFChars(jalias, alias);
 }
 
 JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_Task_listen(JNIEnv * env, jclass cls, jstring jalias)
 {
-  const char* alias = env->GetStringUTFChars(jalias, nullptr);
-  int rv = MSG_task_listen(alias);
-  env->ReleaseStringUTFChars(jalias, alias);
-
-  return (jboolean) rv;
+  jstring_wrapper alias(env, jalias);
+  return (jboolean)MSG_task_listen(alias);
 }
 
 JNIEXPORT jint JNICALL Java_org_simgrid_msg_Task_listenFrom(JNIEnv * env, jclass cls, jstring jalias)
 {
-  const char* alias = env->GetStringUTFChars(jalias, nullptr);
-  int rv = MSG_task_listen_from(alias);
-  env->ReleaseStringUTFChars(jalias, alias);
-
-  return (jint) rv;
+  jstring_wrapper alias(env, jalias);
+  return (jint)MSG_task_listen_from(alias);
 }
index ed2126b..6b2fd2a 100644 (file)
@@ -71,10 +71,9 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_create(JNIEnv* env, jobject jVm,
 {
   sg_host_t host = jhost_get_native(env, jHost);
 
-  const char* name = env->GetStringUTFChars(jname, nullptr);
+  jstring_wrapper name(env, jname);
   sg_vm_t vm       = sg_vm_create_migratable(host, name, static_cast<int>(coreAmount), static_cast<int>(jramsize),
                                        static_cast<int>(jmig_netspeed), static_cast<int>(jdp_intensity));
-  env->ReleaseStringUTFChars(jname, name);
 
   jvm_bind(env, jVm, vm);
   jVm = env->NewGlobalRef(jVm);
@@ -175,16 +174,14 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_VM_getVMByName(JNIEnv* env, jclas
     jxbt_throw_null(env, "No VM can have a null name");
     return nullptr;
   }
-  const char* name = env->GetStringUTFChars(jname, nullptr);
+  jstring_wrapper name(env, jname);
   /* get the VM by name   (VMs are just special hosts, unfortunately) */
   auto const* host = sg_host_by_name(name);
 
   if (not host) { /* invalid name */
     jxbt_throw_host_not_found(env, name);
-    env->ReleaseStringUTFChars(jname, name);
     return nullptr;
   }
-  env->ReleaseStringUTFChars(jname, name);
 
   return static_cast<jobject>(host->extension(JAVA_HOST_LEVEL));
 }
index 87cf963..6a7c311 100644 (file)
@@ -6,6 +6,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "jtrace.h"
+#include "jxbt_utilities.hpp"
 #include "simgrid/instr.h"
 
 /* Shut up some errors in eclipse online compiler. I wish such a pimple wouldn't be needed */
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_hostStateDeclare(JNIEnv * env, jclass cls, jstring js)
 {
-  const char* s = env->GetStringUTFChars(js, nullptr);
+  jstring_wrapper s(env, js);
   TRACE_host_state_declare(s);
-  env->ReleaseStringUTFChars(js, s);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_hostStateDeclareValue (JNIEnv *env, jclass cls, jstring js_state,
                                                                            jstring js_value, jstring js_color)
 {
-  const char* state = env->GetStringUTFChars(js_state, nullptr);
-  const char* value = env->GetStringUTFChars(js_value, nullptr);
-  const char* color = env->GetStringUTFChars(js_color, nullptr);
+  jstring_wrapper state(env, js_state);
+  jstring_wrapper value(env, js_value);
+  jstring_wrapper color(env, js_color);
 
   TRACE_host_state_declare_value(state, value, color);
-
-  env->ReleaseStringUTFChars(js_state, state);
-  env->ReleaseStringUTFChars(js_value, value);
-  env->ReleaseStringUTFChars(js_color, color);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_hostSetState (JNIEnv *env, jclass cls, jstring js_host,
                                                                   jstring js_state, jstring js_value)
 {
-  const char* host  = env->GetStringUTFChars(js_host, nullptr);
-  const char* state = env->GetStringUTFChars(js_state, nullptr);
-  const char* value = env->GetStringUTFChars(js_value, nullptr);
+  jstring_wrapper host(env, js_host);
+  jstring_wrapper state(env, js_state);
+  jstring_wrapper value(env, js_value);
 
   TRACE_host_set_state(host, state, value);
-
-  env->ReleaseStringUTFChars(js_host, host);
-  env->ReleaseStringUTFChars(js_state, state);
-  env->ReleaseStringUTFChars(js_value, value);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_hostPushState (JNIEnv *env, jclass cls, jstring js_host,
                                                                    jstring js_state, jstring js_value)
 {
-  const char* host  = env->GetStringUTFChars(js_host, nullptr);
-  const char* state = env->GetStringUTFChars(js_state, nullptr);
-  const char* value = env->GetStringUTFChars(js_value, nullptr);
+  jstring_wrapper host(env, js_host);
+  jstring_wrapper state(env, js_state);
+  jstring_wrapper value(env, js_value);
 
   TRACE_host_push_state(host, state, value);
-
-  env->ReleaseStringUTFChars(js_host, host);
-  env->ReleaseStringUTFChars(js_state, state);
-  env->ReleaseStringUTFChars(js_value, value);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_hostPopState (JNIEnv *env, jclass cls, jstring js_host,
                                                                   jstring js_state)
 {
-  const char* host  = env->GetStringUTFChars(js_host, nullptr);
-  const char* state = env->GetStringUTFChars(js_state, nullptr);
+  jstring_wrapper host(env, js_host);
+  jstring_wrapper state(env, js_state);
 
   TRACE_host_pop_state(host, state);
-
-  env->ReleaseStringUTFChars(js_host, host);
-  env->ReleaseStringUTFChars(js_state, state);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_hostVariableDeclare (JNIEnv *env, jclass cls, jstring js_state)
 {
-  const char* state = env->GetStringUTFChars(js_state, nullptr);
+  jstring_wrapper state(env, js_state);
   TRACE_host_variable_declare(state);
-  env->ReleaseStringUTFChars(js_state, state);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_hostVariableSet (JNIEnv *env, jclass cls, jstring js_host,
                                                                      jstring js_state, jdouble value)
 {
-  const char* host  = env->GetStringUTFChars(js_host, nullptr);
-  const char* state = env->GetStringUTFChars(js_state, nullptr);
+  jstring_wrapper host(env, js_host);
+  jstring_wrapper state(env, js_state);
 
   TRACE_host_variable_set(host, state, value);
-
-  env->ReleaseStringUTFChars(js_host, host);
-  env->ReleaseStringUTFChars(js_state, state);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_hostVariableSub (JNIEnv *env, jclass cls, jstring js_host,
                                                                      jstring js_state, jdouble value)
 {
-  const char* host  = env->GetStringUTFChars(js_host, nullptr);
-  const char* state = env->GetStringUTFChars(js_state, nullptr);
+  jstring_wrapper host(env, js_host);
+  jstring_wrapper state(env, js_state);
 
   TRACE_host_variable_sub(host, state, value);
-
-  env->ReleaseStringUTFChars(js_host, host);
-  env->ReleaseStringUTFChars(js_state, state);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_vmVariableDeclare (JNIEnv *env, jclass cls, jstring js_state)
 {
-  const char* state = env->GetStringUTFChars(js_state, nullptr);
+  jstring_wrapper state(env, js_state);
 
   TRACE_vm_variable_declare(state);
-
-  env->ReleaseStringUTFChars(js_state, state);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_vmVariableSet (JNIEnv *env, jclass cls, jstring js_vm,
                                                                    jstring js_state, jdouble value)
 {
-  const char* vm    = env->GetStringUTFChars(js_vm, nullptr);
-  const char* state = env->GetStringUTFChars(js_state, nullptr);
+  jstring_wrapper vm(env, js_vm);
+  jstring_wrapper state(env, js_state);
 
   TRACE_vm_variable_set(vm, state, value);
-
-  env->ReleaseStringUTFChars(js_vm, vm);
-  env->ReleaseStringUTFChars(js_state, state);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_hostVariableAdd (JNIEnv *env, jclass cls, jstring js_host,
                                                                      jstring js_state, jdouble value)
 {
-  const char* host  = env->GetStringUTFChars(js_host, nullptr);
-  const char* state = env->GetStringUTFChars(js_state, nullptr);
+  jstring_wrapper host(env, js_host);
+  jstring_wrapper state(env, js_state);
 
   TRACE_host_variable_set(host, state, value);
-
-  env->ReleaseStringUTFChars(js_host, host);
-  env->ReleaseStringUTFChars(js_state, state);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_linkVariableDeclare (JNIEnv *env, jclass cls, jstring jvar) {
-  const char* variable = env->GetStringUTFChars(jvar, nullptr);
+  jstring_wrapper variable(env, jvar);
   TRACE_link_variable_declare (variable);
-  env->ReleaseStringUTFChars(jvar, variable);
 }
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_linkVariableDeclareWithColor (JNIEnv *env, jclass cls, jstring jvar, jstring jcolor) {
-  const char* variable = env->GetStringUTFChars(jvar, nullptr);
-  const char* color    = env->GetStringUTFChars(jcolor, nullptr);
+  jstring_wrapper variable(env, jvar);
+  jstring_wrapper color(env, jcolor);
   TRACE_link_variable_declare_with_color(variable,color);
-  env->ReleaseStringUTFChars(jvar, variable);
-  env->ReleaseStringUTFChars(jcolor, color);
 }
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_linkVariableSet (JNIEnv *env, jclass cls, jstring jlink, jstring jvar, jdouble jvalue) {
-  const char* link     = env->GetStringUTFChars(jlink, nullptr);
-  const char* variable = env->GetStringUTFChars(jvar, nullptr);
+  jstring_wrapper link(env, jlink);
+  jstring_wrapper variable(env, jvar);
   TRACE_link_variable_set(link, variable, jvalue);
-  env->ReleaseStringUTFChars(jlink, link);
-  env->ReleaseStringUTFChars(jvar, variable);
 }
 JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_linkSrcDstVariableSet
   (JNIEnv *env, jclass cls, jstring jsrc, jstring jdst, jstring jvar, jdouble jval)
 {
-  const char* src      = env->GetStringUTFChars(jsrc, nullptr);
-  const char* dst      = env->GetStringUTFChars(jdst, nullptr);
-  const char* variable = env->GetStringUTFChars(jvar, nullptr);
+  jstring_wrapper src(env, jsrc);
+  jstring_wrapper dst(env, jdst);
+  jstring_wrapper variable(env, jvar);
   TRACE_link_srcdst_variable_set(src,dst,variable, jval);
-  env->ReleaseStringUTFChars(jsrc, src);
-  env->ReleaseStringUTFChars(jdst, dst);
-  env->ReleaseStringUTFChars(jvar, variable);
 }
 /* Missing calls
    JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_linkVariableAdd(JNIEnv *, jclass, jstring, jstring, jdouble)
index 9ce6ea3..79142ae 100644 (file)
@@ -31,12 +31,11 @@ jmethodID jxbt_get_jmethod(JNIEnv * env, jclass cls, const char *name, const cha
 
   if (not id) {
     jmethodID tostr_id = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
-    auto jclassname       = (jstring)env->CallObjectMethod(cls, tostr_id, nullptr);
-    const char* classname = env->GetStringUTFChars(jclassname, nullptr);
+    auto jclassname    = (jstring)env->CallObjectMethod(cls, tostr_id, nullptr);
+    jstring_wrapper classname(env, jclassname);
+    auto msg = std::string("Cannot find method") + name + "(" + signature + ") in " + classname.value;
 
-    env->ReleaseStringUTFChars(jclassname, classname);
-
-    jxbt_throw_jni(env, std::string("Cannot find method") + name + "(" + signature + ") in " + classname);
+    jxbt_throw_jni(env, msg);
     return nullptr;
   }
 
@@ -54,11 +53,10 @@ jmethodID jxbt_get_static_jmethod(JNIEnv * env, jclass cls, const char *name, co
   if (not id) {
     jmethodID tostr_id = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
     auto jclassname       = (jstring)env->CallObjectMethod(cls, tostr_id, nullptr);
-    const char* classname = env->GetStringUTFChars(jclassname, nullptr);
-
-    env->ReleaseStringUTFChars(jclassname, classname);
+    jstring_wrapper classname(env, jclassname);
+    auto msg = std::string("Cannot find static method") + name + "(" + signature + ") in " + classname.value;
 
-    jxbt_throw_jni(env, std::string("Cannot find static method") + name + "(" + signature + ") in " + classname);
+    jxbt_throw_jni(env, msg);
     return nullptr;
   }
 
index 4106d32..c882d5c 100644 (file)
@@ -57,4 +57,34 @@ void jxbt_throw_time_out_failure(JNIEnv* env, const std::string& details);
 /**Thrown when a task is canceled */
 void jxbt_throw_task_cancelled(JNIEnv* env, const std::string& details);
 
+class jstring_wrapper {
+  JNIEnv* env_  = nullptr;
+  jstring jstr_ = nullptr;
+
+public:
+  const char* value = nullptr;
+
+  jstring_wrapper(JNIEnv* env, jstring jstr) : env_(env), jstr_(jstr)
+  {
+    if (jstr != nullptr)
+      value = env_->GetStringUTFChars(jstr_, nullptr);
+  }
+  void reset(JNIEnv* env, jstring jstr)
+  {
+    if (jstr_ != nullptr)
+      env_->ReleaseStringUTFChars(jstr_, value);
+    env_  = env;
+    jstr_ = jstr;
+    if (jstr != nullptr)
+      value = env_->GetStringUTFChars(jstr_, nullptr);
+  }
+  ~jstring_wrapper()
+  {
+    if (jstr_ != nullptr)
+      env_->ReleaseStringUTFChars(jstr_, value);
+  }
+  operator const char*() const { return value; }
+  operator const std::string() const { return std::string(value); }
+};
+
 #endif