Alexei Fedotov said the following on 09.02.2008 16:34:
Hello, folks,
I have some problems trying to understand the current Harmony VM
shutdown mechanism. I would appreciate any help from you.

   * What is a correct place to put my own C shutdown code?

It depends on how the application shuts down. It if finishes all non-daemon threads, then vm_destroy is a good place. Keep in mind that shutdown sequence is very fragile and it is easy to break it. If application exits with System.exit, then the only place is before _exit() in Java_java_lang_VMExecutionEngine_exit.

   * Why does VM detach the main thread from both the launcher and
vm_destroy function?

I didn't get the question. Do you mean that main thread is attached in the DestroyJavaVM function? It is done because at shutdown VM has to execute shutdown hooks, and therefore it has to execute Java on an attached thread.

   * What is the reason for the global monitor locks and unlocks in
the following function? What means the comment about jobjectArray?
JNIEXPORT void JNICALL Java_java_lang_VMExecutionEngine_exit
  (JNIEnv * jni_env, jclass, jint status, jboolean needFinalization,
jobjectArray)
{
    // ToDo: process jobjectArray
    hythread_global_lock();
    _exit(status);
    hythread_global_unlock();
}

It was done to fix the bug HARMONY-5167. Somehow threads could be created even when _exit() function is executed, so final heap check could produce an error on windows in debug mode.

   * Where are VM resources reclaimed on shutdown? I found the only
apr_pool_destroy(java_vm->pool) in DestroyJavaVM(). Are there any
other places?

The main place is Global_Env::~Global_Env() in Environment.cpp. This destructor is called only in case VM exits normally. For System.exit destructors are not executed.

--
Gregory

Reply via email to