Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge pull request #256 from Flamefire/master
[simgrid.git] / src / bindings / java / org / simgrid / msg / Process.java
index 4e9247b..4c27475 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2006-2014. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2006-2018. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -51,11 +50,8 @@ public abstract class Process implements Runnable {
 
        /** Time at which the process should be created  */
        protected double startTime = 0;
-       /** Time at which the process should be killed.
-        * 
-        * Set at creation, and used internally by SimGrid
-        */
-       private double killTime = -1;
+       /** Time at which the process should be killed */
+       private double killTime = -1; // Used from the C world
 
        private String name = null;
        
@@ -111,21 +107,21 @@ public abstract class Process implements Runnable {
         *
         * @param host                  Where to create the process.
         * @param name                  The name of the process.
-        * @param args                  The arguments of main method of the process.
+        * @param argsParam             The arguments of main method of the process.
         */     
-       public Process(Host host, String name, String[]args) 
+       public Process(Host host, String name, String[]argsParam
        {
                if (host == null)
-                       throw new NullPointerException("Cannot create a process on the null host");
+                       throw new IllegalArgumentException("Cannot create a process on the null host");
                if (name == null)
-                       throw new NullPointerException("Process name cannot be null");
+                       throw new IllegalArgumentException("Process name cannot be null");
                
                this.host = host;
                this.name = name;
 
                this.args = new ArrayList<>();
-               if (null != args)
-                       this.args.addAll(Arrays.asList(args));
+               if (null != argsParam)
+                       this.args.addAll(Arrays.asList(argsParam));
        }
        /**
         * Constructs a new process from a host and his name, the arguments of here method function are
@@ -152,14 +148,10 @@ public abstract class Process implements Runnable {
        /**
         * This method kills all running process of the simulation.
         *
-        * @param resetPID              Should we reset the PID numbers. A negative number means no reset
-        *                                              and a positive number will be used to set the PID of the next newly
-        *                                              created process.
-        *
         * @return                              The function returns the PID of the next created process.
         *                      
         */ 
-       public static native int killAll(int resetPID);
+       public static native int killAll();
 
        /** Simply kills the receiving process.
         *
@@ -221,8 +213,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.
         *
@@ -284,26 +281,21 @@ public abstract class Process implements Runnable {
        /**
         * This method actually creates and run the process.
         * It is a noop if the process is already launched.
-        * @throws HostNotFoundException
         */
-       public final void start() throws HostNotFoundException {
-               if (bind == 0)
-                        create(host);
+       public final void start() {
+          if (bind == 0)
+            create(host);
        }
 
        /** This method runs the process. It calls the method function that you must overwrite. */
        @Override
        public void run() {
 
-               String[] args = null;      /* do not fill it before the signal or this.args will be empty */
-
                try {
-                       args = new String[this.args.size()];
-                       if (!this.args.isEmpty()) {
-                               this.args.toArray(args);
-                       }
+                       String[] argsArray = new String[this.args.size()];
+                       this.args.toArray(argsArray);
 
-                       this.main(args);
+                       this.main(argsArray);
                }
                catch(MsgException e) {
                        e.printStackTrace();
@@ -316,7 +308,7 @@ public abstract class Process implements Runnable {
        }
 
        /**
-        * The main function of the process (to implement).
+        * The main function of the process (to implement by the user).
         *
         * @param args
         * @throws MsgException