2 * Copyright 2006-2012 The SimGrid team
5 * This program is free software; you can redistribute
6 * it and/or modify it under the terms of the license
7 * (GNU LGPL) which comes with this package.
10 package org.simgrid.msg;
12 import java.util.Arrays;
13 import java.util.Hashtable;
14 import java.util.Vector;
15 import java.lang.Runnable;
16 import java.util.concurrent.Semaphore;
19 * A process may be defined as a code, with some private data, executing
20 * in a location (host). All the process used by your simulation must be
21 * declared in the deployment file (XML format).
22 * To create your own process you must inherit your own process from this
23 * class and override the method "main()". For example if you want to use
24 * a process named Slave proceed as it :
26 * (1) import the class Process of the package simgrid.msg
27 * import simgrid.msg.Process;
29 * public class Slave extends simgrid.msg.Process {
31 * (2) Override the method function
34 * public void main(String[] args) {
35 * System.out.println("Hello MSG");
39 * The name of your process must be declared in the deployment file of your simulation.
40 * For the example, for the previous process Slave this file must contains a line :
41 * <process host="Maxims" function="Slave"/>, where Maxims is the host of the process
42 * Slave. All the process of your simulation are automatically launched and managed by Msg.
43 * A process use tasks to simulate communications or computations with another process.
44 * For more information see Task. For more information on host concept
49 public abstract class Process implements Runnable {
51 * This attribute represents a bind between a java process object and
52 * a native process. Even if this attribute is public you must never
53 * access to it. It is set automatically during the build of the object.
57 * Indicates if the process is started
61 * Even if this attribute is public you must never access to it.
62 * It is used to compute the id of an MSG process.
64 public static long nextProcessId = 0;
67 * Even if this attribute is public you must never access to it.
68 * It is compute automatically during the creation of the object.
69 * The native functions use this identifier to synchronize the process.
74 * Start time of the process
76 public double startTime = 0;
78 * Kill time of the process
80 public double killTime = -1;
83 * The name of the process.
85 protected String name;
87 * The PID of the process
89 protected int pid = -1;
91 * The PPID of the process
93 protected int ppid = -1;
95 * The host of the process
97 protected Host host = null;
99 /** The arguments of the method function of the process. */
100 public Vector<String> args;
104 * Default constructor (used in ApplicationHandler to initialize it)
106 protected Process() {
107 this.id = nextProcessId++;
110 this.args = new Vector<String>();
115 * Constructs a new process from the name of a host and his name. The method
116 * function of the process doesn't have argument.
118 * @param hostname The name of the host of the process to create.
119 * @param name The name of the process.
121 * @exception HostNotFoundException if no host with this name exists.
125 public Process(String hostname, String name) throws HostNotFoundException {
126 this(Host.getByName(hostname), name, null);
129 * Constructs a new process from the name of a host and his name. The arguments
130 * of the method function of the process are specified by the parameter args.
132 * @param hostname The name of the host of the process to create.
133 * @param name The name of the process.
134 * @param args The arguments of the main function of the process.
136 * @exception HostNotFoundException if no host with this name exists.
138 * @throws NativeException
141 public Process(String hostname, String name, String args[]) throws HostNotFoundException, NativeException {
142 this(Host.getByName(hostname), name, args);
145 * Constructs a new process from a host and his name. The method function of the
146 * process doesn't have argument.
148 * @param host The host of the process to create.
149 * @param name The name of the process.
152 public Process(Host host, String name) {
153 this(host, name, null);
156 * Constructs a new process from a host and his name, the arguments of here method function are
157 * specified by the parameter args.
159 * @param host The host of the process to create.
160 * @param name The name of the process.
161 * @param args The arguments of main method of the process.
163 public Process(Host host, String name, String[]args) {
167 throw new NullPointerException("Process name cannot be NULL");
170 this.args = new Vector<String>();
172 this.args.addAll(Arrays.asList(args));
175 * Constructs a new process from a host and his name, the arguments of here method function are
176 * specified by the parameter args.
178 * @param host The host of the process to create.
179 * @param name The name of the process.
180 * @param args The arguments of main method of the process.
181 * @param startTime Start time of the process
182 * @param killTime Kill time of the process
185 public Process(Host host, String name, String[]args, double startTime, double killTime) {
189 throw new NullPointerException("Process name cannot be NULL");
192 this.args = new Vector<String>();
194 this.args.addAll(Arrays.asList(args));
196 this.startTime = startTime;
197 this.killTime = killTime;
200 * The natively implemented method to create an MSG process.
201 * @param host A valid (binded) host where create the process.
203 protected native void create(String hostName) throws HostNotFoundException;
205 * This method kills all running process of the simulation.
207 * @param resetPID Should we reset the PID numbers. A negative number means no reset
208 * and a positive number will be used to set the PID of the next newly
211 * @return The function returns the PID of the next created process.
214 public static native int killAll(int resetPID);
217 * This method kill a process.
220 public native void kill();
222 * Suspends the process by suspending the task on which it was
223 * waiting for the completion.
225 public native void suspend();
227 * Suspends the process by suspending the task on which it was
228 * waiting for the completion.
229 * DEPRECATED: use suspend instead.
232 public void pause() {
236 * Sets the "auto-restart" flag of the process.
238 public native void setAutoRestart(boolean autoRestart);
240 * Restarts the process from the beginning
242 public native void restart();
244 * Resumes a suspended process by resuming the task on which it was
245 * waiting for the completion.
247 public native void resume();
249 * Tests if a process is suspended.
251 * @return The method returns true if the process is suspended.
252 * Otherwise the method returns false.
254 public native boolean isSuspended();
256 * Returns the name of the process
258 public String msgName() {
262 * Returns the host of the process.
263 * @return The host instance of the process.
265 public Host getHost() {
269 * This static method gets a process from a PID.
271 * @param PID The process identifier of the process to get.
273 * @return The process with the specified PID.
275 * @exception NativeException on error in the native SimGrid code
277 public static native Process fromPID(int PID) throws NativeException;
279 * This method returns the PID of the process.
281 * @return The PID of the process.
284 public int getPID() {
288 * This method returns the PID of the parent of a process.
290 * @return The PID of the parent of the process.
293 public int getPPID() {
297 * @brief Returns the value of a given process property.
299 public native String getProperty(String name);
302 * Set the kill time of the process
303 * @param killTime the time when the process is killed
305 public native void setKillTime(double killTime);
308 * This static method returns the currently running process.
310 * @return The current process.
313 public static native Process currentProcess();
315 * Migrates a process to another host.
317 * @param process The process to migrate.
318 * @param host The host where to migrate the process.
321 public native void migrate(Host host);
323 * Makes the current process sleep until millis millisecondes have elapsed.
324 * You should note that unlike "waitFor" which takes seconds, this method takes milliseconds.
325 * FIXME: Not optimal, maybe we should have two native functions.
326 * @param millis the length of time to sleep in milliseconds.
328 public static void sleep(long millis) throws HostFailureException {
332 * Makes the current process sleep until millis milliseconds and nanos nanoseconds
334 * You should note that unlike "waitFor" which takes seconds, this method takes milliseconds and nanoseconds.
335 * Overloads Thread.sleep.
336 * @param millis the length of time to sleep in milliseconds.
337 * @param nanos additionnal nanoseconds to sleep.
339 public native static void sleep(long millis, int nanos) throws HostFailureException;
341 * Makes the current process sleep until time seconds have elapsed.
342 * @param seconds The time the current process must sleep.
344 public native void waitFor(double seconds) throws HostFailureException;
348 public void showArgs() {
349 Msg.info("[" + this.name + "/" + this.getHost().getName() + "] argc=" +
351 for (int i = 0; i < this.args.size(); i++)
352 Msg.info("[" + this.msgName() + "/" + this.getHost().getName() +
353 "] args[" + i + "]=" + (String) (this.args.get(i)));
356 * This method actually creates and run the process.
357 * It is a noop if the process is already launched.
358 * @throws HostNotFoundException
360 public final void start() throws HostNotFoundException {
363 create(host.getName());
368 * This method runs the process. Il calls the method function that you must overwrite.
372 String[] args = null; /* do not fill it before the signal or this.args will be empty */
373 //waitSignal(); /* wait for other people to fill the process in */
376 args = new String[this.args.size()];
377 if (this.args.size() > 0) {
378 this.args.toArray(args);
382 } catch(MsgException e) {
384 Msg.info("Unexpected behavior. Stopping now");
387 catch(ProcessKilledError pk) {
394 * The main function of the process (to implement).
397 * @throws MsgException
399 public abstract void main(String[]args) throws MsgException;
401 public native void exit();
403 * Class initializer, to initialize various JNI stuff
405 public static native void nativeInit();
410 * This static method returns the current amount of processes running
412 * @return The count of the running processes
414 public native static int getCount();