Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
5242090acb4121217e0ce9cf6370cae2a06dde61
[simgrid.git] / org / simgrid / msg / Task.java
1 /*
2  * simgrid.msg.Task.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 org.simgrid.msg;
13
14 /**
15  * A task is either something to compute somewhere, or something to exchange between two hosts (or both).
16  * It is defined by a computing amount and a message size.
17  *
18  */
19 public class Task {
20         /**
21          * This attribute represents a bind between a java task object and
22          * a native task. Even if this attribute is public you must never
23          * access to it. It is set automatically during the build of the object.
24          */
25         public long bind = 0;
26         /**
27          * Task name
28          */
29         protected String name;
30
31         /** Default constructor (all fields to 0 or null) */
32         public Task() {
33                 create(null, 0, 0);
34         }
35
36         /* *              * *
37          * * Constructors * *
38          * *              * */
39         /**
40          * Construct an new task with the specified processing amount and amount
41          * of data needed.
42          *
43          * @param name  Task's name
44          *
45          * @param computeDuration       A value of the processing amount (in flop) needed to process the task. 
46          *                              If 0, then it cannot be executed with the execute() method.
47          *                              This value has to be >= 0.
48          *
49          * @param messageSize           A value of amount of data (in bytes) needed to transfert this task.
50          *                              If 0, then it cannot be transfered with the get() and put() methods.
51          *                              This value has to be >= 0.
52          */ 
53         public Task(String name, double computeDuration, double messageSize) {
54                 create(name, computeDuration, messageSize);
55         }
56         /**
57          * Construct an new parallel task with the specified processing amount and amount for each host
58          * implied.
59          *
60          * @param name          The name of the parallel task.
61          * @param hosts         The list of hosts implied by the parallel task.
62          * @param computeDurations      The amount of operations to be performed by each host of \a hosts.
63          * @param messageSizes  A matrix describing the amount of data to exchange between hosts.
64          */ 
65         public Task(String name, Host[]hosts, double[]computeDurations, double[]messageSizes) {
66                 parallelCreate(name, hosts, computeDurations, messageSizes);
67         }
68         
69         /**
70          * The natively implemented method to create a MSG task.
71          *
72          * @param name            The name of th task.
73          * @param computeDuration    A value of the processing amount (in flop) needed 
74          *                        to process the task. If 0, then it cannot be executed
75          *                        with the execute() method. This value has to be >= 0.
76          * @param messageSize        A value of amount of data (in bytes) needed to transfert 
77          *                        this task. If 0, then it cannot be transfered this task. 
78          *                        If 0, then it cannot be transfered with the get() and put() 
79          *                        methods. This value has to be >= 0.
80          * @exception             IllegalArgumentException if compute duration <0 or message size <0
81          */
82         final native void create(String name,
83                         double computeDuration,
84                         double messageSize)
85         throws IllegalArgumentException;                
86         /**
87          * The natively implemented method to create a MSG parallel task.
88          *
89          * @param name                The name of the parallel task.
90          * @param hosts                The list of hosts implied by the parallel task.
91          * @param computeDurations    The total number of operations that have to be performed
92          *                            on the hosts.
93          * @param messageSizes        An array of doubles
94          *
95          */
96         final native void parallelCreate(String name,
97                         Host[]hosts,
98                         double[]computeDurations,
99                         double[]messageSizes)
100         throws NullPointerException, IllegalArgumentException;
101         /* *                   * *
102          * * Getters / Setters * *
103          * *                   * */
104     /** 
105      * Gets the name of a task
106      */
107         public String getName() {
108                 return name;
109         }
110         /**
111          * Gets the sender of the task 
112          * Returns null if the task hasn't been sent yet
113          */
114         public native Process getSender();
115         /** Gets the source of the task.
116          * Returns null if the task hasn't been sent yet.
117      */
118         public native Host getSource();   
119         /** Gets the computing amount of the task
120      * FIXME: Cache it !
121      */
122         public native double getComputeDuration();
123         /** Gets the remaining computation of the task
124      */
125         public native double getRemainingDuration();
126         /**
127          * This method sets the priority of the computation of the task.
128          * The priority doesn't affect the transfer rate. For example a
129          * priority of 2 will make the task receive two times more cpu than
130          * the other ones.
131          *
132          * @param priority      The new priority of the task.
133          */ 
134         public native void setPriority(double priority);
135         /**
136          * Set the computation amount needed to process the task
137          * @param computationAmount the amount of computation needed to process the task
138          */
139         public native void setComputeDuration(double computationAmount);
140         /* *                     * *
141          * * Computation-related * *
142          * *                     * */
143         /**
144          * Executes a task on the location on which the process is running.
145          *
146      *
147      * @throws HostFailureException
148      * @throws TaskCancelledException
149      */
150         public native void execute() throws HostFailureException,TaskCancelledException;
151         /**
152          * Cancels a task.
153          *
154          */ 
155         public native void cancel();
156         /** Deletes a task.
157          *
158          * @exception                   NativeException if the destruction failed.
159          */ 
160         protected void finalize() throws NativeException {
161                 destroy();
162         }
163         /**
164          * The natively implemented method to destroy a MSG task.
165          */
166         protected native void destroy();
167         /* *                       * *
168          * * Communication-related * *
169          * *                       * */
170
171         /** Send the task asynchronously on the mailbox identified by the specified name, 
172          *  with no way to retrieve whether the communication succeeded or not
173          * 
174          */
175         public native void dsend(String mailbox);       
176         /**
177          * Sends the task on the mailbox identified by the specified name 
178          *
179      * @param mailbox
180      * @throws TimeoutException
181          * @throws HostFailureException 
182          * @throws TransferFailureException 
183          */
184         public void send(String mailbox) throws TransferFailureException, HostFailureException, TimeoutException {
185                 send(mailbox, -1);
186         } 
187
188         /**
189          * Sends the task on the mailbox identified by the specified name (wait at most \a timeout seconds)
190          *
191      * @param mailbox
192      * @param timeout
193      * @exception  NativeException if the retrieval fails.
194          * @throws TimeoutException 
195          * @throws HostFailureException 
196          * @throws TransferFailureException 
197          */
198         public native void send(String mailbox, double timeout) throws TransferFailureException, HostFailureException, TimeoutException;
199         /**
200          * Sends the task on the mailbox identified by the specified alias  (capping the sending rate to \a maxrate) 
201          *
202      * @param alias
203      * @param maxrate 
204      * @throws TransferFailureException
205      * @throws HostFailureException
206      * @throws TimeoutException
207          */
208         public native void sendBounded(String alias, double maxrate) throws TransferFailureException, HostFailureException, TimeoutException;
209         /**
210          * Sends the task on the mailbox asynchronously
211          */
212         public native Comm isend(String mailbox);
213         
214         /**
215          * Starts listening for receiving a task from an asynchronous communication
216          * @param mailbox
217          */
218         public static native Comm irecv(String mailbox);
219         /**
220          * Retrieves next task from the mailbox identified by the specified name
221          *
222      * @param mailbox
223          */
224
225         public static Task receive(String mailbox) throws TransferFailureException, HostFailureException, TimeoutException {
226                 return receive(mailbox, -1.0, null);
227         }
228
229         /**
230          * Retrieves next task on the mailbox identified by the specified name (wait at most \a timeout seconds)
231          *
232      * @param mailbox
233      * @param timeout
234          */
235         public static Task receive(String mailbox, double timeout) throws  TransferFailureException, HostFailureException, TimeoutException {
236                 return receive(mailbox, timeout, null);
237         }
238
239         /**
240          * Retrieves next task sent by a given host on the mailbox identified by the specified alias 
241          *
242      * @param mailbox
243      * @param host
244          */
245
246         public static Task receive(String mailbox, Host host) throws TransferFailureException, HostFailureException, TimeoutException {
247                 return receive(mailbox, -1.0, host);
248         }
249
250         /**
251          * Retrieves next task sent by a given host on the mailbox identified by the specified alias (wait at most \a timeout seconds)
252          *
253      * @param mailbox
254      * @param timeout 
255      * @param host
256          */
257         public native static Task receive(String mailbox, double timeout, Host host) throws TransferFailureException, HostFailureException, TimeoutException;
258         /**
259          * Tests whether there is a pending communication on the mailbox identified by the specified alias, and who sent it
260      */
261         public native static int listenFrom(String mailbox);
262         /**
263          * Listen whether there is a waiting task on the mailbox identified by the specified alias
264      */
265         public native static boolean listen(String mailbox);
266
267         /**
268          * Counts the number of tasks waiting to be received on the \a mailbox identified by the specified alia and sended by the specified \a host.
269      */
270         public native static int listenFromHost(String alias, Host host);
271         
272         /**
273          * Class initializer, to initialize various JNI stuff
274          */
275         public static native void nativeInit();
276         static {
277                 nativeInit();
278         }
279 }