Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Removed "ApplicationHandler" and "japplication_handler" and use MSG_launch_applicatio...
[simgrid.git] / src / jmsg_process.c
1 /* Functions related to the java process instances.                         */
2
3 /* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
4  * All rights reserved.                                                     */
5
6 /* This program is free software; you can redistribute it and/or modify it
7   * under the terms of the license (GNU LGPL) which comes with this package. */
8 #include "jmsg_process.h"
9
10 #include "jmsg.h"
11 #include "jmsg_host.h"
12 #include "jxbt_utilities.h"
13 #include "smx_context_java.h"
14
15 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
16
17 jobject native_to_java_process(m_process_t process)
18 {
19   return ((smx_ctx_java_t)MSG_process_get_smx_ctx(process))->jprocess;
20 }
21
22 jobject jprocess_new_global_ref(jobject jprocess, JNIEnv * env)
23 {
24   return (*env)->NewGlobalRef(env, jprocess);
25 }
26
27 void jprocess_delete_global_ref(jobject jprocess, JNIEnv * env)
28 {
29   (*env)->DeleteGlobalRef(env, jprocess);
30 }
31
32 void jprocess_join(jobject jprocess, JNIEnv * env)
33 {
34         m_process_t process = jprocess_to_native_process(jprocess,env);
35         smx_ctx_java_t context = (smx_ctx_java_t)MSG_process_get_smx_ctx(process);
36         xbt_os_thread_join(context->thread,NULL);
37 }
38
39 m_process_t jprocess_to_native_process(jobject jprocess, JNIEnv * env)
40 {
41   return (m_process_t) (long) (*env)->GetLongField(env, jprocess, jprocess_field_Process_bind);
42 }
43
44 void jprocess_bind(jobject jprocess, m_process_t process, JNIEnv * env)
45 {
46   (*env)->SetLongField(env, jprocess, jprocess_field_Process_bind, (jlong) (long) (process));
47 }
48
49 jlong jprocess_get_id(jobject jprocess, JNIEnv * env)
50 {
51   return (*env)->GetLongField(env, jprocess, jprocess_field_Process_id);
52 }
53
54 jstring jprocess_get_name(jobject jprocess, JNIEnv * env)
55 {
56   jstring jname = (jstring) (*env)->GetObjectField(env, jprocess, jprocess_field_Process_name);
57   return (*env)->NewGlobalRef(env, jname);
58
59 }
60
61 jboolean jprocess_is_valid(jobject jprocess, JNIEnv * env)
62 {
63   jfieldID id = jxbt_get_sfield(env, "org/simgrid/msg/Process", "bind", "J");
64
65   if (!id)
66     return JNI_FALSE;
67
68   return (*env)->GetLongField(env, jprocess, id) ? JNI_TRUE : JNI_FALSE;
69 }
70 JNIEXPORT void JNICALL
71 Java_org_simgrid_msg_Process_nativeInit(JNIEnv *env, jclass cls) {
72         jclass jprocess_class_Process = (*env)->FindClass(env, "org/simgrid/msg/Process");
73
74         jprocess_field_Process_name = jxbt_get_jfield(env, jprocess_class_Process, "name", "Ljava/lang/String;");
75         jprocess_field_Process_bind = jxbt_get_jfield(env, jprocess_class_Process, "bind", "J");
76         jprocess_field_Process_id = jxbt_get_jfield(env, jprocess_class_Process, "id", "J");
77         jprocess_field_Process_pid = jxbt_get_jfield(env, jprocess_class_Process, "pid", "I");
78         jprocess_field_Process_ppid = jxbt_get_jfield(env, jprocess_class_Process, "ppid", "I");
79         jprocess_field_Process_host = jxbt_get_jfield(env, jprocess_class_Process, "host", "Lorg/simgrid/msg/Host;");
80         jprocess_field_Process_killTime = jxbt_get_jfield(env, jprocess_class_Process, "killTime", "D");
81         if (!jprocess_class_Process || !jprocess_field_Process_id || !jprocess_field_Process_name || !jprocess_field_Process_pid ||
82                         !jprocess_field_Process_ppid || !jprocess_field_Process_host) {
83         jxbt_throw_native(env,bprintf("Can't find some fields in Java class. You should report this bug."));
84         }
85 }
86 JNIEXPORT void JNICALL
87 Java_org_simgrid_msg_Process_create(JNIEnv * env,
88                                     jobject jprocess_arg,
89                                     jobject jhostname)
90 {
91
92
93   jobject jprocess;             /* the global reference to the java process instance    */
94   jstring jname;                /* the name of the java process instance                */
95   const char *name;             /* the C name of the process                            */
96   const char *hostname;
97   m_process_t process;          /* the native process to create                         */
98   m_host_t host;                /* Where that process lives */
99
100   hostname = (*env)->GetStringUTFChars(env, jhostname, 0);
101
102   XBT_DEBUG("Java_org_simgrid_msg_MsgNative_processCreate(env=%p,jproc=%p,host=%s)",
103          env, jprocess_arg, hostname);
104
105
106   /* get the name of the java process */
107   jname = jprocess_get_name(jprocess_arg, env);
108   if (!jname) {
109     jxbt_throw_null(env,
110             xbt_strdup("Internal error: Process name cannot be NULL"));
111     return;
112   }
113
114   /* bind/retrieve the msg host */
115   host = MSG_get_host_by_name(hostname);
116
117   if (!(host)) {    /* not binded */
118     jxbt_throw_host_not_found(env, hostname);
119     return;
120   }
121
122   /* create a global java process instance */
123   jprocess = jprocess_new_global_ref(jprocess_arg, env);
124   if (!jprocess) {
125     jxbt_throw_jni(env, "Can't get a global ref to the java process");
126     return;
127   }
128
129   /* build the C name of the process */
130   name = (*env)->GetStringUTFChars(env, jname, 0);
131   name = xbt_strdup(name);
132
133   /* Retrieve the kill time from the process */
134   jdouble jkill = (*env)->GetDoubleField(env, jprocess, jprocess_field_Process_killTime);
135   /* Actually build the MSG process */
136   process = MSG_process_create_with_environment(name,
137                                                 (xbt_main_func_t) jprocess,
138                                                 /*data*/ jprocess,
139                                                 host,
140                                                 (double)jkill, /* kill time */
141                                                 /*argc, argv, properties*/
142                                                 0,NULL,NULL);
143
144   MSG_process_set_data(process,&process);
145   /* bind the java process instance to the native process */
146   jprocess_bind(jprocess, process, env);
147
148   /* release our reference to the process name (variable name becomes invalid) */
149   //FIXME : This line should be uncommented but with mac it doesn't work. BIG WARNING
150   //(*env)->ReleaseStringUTFChars(env, jname, name);
151   (*env)->ReleaseStringUTFChars(env, jhostname, hostname);
152
153   /* sets the PID and the PPID of the process */
154   (*env)->SetIntField(env, jprocess, jprocess_field_Process_pid,(jint) MSG_process_get_PID(process));
155   (*env)->SetIntField(env, jprocess, jprocess_field_Process_ppid, (jint) MSG_process_get_PPID(process));
156   /* sets the Host of the process */
157   jobject jhost = Java_org_simgrid_msg_Host_getByName(env,NULL,jhostname);
158
159   (*env)->SetObjectField(env, jprocess, jprocess_field_Process_host, jhost);
160 }
161
162 JNIEXPORT jint JNICALL
163 Java_org_simgrid_msg_Process_killAll(JNIEnv * env, jclass cls,
164                                      jint jresetPID)
165 {
166   return (jint) MSG_process_killall((int) jresetPID);
167 }
168
169 JNIEXPORT jobject JNICALL
170 Java_org_simgrid_msg_Process_fromPID(JNIEnv * env, jclass cls,
171                                      jint PID)
172 {
173   m_process_t process = MSG_process_from_PID(PID);
174
175   if (!process) {
176     jxbt_throw_process_not_found(env, bprintf("PID = %d",(int) PID));
177     return NULL;
178   }
179
180   jobject jprocess = native_to_java_process(process);
181
182   if (!jprocess) {
183     jxbt_throw_jni(env, "SIMIX_process_get_jprocess() failed");
184     return NULL;
185   }
186
187   return jprocess;
188 }
189
190 JNIEXPORT jobject JNICALL
191 Java_org_simgrid_msg_Process_currentProcess(JNIEnv * env, jclass cls)
192 {
193   m_process_t process = MSG_process_self();
194   jobject jprocess;
195
196   if (!process) {
197     jxbt_throw_jni(env, xbt_strdup("MSG_process_self() failed"));
198     return NULL;
199   }
200
201   jprocess = native_to_java_process(process);
202
203   if (!jprocess)
204     jxbt_throw_jni(env, xbt_strdup("SIMIX_process_get_jprocess() failed"));
205
206   return jprocess;
207 }
208
209 JNIEXPORT void JNICALL
210 Java_org_simgrid_msg_Process_pause(JNIEnv * env,
211                                    jobject jprocess)
212 {
213   m_process_t process = jprocess_to_native_process(jprocess, env);
214
215   if (!process) {
216     jxbt_throw_notbound(env, "process", jprocess);
217     return;
218   }
219
220   /* try to suspend the process */
221   MSG_error_t rv = MSG_process_suspend(process);
222
223   jxbt_check_res("MSG_process_suspend()", rv, MSG_OK,
224                  bprintf("unexpected error , please report this bug"));
225
226 }
227 JNIEXPORT void JNICALL
228 Java_org_simgrid_msg_Process_restart(JNIEnv * env,
229                                      jobject jprocess)
230 {
231   m_process_t process = jprocess_to_native_process(jprocess, env);
232
233   if (!process) {
234     jxbt_throw_notbound(env, "process", jprocess);
235     return;
236   }
237
238   /* try to resume the process */
239   MSG_error_t rv = MSG_process_resume(process);
240
241   jxbt_check_res("MSG_process_resume()", rv, MSG_OK,
242                  bprintf("unexpected error , please report this bug"));
243 }
244 JNIEXPORT jboolean JNICALL
245 Java_org_simgrid_msg_Process_isSuspended(JNIEnv * env,
246                                          jobject jprocess)
247 {
248   m_process_t process = jprocess_to_native_process(jprocess, env);
249
250   if (!process) {
251     jxbt_throw_notbound(env, "process", jprocess);
252     return 0;
253   }
254
255   /* true is the process is suspended, false otherwise */
256   return (jboolean) MSG_process_is_suspended(process);
257 }
258
259 JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_sleep
260         (JNIEnv *env, jclass cls, jlong jmillis, jint jnanos) {
261
262         double time =  jmillis / 1000 + jnanos / 1000;
263         MSG_error_t rv;
264         TRY {
265                 rv = MSG_process_sleep(time);
266         }
267         CATCH_ANONYMOUS {
268                 return;
269         }
270         jxbt_check_res("MSG_process_sleep()", rv, MSG_OK,
271                  bprintf("unexpected error , please report this bug"));
272 }
273 JNIEXPORT void JNICALL
274 Java_org_simgrid_msg_Process_waitFor(JNIEnv * env, jobject jprocess,
275                                      jdouble jseconds)
276 {
277   m_process_t process = jprocess_to_native_process(jprocess, env);
278
279   if (!process) {
280     jxbt_throw_notbound(env, "process", jprocess);
281     return;
282   }
283   MSG_error_t rv;
284   TRY {
285          rv = MSG_process_sleep((double)jseconds);
286   }
287   CATCH_ANONYMOUS {
288         return;
289   }
290   if (rv != MSG_OK) {
291 //      smx_ctx_java_stop(smx_ctx_java_self());
292   }
293 }
294
295 JNIEXPORT void JNICALL
296 Java_org_simgrid_msg_Process_kill(JNIEnv * env,
297                                   jobject jprocess)
298 {
299         /* get the native instances from the java ones */
300   m_process_t process = jprocess_to_native_process(jprocess, env);
301   if (!process) {
302     jxbt_throw_notbound(env, "process", jprocess);
303     return;
304   }
305
306         MSG_process_kill(process);
307 }
308 JNIEXPORT void JNICALL
309 Java_org_simgrid_msg_Process_migrate(JNIEnv * env,
310                                      jobject jprocess, jobject jhost)
311 {
312   m_process_t process = jprocess_to_native_process(jprocess, env);
313
314   if (!process) {
315     jxbt_throw_notbound(env, "process", jprocess);
316     return;
317   }
318
319   m_host_t host = jhost_get_native(env, jhost);
320
321   if (!host) {
322     jxbt_throw_notbound(env, "host", jhost);
323     return;
324   }
325
326   /* try to change the host of the process */
327   MSG_error_t rv = MSG_process_migrate(process, host);
328   jxbt_check_res("MSG_process_migrate()", rv, MSG_OK,
329                  bprintf("unexpected error , please report this bug"));
330   /* change the host java side */
331   (*env)->SetObjectField(env, jprocess, jprocess_field_Process_host, jhost);
332 }