Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
sonar: don't mask fields with parameters in Java
[simgrid.git] / src / bindings / java / org / simgrid / msg / Process.java
index f96cf87..fc4d205 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. */
@@ -48,27 +47,11 @@ public abstract class Process implements Runnable {
         */
        private long bind = 0;
        /** Indicates if the process is started */
-       boolean started;
-       /**
-        * Even if this attribute is public you must never access to it.
-        * It is used to compute the id of an MSG process.
-        */
-       private static long nextProcessId = 0;
-
-       /**
-        * Even if this attribute is public you must never access to it.
-        * It is compute automatically during the creation of the object. 
-        * The native functions use this identifier to synchronize the process.
-        */
-       private long id;
 
        /** 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;
        
@@ -77,7 +60,7 @@ public abstract class Process implements Runnable {
        private Host host = null;
 
        /** The arguments of the method function of the process. */
-       private ArrayList<String> args = new ArrayList<>();
+       private ArrayList<String> args_ = new ArrayList<>();
 
        /**
         * Constructs a new process from the name of a host and his name. The method
@@ -129,17 +112,16 @@ public abstract class Process implements Runnable {
        public Process(Host host, String name, String[]args) 
        {
                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.id = nextProcessId++;
                this.host = host;
                this.name = name;
 
-               this.args = new ArrayList<>();
+               this.args_ = new ArrayList<>();
                if (null != args)
-                       this.args.addAll(Arrays.asList(args));
+                       this.args_.addAll(Arrays.asList(args));
        }
        /**
         * Constructs a new process from a host and his name, the arguments of here method function are
@@ -158,10 +140,11 @@ public abstract class Process implements Runnable {
                this.killTime = killTime;
        }
        /**
-        * The natively implemented method to create an MSG process.
-        * @param hostName    A valid (bound) host where create the process.
+        * The native method to create an MSG process.
+        * @param host    where to create the process.
         */
-       protected native void create(String hostName) throws HostNotFoundException;
+       protected native void create(Host host);
+       
        /**
         * This method kills all running process of the simulation.
         *
@@ -234,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.
         *
@@ -297,13 +285,10 @@ 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 (!started) {
-                       started = true;
-                       create(host.getName());
-               }
+       public final void start() {
+          if (bind == 0)
+            create(host);
        }
 
        /** This method runs the process. It calls the method function that you must overwrite. */
@@ -313,9 +298,9 @@ public abstract class Process implements Runnable {
                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);
+                       args = new String[this.args_.size()];
+                       if (!this.args_.isEmpty()) {
+                               this.args_.toArray(args);
                        }
 
                        this.main(args);
@@ -331,7 +316,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