Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
a3921e69654524c95ef1397adf02335030d2c9da
[simgrid.git] / src / java / simgrid / msg / Process.java
1 /*
2  * simgrid.msg.Host.java        1.00 07/05/01
3  *
4  * Copyright 2006,2007 Martin Quinson, Malek Cherier           
5  * All right reserved. 
6  *
7  * This program is free software; you can redistribute 
8  * it and/or modify it under the terms of the license 
9  *(GNU LGPL) which comes with this package. 
10  */
11
12 package simgrid.msg;
13
14 import java.lang.Thread;
15 import java.util.*;
16 /*
17  * A process may be defined as a code, with some private data, executing 
18  * in a location (host). All the process used by your simulation must be
19  * declared in the deployment file (XML format).
20  * To create your ouwn process you must inherite your own process from this 
21  * class and override the method "main()". For example if you want to use 
22  * a process named Slave proceed as it :
23  *
24  * (1) import the class Process of the package simgrid.msg
25  * import simgrid.msg.Process;
26  * 
27  * public class Slave extends simgrid.msg.Process {
28  *
29  *      (2) Write a default constructor and 
30  *      call the default constructor of the base class.
31  *      
32  *      public Slave() {
33  *              super();
34  *  }
35  *
36  *  (3) Override the method function 
37  *      public void main(String[] args) {
38  *              System.out.println("Hello MSG");
39  *      }
40  * }
41  * The name of your process must be declared in the deployment file of your simulation.
42  * For the exemple, for the previouse process Slave this file must contains a line :
43  * <process host="Maxims" function="Slave"/>, where Maxims is the host of the process
44  * Slave. All the process of your simulation are automaticaly launched and managed by Msg.
45  * A process use tasks to simulate communications or computations with another process. 
46  * For more information see Task and ParallelTask. For more information on host concept 
47  * see Host.
48  * 
49  * @author  Abdelmalek Cherier
50  * @author  Martin Quinson
51  * @version 1.00, 07/05/01
52  * @see Host
53  * @see Task
54  * @see ParallelTask
55  * @since SimGrid 3.3
56  * @since JDK1.5011
57  */
58  
59 public class Process extends Thread
60 {
61     /**
62      * This attribute represents a bind between a java process object and
63      * a native process. Even if this attribute is public you must never
64      * access to it. It is set automaticatly during the build of the object.
65      */
66     public long bind;
67         
68     /**
69      * Even if this attribute is public you must never access to it.
70      * It is used to compute the id of an MSG process.
71      */
72     public static long nextProcessId = 0;
73         
74     /**
75      * Even if this attribute is public you must never access to it.
76      * It is compute automaticaly during the creation of the object. 
77      * The native functions use this identifier to synchronize the process.
78      */
79     public long id;
80         
81     /**
82      * The name of the process.                                                 
83      */
84     protected String name;
85     public String msgName() {
86         return this.name;
87     }
88         
89     /*
90      * The arguments of the method function of the process.     
91      */
92     public Vector args;
93         
94     /**
95      * Default constructor. (used in ApplicationHandler to initialize it)
96      */
97     protected Process() {
98         super();
99         this.id = 0;
100         this.name = null;
101         this.bind = 0;
102         this.args = new Vector();
103     }
104
105         
106     /**
107      * Constructs a new process from the name of a host and his name. The method
108      * function of the process doesn't have argument.
109      *
110      * @param hostName          The name of the host of the process to create.
111      * @param name                      The name of the process.
112      *
113      * @exception                       HostNotFoundException  if no host with this name exists.
114      *                              NullPointerException if the provided name is null
115      *                              JniException on JNI madness
116      *
117      */
118     public Process(String hostname,String name) 
119         throws NullPointerException, HostNotFoundException, JniException, NativeException {
120         this(Host.getByName(hostname),name,null);
121     }
122         
123     /**
124      * Constructs a new process from the name of a host and his name. The arguments
125      * of the method function of the process are specified by the parameter args.
126      *
127      * @param hostName          The name of the host of the process to create.
128      * @param name                      The name of the process.
129      * @param args                      The arguments of the main function of the process.
130      *
131      * @exception                       HostNotFoundException  if no host with this name exists.
132      *                              NullPointerException if the provided name is null
133      *                              JniException on JNI madness
134      *
135      */
136     public Process(String hostname,String name,String args[]) 
137         throws NullPointerException, HostNotFoundException, JniException, NativeException {
138         this(Host.getByName(hostname),name,args);
139     }
140         
141     /**
142      * Constructs a new process from a host and his name. The method function of the 
143      * process doesn't have argument.
144      *
145      * @param host                      The host of the process to create.
146      * @param name                      The name of the process.
147      *
148      * @exception                       NullPointerException if the provided name is null
149      *                              JniException on JNI madness
150      *
151      */
152     public Process(Host host,String name) throws NullPointerException, JniException {
153         this(host,name,null);
154     }
155         
156     /**
157      * Constructs a new process from a host and his name, the arguments of here method function are
158      * specified by the parameter args.
159      *
160      * @param host                      The host of the process to create.
161      * @param name                      The name of the process.
162      * @param args                      The arguments of main method of the process.
163      *
164      * @exception                   NullPointerException if the provided name is null
165      *                              JniException on JNI madness
166      *
167      */
168     public Process(Host host,String name,String[] args) throws NullPointerException, JniException {
169         /* This is the constructor called by all others */
170
171         if (name==null)
172             throw new NullPointerException("Process name cannot be NULL");
173
174         this.args.addAll(Arrays.asList(args));
175         this.name = name;
176         this.id = nextProcessId++;
177                 
178         Msg.processCreate(this,host);
179     }
180         
181     /**
182      * This method kills all running process of the simulation.
183      *
184      * @param resetPID          Should we reset the PID numbers. A negative number means no reset
185      *                                          and a positive number will be used to set the PID of the next newly
186      *                                          created process.
187      *
188      * @return                          The function returns the PID of the next created process.
189      *                  
190      */                         
191     public static int killAll(int resetPID){
192         return Msg.processKillAll(resetPID);
193     }
194         
195     /**
196      * This method adds an argument in the list of the arguments of the main function
197      * of the process. 
198      *
199      * @param arg                       The argument to add.
200      */
201     protected void addArg(String arg) {
202         args.add(arg);
203     }
204         
205     /**
206      * This method suspends the process by suspending the task on which it was
207      * waiting for the completion.
208      *
209      * @exception                       JniException on JNI madness
210      *                              NativeException on error in the native SimGrid code
211      */
212     public void pause() throws JniException,NativeException {
213         Msg.processSuspend(this);               
214     }
215         
216     /**
217      * This method resumes a suspended process by resuming the task on which it was
218      * waiting for the completion.
219      *
220      * @exception                       JniException on JNI madness
221      *                              NativeException on error in the native SimGrid code
222      *
223      */
224     public void restart() throws JniException,NativeException {
225         Msg.processResume(this);
226     }
227         
228     /**
229      * This method tests if a process is suspended.
230      *
231      * @return                          The method returns true if the process is suspended.
232      *                                          Otherwise the method returns false.
233      *
234      * @exception                       JniException on JNI madness
235      */
236     public boolean isSuspended() throws JniException {
237         return Msg.processIsSuspended(this);
238     }
239         
240     /**
241      * This method returns the host of a process.
242      *
243      * @return                          The host instance of the process.
244      *
245      * @exception                       JniException on JNI madness
246      *                              NativeException on error in the native SimGrid code
247      *
248      */
249     public Host getHost() throws JniException,NativeException{
250         return Msg.processGetHost(this);
251     }
252         
253     /**
254      * This static method get a process from a PID.
255      *
256      * @param PID                       The process identifier of the process to get.
257      *
258      * @return                          The process with the specified PID.
259      *
260      * @exception                       NativeException on error in the native SimGrid code
261      */
262     public static Process fromPID(int PID) throws NativeException {
263         return Msg.processFromPID(PID);
264     }
265         
266     /**
267      * This method returns the PID of the process.
268      *
269      * @return                          The PID of the process.
270      *
271      * @exception                       JniException on JNI madness
272      *                              NativeException on error in the native SimGrid code
273      */
274     public int getPID() throws JniException,NativeException{
275         return Msg.processGetPID(this);
276     }   
277         
278     /**
279      * This method returns the PID of the parent of a process.
280      *
281      * @return                          The PID of the parent of the process.
282      *
283      * @exception                       NativeException on error in the native SimGrid code
284      */
285     public int getPPID() throws NativeException{
286         return Msg.processGetPPID(this);
287     }
288         
289     /**
290      * This static method returns the currently running process.
291      *
292      * @return                          The current process.
293      *
294      * @exception                       NativeException on error in the native SimGrid code
295      *
296      *
297      */ 
298     public static Process currentProcess()  throws NativeException{
299         return  Msg.processSelf();
300     }
301         
302     /**
303      * This static method returns the PID of the currently running process.
304      *
305      * @return                          The PID of the current process.         
306      */
307     public static int currentProcessPID(){
308         return  Msg.processSelfPID();
309     }
310         
311     /**
312      * This static method returns the PID of the parent of the currently running process.
313      *
314      * @return                          The PID of the parent of current process.               
315      */
316     public static int currentProcessPPID(){
317         return  Msg.processSelfPPID();
318     }
319         
320     /**
321      * This function migrates a process to another host.
322      *
323      * @parm host                       The host where to migrate the process.
324      *
325      * @exception                       JniException on JNI madness
326      *                              NativeException on error in the native SimGrid code
327      */                 
328     public void migrate(Host host) throws JniException, NativeException{
329         Msg.processChangeHost(this,host);
330     }
331         
332     /**
333      * This method makes the current process sleep until time seconds have elapsed.
334      *
335      * @param seconds           The time the current process must sleep.
336      *
337      * @exception                       NativeException on error in the native SimGrid code
338      */
339     public static void waitFor(double seconds) throws NativeException {
340         Msg.processWaitFor(seconds);
341     }
342         
343
344     public void showArgs(){
345         try {
346             Msg.info("["+this.name+"/"+this.getHost().getName()+"] argc="+this.args.size() );   
347             for(int i = 0; i < this.args.size(); i++) 
348                 Msg.info("["+this.msgName()+"/"+this.getHost().getName()+
349                          "] args["+i+"]="+(String)(this.args.get(i)));
350         } catch (MsgException e) {
351             Msg.info("Damn JNI stuff");
352             e.printStackTrace();
353             System.exit(1);
354         }
355     }
356     /**
357      * This method runs the process. Il calls the method function that you must overwrite.
358      */
359     public synchronized void run() {
360                 
361         try {
362             String[] args; /* do not fill it before the signal or this.args will be empty */
363             
364             waitSignal(); /* wait for other people to fill the process in */
365
366             args = new String[this.args.size()];
367             this.args.toArray(args);
368
369             Msg.info("["+this.name+"/"+this.getHost().getName()+"] Start");
370             this.main(args);
371             Msg.processExit(this);
372         } catch (MsgException e) {
373             e.printStackTrace();
374             Msg.info("Unexpected behavior. Stopping now");
375             System.exit(1);
376         }
377     }
378     
379     /**
380      * Process synchronization. The process wait the signal of the simulator to start.
381      *
382      * @exception                       JniException on JNI madness
383      */
384     private void waitSignal() throws JniException{
385         Msg.waitSignal(this);        
386     }
387   
388     /**
389      * The main function of the process (to override).
390      */
391
392     public void main(String[] args) throws MsgException {
393         
394         // TODO
395         // ALL DERIVED CLASS OF THIS CLASS MUST OVERRIDE THIS METHOD
396     }
397     
398 }