From: Martin Quinson Date: Mon, 27 Nov 2017 14:56:28 +0000 (+0100) Subject: for some reasons, the PID was sometimes not inited correctly in Java X-Git-Tag: v3.18~231 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/fd41b2cabc72234362ec02d66b9b24f5754b1200?hp=--cc for some reasons, the PID was sometimes not inited correctly in Java It is supposed to be inited during actor creation, but I've seen during the SUD'17 a machine where it remained at -1. So, if the PID is negative, java will ask again to the C for a fixup. We could have fixed the problem, but chasing down JNI issues is really hard. I prefer to play nasty and safe here. Or let's call it the belt and brace approach instead. --- fd41b2cabc72234362ec02d66b9b24f5754b1200 diff --git a/examples/java/app/masterworker/Master.java b/examples/java/app/masterworker/Master.java index 6de1072d35..a88332b880 100644 --- a/examples/java/app/masterworker/Master.java +++ b/examples/java/app/masterworker/Master.java @@ -29,7 +29,7 @@ public class Master extends Process { int workersCount = Integer.parseInt(args[3]); - Msg.info("Hello! Got "+ workersCount + " workers and "+tasksCount+" tasks to process"); + Msg.info("Hello! My PID is "+getPID()+". Got "+ workersCount + " workers and "+tasksCount+" tasks to process"); for (int i = 0; i < tasksCount; i++) { Task task = new Task("Task_" + i, taskComputeSize, taskCommunicateSize); diff --git a/examples/java/app/masterworker/Worker.java b/examples/java/app/masterworker/Worker.java index dc7d44fb96..20113dd7e6 100644 --- a/examples/java/app/masterworker/Worker.java +++ b/examples/java/app/masterworker/Worker.java @@ -34,7 +34,7 @@ public class Worker extends Process { if ("finalize".equals(task.getName())) { break; } - Msg.info("Received \"" + task.getName() + "\". Processing it."); + Msg.info("Received \"" + task.getName() + "\". Processing it (my pid is "+getPID()+")."); try { task.execute(); } catch (TaskCancelledException e) { diff --git a/examples/java/app/masterworker/app-masterworker.tesh b/examples/java/app/masterworker/app-masterworker.tesh index e2fcf87955..fdf4de7153 100644 --- a/examples/java/app/masterworker/app-masterworker.tesh +++ b/examples/java/app/masterworker/app-masterworker.tesh @@ -2,12 +2,12 @@ $ java -classpath ${classpath:=.} app/masterworker/Main ${srcdir:=.}/../platforms/small_platform.xml ${srcdir:=.}/app/masterworker/masterworker.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:maestro@) Using regular java threads. -> [ 0.000000] (1:app.masterworker.Master@Jacquelin) Hello! Got 7 workers and 5 tasks to process -> [ 0.860026] (2:app.masterworker.Worker@Tremblay) Received "Task_0". Processing it. -> [ 1.752187] (3:app.masterworker.Worker@Fafard) Received "Task_1". Processing it. -> [ 1.757531] (4:app.masterworker.Worker@Bourassa) Received "Task_2". Processing it. -> [ 2.806417] (5:app.masterworker.Worker@Boivin) Received "Task_3". Processing it. -> [ 2.811761] (6:app.masterworker.Worker@Ginette) Received "Task_4". Processing it. +> [ 0.000000] (1:app.masterworker.Master@Jacquelin) Hello! My PID is 1. Got 7 workers and 5 tasks to process +> [ 0.860026] (2:app.masterworker.Worker@Tremblay) Received "Task_0". Processing it (my pid is 2). +> [ 1.752187] (3:app.masterworker.Worker@Fafard) Received "Task_1". Processing it (my pid is 3). +> [ 1.757531] (4:app.masterworker.Worker@Bourassa) Received "Task_2". Processing it (my pid is 4). +> [ 2.806417] (5:app.masterworker.Worker@Boivin) Received "Task_3". Processing it (my pid is 5). +> [ 2.811761] (6:app.masterworker.Worker@Ginette) Received "Task_4". Processing it (my pid is 6). > [ 2.811761] (1:app.masterworker.Master@Jacquelin) All tasks have been dispatched. Let's tell everybody the computation is over. > [ 3.671783] (2:app.masterworker.Worker@Tremblay) Received Finalize. I'm done. See you! > [ 4.563940] (3:app.masterworker.Worker@Fafard) Received Finalize. I'm done. See you! diff --git a/src/bindings/java/jmsg_process.cpp b/src/bindings/java/jmsg_process.cpp index 1d4b58eadf..05ba285b57 100644 --- a/src/bindings/java/jmsg_process.cpp +++ b/src/bindings/java/jmsg_process.cpp @@ -127,6 +127,12 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Process_fromPID(JNIEnv * env, jcl return jprocess; } +JNIEXPORT jint JNICALL Java_org_simgrid_msg_Process_nativeGetPID(JNIEnv* env, jobject jprocess) +{ + msg_process_t process = jprocess_to_native(jprocess, env); + return MSG_process_get_PID(process); +} + JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Process_getProperty(JNIEnv *env, jobject jprocess, jobject jname) { msg_process_t process = jprocess_to_native(jprocess, env); diff --git a/src/bindings/java/jmsg_process.h b/src/bindings/java/jmsg_process.h index 597f5b270d..0d5cc44288 100644 --- a/src/bindings/java/jmsg_process.h +++ b/src/bindings/java/jmsg_process.h @@ -50,6 +50,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_create(JNIEnv* env, jobject JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_daemonize(JNIEnv* env, jobject jprocess); JNIEXPORT jint JNICALL Java_org_simgrid_msg_Process_killAll(JNIEnv* env, jclass cls, jint jresetPID); JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Process_fromPID(JNIEnv* env, jclass cls, jint pid); +JNIEXPORT jint JNICALL Java_org_simgrid_msg_Process_nativeGetPID(JNIEnv* env, jobject jprocess); JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Process_getProperty(JNIEnv* env, jobject jprocess, jobject jname); JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Process_getCurrentProcess(JNIEnv* env, jclass cls); JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_suspend(JNIEnv* env, jobject jprocess); diff --git a/src/bindings/java/org/simgrid/msg/Process.java b/src/bindings/java/org/simgrid/msg/Process.java index e4c7900eba..ecc7cee6d9 100644 --- a/src/bindings/java/org/simgrid/msg/Process.java +++ b/src/bindings/java/org/simgrid/msg/Process.java @@ -217,8 +217,13 @@ public abstract class Process implements Runnable { * */ public int getPID() { + if (pid == -1) // Don't traverse the JNI barrier if you already have the answer + pid = nativeGetPID(); return pid; } + // This should not be used: the PID is supposed to be initialized from the C directly when the actor is created, + // but this sometimes fail, so let's play nasty but safe here. + private native int nativeGetPID(); /** * This method returns the PID of the parent of a process. *