Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
for some reasons, the PID was sometimes not inited correctly in Java
authorMartin Quinson <martin.quinson@loria.fr>
Mon, 27 Nov 2017 14:56:28 +0000 (15:56 +0100)
committerMartin Quinson <martin.quinson@loria.fr>
Mon, 27 Nov 2017 16:10:18 +0000 (17:10 +0100)
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.

examples/java/app/masterworker/Master.java
examples/java/app/masterworker/Worker.java
examples/java/app/masterworker/app-masterworker.tesh
src/bindings/java/jmsg_process.cpp
src/bindings/java/jmsg_process.h
src/bindings/java/org/simgrid/msg/Process.java

index 6de1072..a88332b 100644 (file)
@@ -29,7 +29,7 @@ public class Master extends Process {
 
     int workersCount = Integer.parseInt(args[3]);
 
 
     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); 
 
     for (int i = 0; i < tasksCount; i++) {
       Task task = new Task("Task_" + i, taskComputeSize, taskCommunicateSize); 
index dc7d44f..20113dd 100644 (file)
@@ -34,7 +34,7 @@ public class Worker extends Process {
       if ("finalize".equals(task.getName())) {
         break;
       }
       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) {
       try {
         task.execute();
       } catch (TaskCancelledException e) {
index e2fcf87..fdf4de7 100644 (file)
@@ -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.
 
 $ 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!
 > [  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!
index 1d4b58e..05ba285 100644 (file)
@@ -127,6 +127,12 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Process_fromPID(JNIEnv * env, jcl
   return jprocess;
 }
 
   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);
 
 JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Process_getProperty(JNIEnv *env, jobject jprocess, jobject jname) {
   msg_process_t process = jprocess_to_native(jprocess, env);
 
index 597f5b2..0d5cc44 100644 (file)
@@ -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 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);
 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);
index e4c7900..ecc7cee 100644 (file)
@@ -217,8 +217,13 @@ public abstract class Process implements Runnable {
         *
         */ 
        public int getPID()  {
         *
         */ 
        public int getPID()  {
+               if (pid == -1) // Don't traverse the JNI barrier if you already have the answer
+                       pid = nativeGetPID(); 
                return pid;
        }
                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.
         *
        /**
         * This method returns the PID of the parent of a process.
         *