Index: trunk/vm/vmcore/include/environment.h =================================================================== --- trunk/vm/vmcore/include/environment.h (revision 467577) +++ trunk/vm/vmcore/include/environment.h (working copy) @@ -186,6 +186,7 @@ * 2 - deadly errors in shutdown */ int shutting_down; + int destroying_vm; // FIXME // The whole environemt will be refactored to VM instance Index: trunk/vm/vmcore/include/init.h =================================================================== --- trunk/vm/vmcore/include/init.h (revision 467577) +++ trunk/vm/vmcore/include/init.h (working copy) @@ -31,7 +31,6 @@ jint vm_init1(JavaVM_Internal * java_vm, JavaVMInitArgs * vm_arguments); jint vm_init2(JNIEnv * jni_env); jint vm_destroy(JavaVM_Internal * java_vm, jthread java_thread); -void vm_exit(int exit_code); void initialize_vm_cmd_state(Global_Env *p_env, JavaVMInitArgs* arguments); void set_log_levels_from_cmd(JavaVMInitArgs* vm_arguments); Index: trunk/vm/vmcore/src/class_support/Environment.cpp =================================================================== --- trunk/vm/vmcore/src/class_support/Environment.cpp (revision 467577) +++ trunk/vm/vmcore/src/class_support/Environment.cpp (working copy) @@ -159,6 +159,7 @@ vm_class_offset = 0; shutting_down = 0; + destroying_vm = 0; TI = new DebugUtilsTI; vm_methods = new Method_Lookup_Table; @@ -188,16 +189,15 @@ delete properties; properties = NULL; - delete bootstrap_class_loader; - bootstrap_class_loader = NULL; - nso_clear_lookup_table(nsoTable); nsoTable = NULL; compile_clear_dynamic_code_list(dcList); dcList = NULL; - hythread_lib_destroy(hythread_lib); + // TODO: Currently, there is only one global thread library instance. + // It still can be used after VM is destroyed. + // hythread_lib_destroy(hythread_lib); } Class* Global_Env::LoadCoreClass(const String* s) Index: trunk/vm/vmcore/src/init/vm_shutdown.cpp =================================================================== --- trunk/vm/vmcore/src/init/vm_shutdown.cpp (revision 467577) +++ trunk/vm/vmcore/src/init/vm_shutdown.cpp (working copy) @@ -71,53 +71,6 @@ vm_mem_dealloc(); } -/** - * TODO: - */ -void vm_exit(int exit_code) -{ - jthread java_thread; - JNIEnv * jni_env; - Global_Env * vm_env; - - assert(hythread_is_suspend_enabled()); - - java_thread = jthread_self(); - jni_env = jthread_get_JNI_env(java_thread); - vm_env = jni_get_vm_env(jni_env); - - // Send VM_Death event and switch phase to VM_Death - jvmti_send_vm_death_event(); - - /* FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME * - * gregory - JVMTI shutdown should be part of DestroyVM after current VM shutdown * - * problems are fixed * - * FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME */ - // call Agent_OnUnload() for agents and unload agents - JavaVM *java_vm; - jni_env->GetJavaVM(&java_vm); - vm_env->TI->Shutdown(java_vm); - - // Raise uncaught exception to current thread. - // It will be properly processed in jthread_detach(). - if (vm_env->uncaught_exception) { - exn_raise_object(vm_env->uncaught_exception); - } - - // Detach current thread. - IDATA UNREF status = jthread_detach(java_thread); - assert(status == TM_ERROR_NONE); - - // Cleanup internal data. Disabled by default due to violation access exception. - if (vm_get_boolean_property_value_with_default("vm.cleanupOnExit")) { - jthread_cancel_all(); - vm_cleanup_internal_data(); - LOGGER_EXIT(exit_code); - } - - _exit(exit_code); -} - #define PROCESS_EXCEPTION(message) \ { \ ECHO("Internal error: " << message); \ @@ -187,7 +140,38 @@ status = java_vm->vm_env->uncaught_exception == NULL ? 0 : 1; - return run_system_exit(jni_env, status); + // TODO: This is only temporary solution. Don't terminate the process + // if System.exit was called from DestroyJavaVM. + java_vm->vm_env->destroying_vm = 1; + + run_system_exit(jni_env, status); + + // Send VM_Death event and switch phase to VM_Death + jvmti_send_vm_death_event(); + + /* FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME * + * gregory - JVMTI shutdown should be part of DestroyVM after current VM shutdown * + * problems are fixed * + * FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME */ + // call Agent_OnUnload() for agents and unload agents + java_vm->vm_env->TI->Shutdown(java_vm); + + + // Raise uncaught exception to current thread. + // It will be properly processed in jthread_detach(). + if (java_vm->vm_env->uncaught_exception) { + exn_raise_object(java_vm->vm_env->uncaught_exception); + } + + // Detach current thread. + status = jthread_detach(java_thread); + + // Cleanup internal data. Disabled by default due to violation access exception. + if (vm_get_boolean_property_value_with_default("vm.cleanupOnExit")) { + vm_cleanup_internal_data(); + } + + return status; } static inline void dump_all_java_stacks() @@ -240,5 +224,5 @@ //FIXME: integration should do int another way. //vm_set_event(non_daemon_threads_dead_handle); }else - exit(1); //vm_exit(1); + exit(1); } Index: trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMExecutionEngine.cpp =================================================================== --- trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMExecutionEngine.cpp (revision 467577) +++ trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMExecutionEngine.cpp (working copy) @@ -55,10 +55,14 @@ // FixME: should be removed //JNIEXPORT void JNICALL Java_java_lang_VMExecutionEngine_exit JNIEXPORT void JNICALL Java_java_lang_VMExecutionEngine_exit__IZ - (JNIEnv *, jclass, jint status, jboolean) + (JNIEnv * jni_env, jclass, jint status, jboolean) { // ToDo: process jboolean - vm_exit(status); + // TODO: This is only temporary solution. Don't terminate the process + // if System.exit was called from DestroyJavaVM. + if (jni_get_vm_env(jni_env)->destroying_vm == 0) { + _exit(status); + } } /* @@ -67,11 +71,15 @@ * Signature: (IZ[Ljava/lang/Runnable;)V */ JNIEXPORT void JNICALL Java_java_lang_VMExecutionEngine_exit__IZ_3Ljava_lang_Runnable_2 - (JNIEnv *, jclass, jint status, jboolean, jobjectArray) + (JNIEnv * jni_env, jclass, jint status, jboolean, jobjectArray) { // ToDo: process jboolean // ToDo: process jobjectArray - vm_exit(status); + // TODO: This is only temporary solution. Don't terminate the process + // if System.exit was called from DestroyJavaVM. + if (jni_get_vm_env(jni_env)->destroying_vm == 0) { + _exit(status); + } }