Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
ac30cf60b6fca34666b3568c16e8f4c09890dbb1
[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 abstract 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     /* Used to schedule the process */
95     protected Sem sem;
96         
97     /**
98      * Default constructor. (used in ApplicationHandler to initialize it)
99      */
100     protected Process() {
101         super();
102         this.id = 0;
103         this.name = null;
104         this.bind = 0;
105         this.args = new Vector();
106         sem = new Sem(0); /* suspend the thread first */
107     }
108
109         
110     /**
111      * Constructs a new process from the name of a host and his name. The method
112      * function of the process doesn't have argument.
113      *
114      * @param hostName          The name of the host of the process to create.
115      * @param name                      The name of the process.
116      *
117      * @exception                       HostNotFoundException  if no host with this name exists.
118      *                              NullPointerException if the provided name is null
119      *                              JniException on JNI madness
120      *
121      */
122     public Process(String hostname,String name) 
123         throws NullPointerException, HostNotFoundException, JniException, NativeException {
124         this(Host.getByName(hostname),name,null);
125     }
126         
127     /**
128      * Constructs a new process from the name of a host and his name. The arguments
129      * of the method function of the process are specified by the parameter args.
130      *
131      * @param hostName          The name of the host of the process to create.
132      * @param name                      The name of the process.
133      * @param args                      The arguments of the main function of the process.
134      *
135      * @exception                       HostNotFoundException  if no host with this name exists.
136      *                              NullPointerException if the provided name is null
137      *                              JniException on JNI madness
138      *
139      */
140     public Process(String hostname,String name,String args[]) 
141         throws NullPointerException, HostNotFoundException, JniException, NativeException {
142         this(Host.getByName(hostname),name,args);
143     }
144         
145     /**
146      * Constructs a new process from a host and his name. The method function of the 
147      * process doesn't have argument.
148      *
149      * @param host                      The host of the process to create.
150      * @param name                      The name of the process.
151      *
152      * @exception                       NullPointerException if the provided name is null
153      *                              JniException on JNI madness
154      *
155      */
156     public Process(Host host,String name) throws NullPointerException, JniException {
157         this(host,name,null);
158     }
159         
160     /**
161      * Constructs a new process from a host and his name, the arguments of here method function are
162      * specified by the parameter args.
163      *
164      * @param host                      The host of the process to create.
165      * @param name                      The name of the process.
166      * @param args                      The arguments of main method of the process.
167      *
168      * @exception                   NullPointerException if the provided name is null
169      *                              JniException on JNI madness
170      *
171      */
172     public Process(Host host,String name,String[] args) throws NullPointerException, JniException {
173         /* This is the constructor called by all others */
174
175         if (name==null)
176             throw new NullPointerException("Process name cannot be NULL");
177         
178         
179         this.args = new Vector();
180         
181         if(null != args)
182                 this.args.addAll(Arrays.asList(args));
183                 
184         this.name = name;
185         this.id = nextProcessId++;
186         
187         sem = new Sem(0); /* suspend the thread first */
188                 
189         Msg.processCreate(this,host);
190     }
191         
192     /**
193      * This method kills all running process of the simulation.
194      *
195      * @param resetPID          Should we reset the PID numbers. A negative number means no reset
196      *                                          and a positive number will be used to set the PID of the next newly
197      *                                          created process.
198      *
199      * @return                          The function returns the PID of the next created process.
200      *                  
201      */                         
202     public static int killAll(int resetPID){
203         return Msg.processKillAll(resetPID);
204     }
205         
206     /**
207      * This method adds an argument in the list of the arguments of the main function
208      * of the process. 
209      *
210      * @param arg                       The argument to add.
211      */
212     protected void addArg(String arg) {
213         args.add(arg);
214     }
215         
216     /**
217      * This method suspends the process by suspending 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     public void pause() throws JniException,NativeException {
224         Msg.processSuspend(this);               
225     }
226         
227     /**
228      * This method resumes a suspended process by resuming the task on which it was
229      * waiting for the completion.
230      *
231      * @exception                       JniException on JNI madness
232      *                              NativeException on error in the native SimGrid code
233      *
234      */
235     public void restart() throws JniException,NativeException {
236         Msg.processResume(this);
237     }
238         
239     /**
240      * This method tests if a process is suspended.
241      *
242      * @return                          The method returns true if the process is suspended.
243      *                                          Otherwise the method returns false.
244      *
245      * @exception                       JniException on JNI madness
246      */
247     public boolean isSuspended() throws JniException {
248         return Msg.processIsSuspended(this);
249     }
250         
251     /**
252      * This method returns the host of a process.
253      *
254      * @return                          The host instance of the process.
255      *
256      * @exception                       JniException on JNI madness
257      *                              NativeException on error in the native SimGrid code
258      *
259      */
260     public Host getHost() throws JniException,NativeException{
261         return Msg.processGetHost(this);
262     }
263         
264     /**
265      * This static method get a process from a PID.
266      *
267      * @param PID                       The process identifier of the process to get.
268      *
269      * @return                          The process with the specified PID.
270      *
271      * @exception                       NativeException on error in the native SimGrid code
272      */
273     public static Process fromPID(int PID) throws NativeException {
274         return Msg.processFromPID(PID);
275     }
276         
277     /**
278      * This method returns the PID of the process.
279      *
280      * @return                          The PID of the process.
281      *
282      * @exception                       JniException on JNI madness
283      *                              NativeException on error in the native SimGrid code
284      */
285     public int getPID() throws JniException,NativeException{
286         return Msg.processGetPID(this);
287     }   
288         
289     /**
290      * This method returns the PID of the parent of a process.
291      *
292      * @return                          The PID of the parent of the process.
293      *
294      * @exception                       NativeException on error in the native SimGrid code
295      */
296     public int getPPID() throws NativeException{
297         return Msg.processGetPPID(this);
298     }
299         
300     /**
301      * This static method returns the currently running process.
302      *
303      * @return                          The current process.
304      *
305      * @exception                       NativeException on error in the native SimGrid code
306      *
307      *
308      */ 
309     public static Process currentProcess()  throws NativeException{
310         return  Msg.processSelf();
311     }
312         
313     /**
314      * This static method returns the PID of the currently running process.
315      *
316      * @return                          The PID of the current process.         
317      */
318     public static int currentProcessPID(){
319         return  Msg.processSelfPID();
320     }
321         
322     /**
323      * This static method returns the PID of the parent of the currently running process.
324      *
325      * @return                          The PID of the parent of current process.               
326      */
327     public static int currentProcessPPID(){
328         return  Msg.processSelfPPID();
329     }
330         
331     /**
332      * This function migrates a process to another host.
333      *
334      * @parm host                       The host where to migrate the process.
335      *
336      * @exception                       JniException on JNI madness
337      *                              NativeException on error in the native SimGrid code
338      */                 
339     public void migrate(Host host) throws JniException, NativeException{
340         Msg.processChangeHost(this,host);
341     }
342         
343     /**
344      * This method makes the current process sleep until time seconds have elapsed.
345      *
346      * @param seconds           The time the current process must sleep.
347      *
348      * @exception                       NativeException on error in the native SimGrid code
349      */
350     public static void waitFor(double seconds) throws NativeException {
351         Msg.processWaitFor(seconds);
352     }
353         
354
355     public void showArgs(){
356         try {
357             Msg.info("["+this.name+"/"+this.getHost().getName()+"] argc="+this.args.size() );   
358             for(int i = 0; i < this.args.size(); i++) 
359                 Msg.info("["+this.msgName()+"/"+this.getHost().getName()+
360                          "] args["+i+"]="+(String)(this.args.get(i)));
361         } catch (MsgException e) {
362             Msg.info("Damn JNI stuff");
363             e.printStackTrace();
364             System.exit(1);
365         }
366     }
367     /**
368      * This method runs the process. Il calls the method function that you must overwrite.
369      */
370     public synchronized void run() {
371                 
372         try {
373             String[] args = null; /* do not fill it before the signal or this.args will be empty */
374             
375             waitSignal(); /* wait for other people to fill the process in */
376                 
377                 if(this.args.size() > 0)
378                 {
379                 
380                 args = new String[this.args.size()];
381                         this.args.toArray(args);
382                 }
383
384             this.main(args);
385             Msg.processExit(this);
386         } catch (MsgException e) {
387             e.printStackTrace();
388             Msg.info("Unexpected behavior. Stopping now");
389             System.exit(1);
390         }
391     }
392     
393     /**
394      * Process synchronization. The process wait the signal of the simulator to start.
395      *
396      * @exception                       JniException on JNI madness
397      */
398     private void waitSignal() throws JniException{
399         Msg.waitSignal(this);
400         unschedule();        
401     }
402   
403     /**
404          * The main function of the process (to implement).
405          */
406     public abstract void main(String[] args) 
407     throws JniException, NativeException;
408     
409    
410     public void unschedule() {
411         try {        
412                         sem.acquire();
413                 } catch(InterruptedException e)
414                 {
415                         // todo
416                 }
417     }
418     
419      public void schedule() { 
420         sem.release(); 
421     }
422 }