From: Samuel Lepetit Date: Mon, 14 May 2012 11:43:50 +0000 (+0200) Subject: Change the way the threads are stopped, not killing the JVM at the end of the simulation. X-Git-Tag: v3_9_90~569^2~19^2~84 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/95250056fde87d7c6413baa5cc3724fd8f9a83f9 Change the way the threads are stopped, not killing the JVM at the end of the simulation. --- diff --git a/examples/pingPong/PingPongTest.java b/examples/pingPong/PingPongTest.java index 410328689f..9e902b127a 100644 --- a/examples/pingPong/PingPongTest.java +++ b/examples/pingPong/PingPongTest.java @@ -18,23 +18,20 @@ public class PingPongTest { * which also contains such a launcher */ - public static void main(String[] args) throws NativeException { - - - /* initialize the MSG simulation. Must be done before anything else (even logging). */ - Msg.init(args); - - if(args.length < 2) { - Msg.info("Usage : PingPong platform_file deployment_file"); - Msg.info("example : PingPong ping_pong_platform.xml ping_pong_deployment.xml"); - System.exit(1); - } + public static void main(String[] args) throws NativeException { + /* initialize the MSG simulation. Must be done before anything else (even logging). */ + Msg.init(args); + if(args.length < 2) { + Msg.info("Usage : PingPong platform_file deployment_file"); + Msg.info("example : PingPong ping_pong_platform.xml ping_pong_deployment.xml"); + System.exit(1); + } - /* construct the platform and deploy the application */ - Msg.createEnvironment(args[0]); - Msg.deployApplication(args[1]); + /* construct the platform and deploy the application */ + Msg.createEnvironment(args[0]); + Msg.deployApplication(args[1]); - /* execute the simulation. */ - Msg.run(); + /* execute the simulation. */ + Msg.run(); } } diff --git a/examples/pingPong/Sender.java b/examples/pingPong/Sender.java index 454cbb4f84..ff8efdc43a 100644 --- a/examples/pingPong/Sender.java +++ b/examples/pingPong/Sender.java @@ -14,8 +14,8 @@ import org.simgrid.msg.MsgException; import org.simgrid.msg.Process; public class Sender extends Process { - public Sender(String hostname, String name) throws HostNotFoundException { - super(hostname, name); + public Sender(Host host, String name, String[]args) { + super(host,name,args); } private final double commSizeLat = 1; final double commSizeBw = 100000000; diff --git a/org/simgrid/msg/Process.java b/org/simgrid/msg/Process.java index 85d822f408..dc50455e7c 100644 --- a/org/simgrid/msg/Process.java +++ b/org/simgrid/msg/Process.java @@ -331,10 +331,6 @@ public abstract class Process implements Runnable { Msg.info("[" + this.msgName() + "/" + this.getHost().getName() + "] args[" + i + "]=" + (String) (this.args.get(i))); } - /** - * Exit the process - */ - public native void exit(); /** * This method actually creates and run the process. * @throws HostNotFoundException @@ -358,7 +354,6 @@ public abstract class Process implements Runnable { } this.main(args); - exit(); } catch(MsgException e) { e.printStackTrace(); Msg.info("Unexpected behavior. Stopping now"); @@ -366,20 +361,7 @@ public abstract class Process implements Runnable { } catch(ProcessKilled pk) { if (nativeStop) { - try { - exit(); - } catch (ProcessKilled pk2) { - /* Ignore that other exception that *will* occur all the time. - * This is because the C mechanic gives the control to the now-killed process - * so that it does some garbage collecting on its own. When it does so here, - * the Java thread checks when starting if it's supposed to be killed (to inform - * the C world). To avoid the infinite loop or anything similar, we ignore that - * exception now. This should be ok since we ignore only a very specific exception - * class and not a generic (such as any RuntimeException). - */ - //System.err.println(currentThread().getName()+": I ignore that other exception"); - } - //Msg.info(" Process " + ((Process) Thread.currentThread()).msgName() + " has been killed."); + } else { pk.printStackTrace(); diff --git a/src/jmsg.c b/src/jmsg.c index 49ac55fdd0..9f7490584f 100644 --- a/src/jmsg.c +++ b/src/jmsg.c @@ -46,7 +46,6 @@ JNIEnv *get_current_thread_env(void) JNIEnv *env; (*__java_vm)->AttachCurrentThread(__java_vm, (void **) &env, NULL); - return env; } /*************************************************************************************** diff --git a/src/jmsg_process.c b/src/jmsg_process.c index 520241da31..bdb88c10ba 100644 --- a/src/jmsg_process.c +++ b/src/jmsg_process.c @@ -329,22 +329,6 @@ Java_org_simgrid_msg_Process_waitFor(JNIEnv * env, jobject jprocess, } } -JNIEXPORT void JNICALL -Java_org_simgrid_msg_Process_exit(JNIEnv * env, - jobject jprocess) -{ - - m_process_t process = jprocess_to_native_process(jprocess, env); - - if (!process) { - jxbt_throw_notbound(env, "process", jprocess); - return; - } - smx_ctx_java_t context = (smx_ctx_java_t)MSG_process_get_smx_ctx(process); - smx_ctx_java_stop(MSG_process_get_smx_ctx(process)); - xbt_os_sem_release(context->end); -} - JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_kill(JNIEnv * env, jclass cls, jobject jprocess) diff --git a/src/jmsg_process.h b/src/jmsg_process.h index 6d1caba867..0f5c41b0ca 100644 --- a/src/jmsg_process.h +++ b/src/jmsg_process.h @@ -73,10 +73,10 @@ void jprocess_start(jobject jprocess, JNIEnv * env); * @param jprocess The java process to stop. * @param env The env of the current thread * - * @exception If the class Process is not found the function throws - * the ClassNotFoundException. If the methos stop() of - * this class is not found the function throws the exception - * NotSuchMethodException. + * @exception If the class Process is not found the function throws + * the ClassNotFoundException. If the methos stop() of + * this class is not found the function throws the exception + * NotSuchMethodException. */ void jprocess_exit(jobject jprocess, JNIEnv * env); @@ -230,13 +230,6 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_sleep */ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_waitFor (JNIEnv *, jobject, jdouble); -/** - * Class org_simgrid_msg_Process - * Method exit - * Signature ()V - */ -JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_exit - (JNIEnv *, jobject); /* * Class org_simgrid_msg_Process * Method kill diff --git a/src/smx_context_java.c b/src/smx_context_java.c index 15a92f8530..1c3b80cf53 100644 --- a/src/smx_context_java.c +++ b/src/smx_context_java.c @@ -65,7 +65,6 @@ smx_ctx_java_factory_create_context(xbt_main_func_t code, int argc, void_pfn_smxprocess_t cleanup_func, void* data) { - XBT_DEBUG("XXXX Create Context\n"); smx_ctx_java_t context = xbt_new0(s_smx_ctx_java_t, 1); /* If the user provided a function for the process then use it @@ -73,12 +72,12 @@ smx_ctx_java_factory_create_context(xbt_main_func_t code, int argc, if (code) { context->super.cleanup_func = cleanup_func; context->jprocess = (jobject) code; - context->jenv = get_current_thread_env(); context->begin = xbt_os_sem_init(0); context->end = xbt_os_sem_init(0); context->thread = xbt_os_thread_create(NULL,smx_ctx_java_thread_run,context,NULL); } else { + context->thread = NULL; my_current_context = (smx_context_t)context; } context->super.data = data; @@ -91,31 +90,29 @@ static void* smx_ctx_java_thread_run(void *data) { //Attach the thread to the JVM JNIEnv *env; JavaVM *jvm = get_current_vm(); - (*jvm)->AttachCurrentThread(jvm, (void **) &env, NULL); - //Wait for the first scheduling round to happen. + jint error = (*jvm)->AttachCurrentThread(jvm, (void **) &env, NULL); + xbt_assert((error == JNI_OK), "The thread could not be attached to the JVM"); + context->jenv = get_current_thread_env(); + //Wait for the first scheduling round to happen. xbt_os_sem_acquire(context->begin); //Execution of the "run" method. jmethodID id = jxbt_get_smethod(env, "org/simgrid/msg/Process", "run", "()V"); xbt_assert( (id != NULL), "Method not found..."); (*env)->CallVoidMethod(env, context->jprocess, id); + smx_ctx_java_stop((smx_context_t)context); + return NULL; } static void smx_ctx_java_free(smx_context_t context) { - if (context) { + if (context) { smx_ctx_java_t ctx_java = (smx_ctx_java_t) context; - if (ctx_java->jprocess) { /* the java process still exists */ - jobject jprocess = ctx_java->jprocess; - ctx_java->jprocess = NULL; /* stop it */ - XBT_DEBUG("The process still exists, making it exit now"); - /* detach the thread and exit it */ - JavaVM *jvm = get_current_vm(); - (*jvm)->DetachCurrentThread(jvm); - xbt_os_thread_exit(NULL); - /* it's dead now, remove it from the JVM */ - jprocess_delete_global_ref(jprocess, get_current_thread_env()); + if (ctx_java->thread) { /* We are not in maestro context */ + xbt_os_thread_join(ctx_java->thread, NULL); + xbt_os_sem_destroy(ctx_java->begin); + xbt_os_sem_destroy(ctx_java->end); } } smx_ctx_base_free(context); @@ -124,18 +121,19 @@ static void smx_ctx_java_free(smx_context_t context) void smx_ctx_java_stop(smx_context_t context) { - xbt_assert(context == my_current_context, + smx_ctx_java_t ctx_java = (smx_ctx_java_t)context; + xbt_assert(context == my_current_context, "The context to stop must be the current one"); /* I am the current process and I am dying */ - smx_ctx_base_stop(context); - - XBT_DEBUG("I am dying"); - - /* suspend myself again, smx_ctx_java_free() will destroy me later - * from maeastro */ - smx_ctx_java_suspend(context); - XBT_DEBUG("Java stop finished"); + /* detach the thread and kills it */ + JNIEnv *env = ctx_java->jenv; + (*env)->DeleteGlobalRef(env,ctx_java->jprocess); + JavaVM *jvm = get_current_vm(); + jint error = (*jvm)->DetachCurrentThread(jvm); + xbt_assert((error == JNI_OK), "The thread couldn't be detached."); + xbt_os_sem_release(((smx_ctx_java_t)context)->end); + xbt_os_thread_exit(NULL); } static void smx_ctx_java_suspend(smx_context_t context) @@ -143,7 +141,6 @@ static void smx_ctx_java_suspend(smx_context_t context) smx_ctx_java_t ctx_java = (smx_ctx_java_t) context; xbt_os_sem_release(ctx_java->end); xbt_os_sem_acquire(ctx_java->begin); - //jprocess_unschedule(context); } // FIXME: inline those functions @@ -153,7 +150,6 @@ static void smx_ctx_java_resume(smx_context_t new_context) smx_ctx_java_t ctx_java = (smx_ctx_java_t) new_context; xbt_os_sem_release(ctx_java->begin); xbt_os_sem_acquire(ctx_java->end); - //jprocess_schedule(new_context); } static void smx_ctx_java_runall(void)