Index: trunk/vm/interpreter/src/interpreter.cpp =================================================================== --- trunk/vm/interpreter/src/interpreter.cpp (revision 489284) +++ trunk/vm/interpreter/src/interpreter.cpp (working copy) @@ -2322,6 +2322,20 @@ uint32 ip = frame.ip - (uint8*)m->get_byte_code_addr(); DEBUG_BYTECODE("ip = " << dec << (int)ip << endl); + // When VM is in shutdown stage we need to execute final block to + // release monitors and propogate an exception to the upper frames. + if (VM_Global_State::loader_env->IsVmShutdowning()) { + for(uint32 i = 0; i < m->num_bc_exception_handlers(); i++) { + Handler *h = m->get_bc_exception_handler_info(i); + if (h->get_catch_type_index() == 0 && + h->get_start_pc() <= ip && ip < h->get_end_pc()) { + *hh = h; + return true; + } + } + return false; + } + Class *clazz = m->get_class(); for(uint32 i = 0; i < m->num_bc_exception_handlers(); i++) { @@ -2341,6 +2355,7 @@ DEBUG_BYTECODE("catch type index = " << (int)catch_type_index << endl); + // WARNING: GC may occur here !!! Class *obj = interp_resolve_class(clazz, catch_type_index); if (!obj) { @@ -2807,12 +2822,15 @@ frame.locked_monitors = new_ml; Opcode_MONITORENTER(frame); frame.exc = get_current_thread_exception(); + goto check_exception; + /* if (frame.exc != 0) { frame.locked_monitors = new_ml->next; new_ml->next = frame.free_monitors; frame.free_monitors = new_ml; goto got_exception; } + */ } break; case OPCODE_MONITOREXIT: @@ -2976,19 +2994,6 @@ got_exception: assert(&frame == getLastStackFrame()); - if (VM_Global_State::loader_env->IsVmShutdowning()) { - assert(!hythread_is_suspend_enabled()); - assert(exn_raised()); - if (frame.locked_monitors) { - M2N_ALLOC_MACRO; - vm_monitor_exit_wrapper(frame.locked_monitors->monitor); - M2N_FREE_MACRO; - assert(!frame.locked_monitors->next); - } - M2N_FREE_MACRO; - return; - } - clear_current_thread_exception(); if (interpreter_ti_notification_mode) { Index: trunk/vm/tests/smoke/shutdown/TestNativeAllocation.c =================================================================== --- trunk/vm/tests/smoke/shutdown/TestNativeAllocation.c (revision 489284) +++ trunk/vm/tests/smoke/shutdown/TestNativeAllocation.c (working copy) @@ -19,7 +19,7 @@ if (methID == NULL) { --allocated; if (allocated == 0) { - printf("PASSED"); + printf("SED"); } return; } @@ -28,9 +28,9 @@ if ((*jni_env)->ExceptionOccurred(jni_env)) { --allocated; if (allocated == 0) { - printf("PASSED"); + printf("SED"); } return; } - printf("FAILED"); + printf(" FAILED "); } \ No newline at end of file Index: trunk/vm/tests/smoke/shutdown/TestNativeAllocation.java =================================================================== --- trunk/vm/tests/smoke/shutdown/TestNativeAllocation.java (revision 489284) +++ trunk/vm/tests/smoke/shutdown/TestNativeAllocation.java (working copy) @@ -42,7 +42,7 @@ } catch (Throwable e) { System.out.println("FAILED"); } finally { - System.out.println("FAILED"); + System.out.print("PAS"); } } System.out.println("FAILED"); Index: trunk/vm/vmcore/src/exception/exceptions_jit.cpp =================================================================== --- trunk/vm/vmcore/src/exception/exceptions_jit.cpp (revision 489284) +++ trunk/vm/vmcore/src/exception/exceptions_jit.cpp (working copy) @@ -231,12 +231,10 @@ ti->vm_brpt->unlock(); } - // When VM is in shutdown stage we need to execute final block to + // When VM is in shutdown stage we need to execute "finally" clause to // release monitors and propogate an exception to the upper frames. - if (VM_Global_State::loader_env->IsVmShutdowning()) { - exn_class = VM_Global_State::loader_env->JavaLangObject_Class; - *exn_obj = NULL; - } + Class_Handle search_exn_class = !VM_Global_State::loader_env->IsVmShutdowning() + ? exn_class : VM_Global_State::loader_env->JavaLangObject_Class; bool same_frame = true; while (!si_is_past_end(si) && !si_is_native(si)) { @@ -260,7 +258,7 @@ if (!handler) continue; if (handler->is_in_range(ip, is_ip_past) - && handler->is_assignable(exn_class)) { + && handler->is_assignable(search_exn_class)) { // Found a handler that catches the exception. #ifdef VM_STATS cci->num_catches++; Index: trunk/vm/vmcore/src/init/vm_shutdown.cpp =================================================================== --- trunk/vm/vmcore/src/init/vm_shutdown.cpp (revision 489284) +++ trunk/vm/vmcore/src/init/vm_shutdown.cpp (working copy) @@ -113,75 +113,97 @@ //hythread_suspend_enable(); } -/* -void vm_shutdown_stop_java_threads(int exit_code) -{ - jthread current_java_thread; - JNIEnv_Internal * jni_env; - Global_Env * vm_env; - - // Current thread should be in suspend enabled state to prevent - // possible dead-locks. - assert(hythread_is_suspend_enabled()); - - current_java_thread = jthread_self(); - // Current thread should be attached to ThreadManager. - assert(current_java_thread); - jni_env = (JNIEnv_Internal *) jthread_get_JNI_env(current_java_thread); - vm_env = jni_env->vm->vm_env; - - // 2) Acquire VM state lock. - apr_thread_mutex_lock(vm_env->vm_state_mutex); - assert(vm_env->vm_state != Global_Env::VM_INITIALIZING); - - // 3) Check VM state. - if (vm_env->vm_state == Global_Env::VM_SHUTDOWNING) { - apr_thread_mutex_unlock(vm_env->vm_state_mutex); - return; +/** + * Stops running java threads by throwing an exception + * up to the first native frame. + * + * @param[in] vm_env a global VM environment + */ +static void vm_shutdown_stop_java_threads(Global_Env * vm_env) { + hythread_t self; + hythread_t * running_threads; + hythread_t native_thread; + hythread_iterator_t it; + VM_thread * vm_thread; + int size; + bool changed; + int left; + int prev; + + self = hythread_self(); + + // Collect running java threads. + size = 0; + it = hythread_iterator_create(NULL); + running_threads = (hythread_t *)apr_palloc(vm_env->mem_pool, + hythread_iterator_size(it) * sizeof(hythread_t)); + while(native_thread = hythread_iterator_next(&it)) { + vm_thread = get_vm_thread(native_thread); + if (vm_thread != NULL && native_thread != self) { + running_threads[size] = native_thread; + ++size; + } } + hythread_iterator_release(&it); - assert(vm_env->vm_state == Global_Env::VM_RUNNING); + // Interrupt running threads. + for (int i = 0; i < size; i++) { + hythread_interrupt(running_threads[i]); + } - // 4) Change VM state. Exception propagation mechanism should be changed - // upon setting up this flag. - vm_env->vm_state = Global_Env::VM_SHUTDOWNING; - - // 5) Block thread creation. - // TODO: investigate how to achive that with ThreadManager - - // 6) Execute shutdown callback for the current thread. - vm_shutdown_callback(NULL); - - // 7) Setup shutdown callback to all java threads but current. - // It causes an exception to be raised and all java monitors to - // be released upon reaching a safepoint. - hythread_group_set_suspend_disabled_callback(hythread_group_get_java(), vm_shutdown_callback, NULL); - - // 8) Unlock VM state mutex. - apr_thread_mutex_unlock(vm_env->vm_state_mutex); + left = size; + prev = -1; + // Spin until there is no running threads. + while (left > 0) { + do { + left = 0; + changed = false; + // Join or Interrupt. + for (int i = 0; i < size; i++) { + if (running_threads[i] == NULL) continue; + if (hythread_join_timed(running_threads[i], 100, 0) == TM_ERROR_NONE) { + changed = true; + running_threads[i] = NULL; + } else { + hythread_interrupt(running_threads[i]); + ++left; + } + } + } while(left > 0 && changed); + + // We are stuck :-( Need to throw asynchronous exception. + if (left > 0) { + for (int i = 0; i < size; i++) { + if (running_threads[i] == NULL) continue; + if (left > 1 && i == prev) { + continue; + } else { + prev = i; + hythread_set_safepoint_callback(running_threads[i], vm_shutdown_callback); + } + } + } + } } -*/ /** - * TODO: + * Waits until all non-daemon threads finish their execution, + * initiates VM shutdown sequence and stops running threads if any. + * + * @param[in] java_vm JVM that should be destroyed + * @param[in] java_thread current java thread */ jint vm_destroy(JavaVM_Internal * java_vm, jthread java_thread) { jint status; JNIEnv * jni_env; jobject uncaught_exception; - VM_thread * vm_thread; - hythread_t native_thread; - hythread_t self; - hythread_iterator_t it; - hythread_t * running_threads; - int size; assert(hythread_is_suspend_enabled()); jni_env = jthread_get_JNI_env(java_thread); - self = hythread_self(); + // Wait until all non-daemon threads finish their execution. status = jthread_wait_for_all_nondaemon_threads(); if (status != TM_ERROR_NONE) { TRACE("Failed to wait for all non-daemon threads completion."); @@ -233,30 +255,8 @@ // before destroying VM-wide data. // Stop java threads - size = 0; - it = hythread_iterator_create(NULL); - running_threads = (hythread_t *)apr_palloc( - java_vm->vm_env->mem_pool, hythread_iterator_size(it) * sizeof(hythread_t)); - while(native_thread = hythread_iterator_next(&it)) { - vm_thread = get_vm_thread(native_thread); - if (vm_thread != NULL && native_thread != self) { - running_threads[size] = native_thread; - ++size; - hythread_set_safepoint_callback(native_thread, vm_shutdown_callback); - } - } - hythread_iterator_release(&it); + vm_shutdown_stop_java_threads(java_vm->vm_env); - // Interrupt running threads. - for (int i = 0; i < size; i++) { - hythread_interrupt(running_threads[i]); - } - - // Wait for threads completion. - for (int i = 0; i < size; i++) { - hythread_join(running_threads[i]); - } - // TODO: ups we don't stop native threads as well :-(( // We are lucky! Currently, there are no such threads. Index: trunk/vm/vmcore/src/jni/jni.cpp =================================================================== --- trunk/vm/vmcore/src/jni/jni.cpp (revision 489284) +++ trunk/vm/vmcore/src/jni/jni.cpp (working copy) @@ -656,13 +656,12 @@ TRACE2("jni", "FindClass called, name = " << name); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (exn_raised() || vm_env->IsVmShutdowning()) return NULL; + + if (exn_raised()) return NULL; char *ch = strchr(name, '.'); if (NULL != ch) { - ThrowNew_Quick(jni_env, - VM_Global_State::loader_env->JavaLangNoClassDefFoundError_String->bytes, - name); + ThrowNew_Quick(jni_env, vm_env->JavaLangNoClassDefFoundError_String->bytes, name); return NULL; } @@ -676,8 +675,8 @@ TRACE2("jni", "GetSuperclass called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; + Class* clss = jclass_to_struct_Class(clazz); if(clss) { if(clss->is_interface()) { @@ -774,21 +773,12 @@ // chacks usage of this function and replace by lazy jthrowable JNICALL ExceptionOccurred(JNIEnv * jni_env) { + jthrowable result; + TRACE2("jni", "ExceptionOccurred called"); assert(hythread_is_suspend_enabled()); - - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) { - // Wait until shutdown exception is raised by callback. - while (!exn_raised()) { - // Switch enable/disable status to give a chance for - // callback execution. - hythread_suspend_disable(); - hythread_suspend_enable(); - hythread_yield(); - } - } - jthrowable result = exn_get(); + + result = exn_get(); #ifdef _DEBUG hythread_suspend_disable(); @@ -797,9 +787,6 @@ } else { TRACE2("jni", "Exception occured, no exception"); } - if (vm_env->IsVmShutdowning() && !result) { - TRACE2("vm.core.shutdown", "ExceptionOccured: shutdown exception hasn't been raised"); - } hythread_suspend_enable(); #endif @@ -810,9 +797,11 @@ { TRACE2("jni", "ExceptionDescribe called"); assert(hythread_is_suspend_enabled()); + // we should not report vm shutdown exception to the user Global_Env * vm_env = jni_get_vm_env(jni_env); if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) { exn_print_stack_trace(stderr, exn_get()); } @@ -862,8 +851,8 @@ TRACE2("jni", "NewGlobalRef called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning() || !obj) return NULL; + if (exn_raised() || !obj) return NULL; + if(!obj) { return 0; } @@ -905,7 +894,7 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning() || ref == NULL) return NULL; + if (exn_raised() || ref == NULL) return NULL; jobject new_ref = oh_copy_to_local_handle(ref); @@ -999,8 +988,7 @@ TRACE2("jni", "AllocObject called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning() || clazz == NULL) return NULL; + if (exn_raised() || clazz == NULL) return NULL; Class* clss = jclass_to_struct_Class(clazz); @@ -1140,8 +1128,7 @@ TRACE2("jni", "NewString called, length = " << length); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; return (jstring)string_create_from_unicode_h(unicodeChars, length); } //NewString @@ -1164,8 +1151,7 @@ TRACE2("jni", "GetStringChars called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (!string || vm_env->IsVmShutdowning()) return NULL; + if (!string || exn_raised()) return NULL; assert(check_is_jstring_class(string)); @@ -1195,8 +1181,7 @@ TRACE2("jni", "NewStringUTF called, bytes = " << bytes); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; return (jstring)string_create_from_utf8_h(bytes, (unsigned)strlen(bytes)); } //NewStringUTF @@ -1219,8 +1204,8 @@ TRACE2("jni", "GetStringUTFChars called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning() || !string) return NULL; + if (exn_raised() || !string) return NULL; + assert(check_is_jstring_class(string)); const char* res = string_get_utf8_chars_h((ObjectHandle)string); if (isCopy) *isCopy = JNI_TRUE; @@ -1247,8 +1232,7 @@ TRACE2("jni", "RegisterNatives called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return -1; + if (exn_raised()) return -1; Class_Handle clss = jclass_to_struct_Class(clazz); return class_register_methods(clss, methods, nMethods) ? -1 : 0; @@ -1267,8 +1251,7 @@ TRACE2("jni", "MonitorEnter called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return -1; + if (exn_raised()) return -1; jthread_monitor_enter(obj); return exn_raised() ? -1 : 0; @@ -1302,8 +1285,7 @@ TRACE2("jni", "GetStringRegion called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; assert(s); @@ -1400,9 +1382,7 @@ TRACE2("jni", "ExceptionCheck called, exception status = " << exn_raised()); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - - if (exn_raised() || vm_env->IsVmShutdowning()) + if (exn_raised()) return JNI_TRUE; else return JNI_FALSE; @@ -1432,6 +1412,7 @@ { TRACE2("jni", "FromReflectedField called"); Class* clss = jobject_to_struct_Class(field); + Global_Env * vm_env = jni_get_vm_env(jni_env); if (clss == vm_env->java_lang_reflect_Field_Class) @@ -1447,10 +1428,9 @@ { TRACE2("jni", "ToReflectedMethod called"); - Global_Env * vm_env = jni_get_vm_env(jni_env); Method *m = (Method*)methodID; // True if flags are different - if ((bool)m->is_static() != (bool)isStatic || vm_env->IsVmShutdowning()) + if ((bool)m->is_static() != (bool)isStatic || exn_raised()) return NULL; if (m->is_init()) @@ -1464,9 +1444,8 @@ { TRACE2("jni", "ToReflectedField called"); - Global_Env * vm_env = jni_get_vm_env(jni_env); Field *f = (Field*)fieldID; - if ((bool)f->is_static() != (bool)isStatic || vm_env->IsVmShutdowning()) // True if flags are different + if ((bool)f->is_static() != (bool)isStatic || exn_raised()) // True if flags are different return NULL; return reflection_reflect_field(jni_env, fieldID); Index: trunk/vm/vmcore/src/jni/jni_array.cpp =================================================================== --- trunk/vm/vmcore/src/jni/jni_array.cpp (revision 489284) +++ trunk/vm/vmcore/src/jni/jni_array.cpp (working copy) @@ -63,7 +63,7 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; ObjectHandle elem_handle = (ObjectHandle)initialElement; @@ -89,7 +89,7 @@ return NULL; } - tmn_suspend_disable(); //---------------------------------v + tmn_suspend_disable(); //---------------------------------v Vector_Handle vector = vm_new_vector(arr_clss, length); @@ -109,7 +109,6 @@ // only if the elem is non-null. if (elem != NULL) { ManagedObject **elems = (ManagedObject **)get_vector_element_address_ref(vector, 0); - Global_Env * vm_env = VM_Global_State::loader_env; if (vm_env->compress_references) { COMPRESSED_REFERENCE elem_offset = compress_reference((ManagedObject *)elem); COMPRESSED_REFERENCE *compressed_elems = (COMPRESSED_REFERENCE *)elems; @@ -138,8 +137,7 @@ assert(hythread_is_suspend_enabled()); assert(array); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; jsize length = GetArrayLength(jni_env, array); if ((index < 0) || (index >= length)) { @@ -177,8 +175,7 @@ assert(hythread_is_suspend_enabled()); assert(array); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; jsize length = GetArrayLength(jni_env, array); if ((index < 0) || (index >= length)) { @@ -235,7 +232,7 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; Class *clss = vm_env->ArrayOfBoolean_Class; unsigned sz = clss->calculate_array_size(length); @@ -270,9 +267,9 @@ { TRACE2("jni", "NewByteArray called"); assert(hythread_is_suspend_enabled()); - + Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; Class *clss = vm_env->ArrayOfByte_Class; unsigned sz = clss->calculate_array_size(length); @@ -309,7 +306,7 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; Class *clss = vm_env->ArrayOfChar_Class; unsigned sz = clss->calculate_array_size(length); @@ -346,7 +343,7 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; Class *clss = vm_env->ArrayOfShort_Class; unsigned sz = clss->calculate_array_size(length); @@ -382,9 +379,9 @@ { TRACE2("jni", "NewIntArray called"); assert(hythread_is_suspend_enabled()); - + Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; Class *clss = vm_env->ArrayOfInt_Class; unsigned sz = clss->calculate_array_size(length); @@ -421,7 +418,7 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; Class *clss = vm_env->ArrayOfLong_Class; unsigned sz = clss->calculate_array_size(length); @@ -458,7 +455,7 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; Class *clss = vm_env->ArrayOfFloat_Class; unsigned sz = clss->calculate_array_size(length); @@ -495,7 +492,7 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; Class *clss = vm_env->ArrayOfDouble_Class; unsigned sz = clss->calculate_array_size(length); @@ -539,10 +536,9 @@ jboolean *isCopy) { TRACE2("jni", "GetBooleanArrayElements called"); - assert(hythread_is_suspend_enabled()); + assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; ObjectHandle h = (ObjectHandle)array; @@ -584,10 +580,9 @@ { TRACE2("jni", "GetByteArrayElements called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return NULL; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; - ObjectHandle h = (ObjectHandle)array; tmn_suspend_disable(); //---------------------------------v @@ -629,8 +624,7 @@ TRACE2("jni", "GetCharArrayElements called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; ObjectHandle h = (ObjectHandle)array; @@ -672,10 +666,9 @@ { TRACE2("jni", "GetShortArrayElements called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return NULL; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; - ObjectHandle h = (ObjectHandle)array; tmn_suspend_disable(); //---------------------------------v @@ -716,10 +709,9 @@ { TRACE2("jni", "GetIntArrayElements called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return NULL; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; - ObjectHandle h = (ObjectHandle)array; tmn_suspend_disable(); //---------------------------------v @@ -761,10 +753,9 @@ { TRACE2("jni", "GetLongArrayElements called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return NULL; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; - ObjectHandle h = (ObjectHandle)array; tmn_suspend_disable(); //---------------------------------v @@ -805,10 +796,9 @@ { TRACE2("jni", "GetFloatArrayElements called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return NULL; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; - ObjectHandle h = (ObjectHandle)array; tmn_suspend_disable(); //---------------------------------v @@ -850,10 +840,9 @@ { TRACE2("jni", "GetDoubleArrayElements called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return NULL; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; - ObjectHandle h = (ObjectHandle)array; tmn_suspend_disable(); //---------------------------------v @@ -1345,10 +1334,9 @@ jboolean *buf) { TRACE2("jni", "GetBooleanArrayRegion called"); - assert(hythread_is_suspend_enabled()); + assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; jsize length = GetArrayLength(jni_env, array); jsize end = start + len; @@ -1379,10 +1367,9 @@ { TRACE2("jni", "GetByteArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1412,10 +1399,9 @@ { TRACE2("jni", "GetCharArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1445,10 +1431,9 @@ { TRACE2("jni", "GetShortArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1478,10 +1463,9 @@ { TRACE2("jni", "GetIntArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1511,10 +1495,9 @@ { TRACE2("jni", "GetLongArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1544,10 +1527,9 @@ { TRACE2("jni", "GetFloatArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1577,10 +1559,9 @@ { TRACE2("jni", "GetDoubleArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1618,10 +1599,9 @@ { TRACE2("jni", "SetBooleanArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1653,10 +1633,9 @@ { TRACE2("jni", "SetByteArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1688,10 +1667,9 @@ { TRACE2("jni", "SetCharArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1723,10 +1701,9 @@ { TRACE2("jni", "SetShortArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1758,10 +1735,9 @@ { TRACE2("jni", "SetIntArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1793,10 +1769,9 @@ { TRACE2("jni", "SetLongArrayRegion called"); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - jsize length = GetArrayLength(jni_env, array); jsize end = start + len; if(start < 0 || len < 0 || end > length) { @@ -1829,8 +1804,7 @@ TRACE2("jni", "SetFloatArrayRegion called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; jsize length = GetArrayLength(jni_env, array); jsize end = start + len; @@ -1864,8 +1838,7 @@ TRACE2("jni", "SetDoubleArrayRegion called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; jsize length = GetArrayLength(jni_env, array); jsize end = start + len; Index: trunk/vm/vmcore/src/jni/jni_field.cpp =================================================================== --- trunk/vm/vmcore/src/jni/jni_field.cpp (revision 489284) +++ trunk/vm/vmcore/src/jni/jni_field.cpp (working copy) @@ -45,8 +45,7 @@ TRACE2("jni", "GetFieldID called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; Class* clss = jclass_to_struct_Class(clazz); Field *field = class_lookup_field_recursive(clss, name, sig); @@ -73,12 +72,12 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; - String *class_string = VM_Global_State::loader_env->string_pool.lookup(class_name); + String *class_string = vm_env->string_pool.lookup(class_name); assert(hythread_is_suspend_enabled()); Class *clss = - class_load_verify_prepare_from_jni(VM_Global_State::loader_env, class_string); + class_load_verify_prepare_from_jni(vm_env, class_string); if(!clss) { return 0; } @@ -94,8 +93,7 @@ TRACE2("jni", "GetStaticFieldID called"); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; Class* clss = jclass_to_struct_Class(clazz); Field *field = class_lookup_field_recursive(clss, name, sig); @@ -120,8 +118,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; tmn_suspend_disable(); //---------------------------------v @@ -161,8 +158,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; tmn_suspend_disable(); //---------------------------------v @@ -194,8 +190,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; tmn_suspend_disable(); //---------------------------------v @@ -229,8 +224,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; tmn_suspend_disable(); //---------------------------------v @@ -264,8 +258,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; tmn_suspend_disable(); //---------------------------------v @@ -299,8 +292,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; tmn_suspend_disable(); //---------------------------------v @@ -334,8 +326,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; tmn_suspend_disable(); //---------------------------------v @@ -369,8 +360,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; tmn_suspend_disable(); //---------------------------------v @@ -404,8 +394,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; tmn_suspend_disable(); //---------------------------------v @@ -450,8 +439,7 @@ ObjectHandle h = (ObjectHandle)obj; ObjectHandle v = (ObjectHandle)value; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; tmn_suspend_disable(); //---------------------------------v @@ -493,8 +481,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; tmn_suspend_disable(); //---------------------------------v @@ -526,7 +513,7 @@ ObjectHandle h = (ObjectHandle)obj; Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; tmn_suspend_disable(); //---------------------------------v @@ -562,8 +549,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; tmn_suspend_disable(); //---------------------------------v @@ -597,7 +583,7 @@ ObjectHandle h = (ObjectHandle)obj; Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; tmn_suspend_disable(); //---------------------------------v @@ -633,8 +619,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; tmn_suspend_disable(); //---------------------------------v @@ -667,8 +652,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; tmn_suspend_disable(); //---------------------------------v @@ -700,8 +684,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; tmn_suspend_disable(); //---------------------------------v @@ -734,8 +717,7 @@ assert(hythread_is_suspend_enabled()); ObjectHandle h = (ObjectHandle)obj; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; tmn_suspend_disable(); //---------------------------------v @@ -783,8 +765,7 @@ TRACE2("jni", "GetStaticObjectField called, id = " << fieldID); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + if (exn_raised()) return NULL; Field *f = (Field *)fieldID; assert(f); @@ -815,8 +796,7 @@ TRACE2("jni", "GetStaticBooleanField called, id = " << fieldID); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; Field *f = (Field *)fieldID; assert(f); @@ -833,8 +813,7 @@ TRACE2("jni", "GetStaticByteField called, id = " << fieldID); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; Field *f = (Field *)fieldID; assert(f); @@ -851,8 +830,7 @@ TRACE2("jni", "GetStaticCharField called, id = " << fieldID); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; Field *f = (Field *)fieldID; assert(f); @@ -869,8 +847,7 @@ TRACE2("jni", "GetStaticShortField called, id = " << fieldID); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; Field *f = (Field *)fieldID; assert(f); @@ -887,8 +864,7 @@ TRACE2("jni", "GetStaticIntField called, id = " << fieldID); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; Field *f = (Field *)fieldID; assert(f); @@ -905,8 +881,7 @@ TRACE2("jni", "GetStaticLongField called, id = " << fieldID); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; Field *f = (Field *)fieldID; assert(f); @@ -923,8 +898,7 @@ TRACE2("jni", "GetStaticFloatField called, id = " << fieldID); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; Field *f = (Field *)fieldID; assert(f); @@ -941,8 +915,7 @@ TRACE2("jni", "GetStaticDoubleField called, id = " << fieldID); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + if (exn_raised()) return 0; Field *f = (Field *)fieldID; assert(f); @@ -972,8 +945,7 @@ TRACE2("jni", "SetStaticObjectField called, id = " << fieldID); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; Field *f = (Field *)fieldID; assert(f); @@ -1002,8 +974,7 @@ TRACE2("jni", "SetStaticBooleanField called, id = " << fieldID << " value = " << value); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; Field *f = (Field *)fieldID; assert(f); @@ -1023,7 +994,7 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; Field *f = (Field *)fieldID; assert(f); @@ -1046,8 +1017,7 @@ TRACE2("jni", "SetStaticCharField called, id = " << fieldID << " value = " << value); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; Field *f = (Field *)fieldID; assert(f); @@ -1067,7 +1037,7 @@ assert(hythread_is_suspend_enabled()); Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; Field *f = (Field *)fieldID; assert(f); @@ -1090,8 +1060,7 @@ TRACE2("jni", "SetStaticIntField called, id = " << fieldID << " value = " << value); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; Field *f = (Field *)fieldID; assert(f); @@ -1111,8 +1080,7 @@ TRACE2("jni", "SetStaticLongField called, id = " << fieldID << " value = " << value); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; Field *f = (Field *)fieldID; assert(f); @@ -1131,8 +1099,7 @@ TRACE2("jni", "SetStaticFloatField called, id = " << fieldID << " value = " << value); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; Field *f = (Field *)fieldID; assert(f); @@ -1151,8 +1118,7 @@ TRACE2("jni", "SetStaticDoubleField called, id = " << fieldID << " value = " << value); assert(hythread_is_suspend_enabled()); - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; + if (exn_raised()) return; Field *f = (Field *)fieldID; assert(f); Index: trunk/vm/vmcore/src/jni/jni_method.cpp =================================================================== --- trunk/vm/vmcore/src/jni/jni_method.cpp (revision 489284) +++ trunk/vm/vmcore/src/jni/jni_method.cpp (working copy) @@ -65,10 +65,9 @@ TRACE2("jni", "GetMethodID called: " << name << descr); assert(hythread_is_suspend_enabled()); assert(clazz); + + if (exn_raised()) return NULL; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; - Class* clss = jclass_to_struct_Class(clazz); Method *method; if ('<' == *name) { @@ -102,9 +101,8 @@ TRACE2("jni", "GetStaticMethodID called: " << name << descr); assert(hythread_is_suspend_enabled()); Class* clss = jclass_to_struct_Class(clazz); - - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; + + if (exn_raised()) return NULL; Method *method; if ('<' == *name) { @@ -222,10 +220,9 @@ { TRACE2("jni", "CallVoidMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - call_method_no_ref_result(jni_env, obj, methodID, args, 0, FALSE); } //CallVoidMethodA @@ -261,10 +258,9 @@ { TRACE2("jni", "CallObjectMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return NULL; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; - jvalue result; Method *method = (Method *)methodID; // resolve to actual vtable entry below @@ -331,9 +327,8 @@ { TRACE2("jni", "CallBooleanMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); - - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; + + if (exn_raised()) return 0; jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE); @@ -372,10 +367,9 @@ { TRACE2("jni", "CallByteMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE); return result.b; @@ -414,10 +408,9 @@ { TRACE2("jni", "CallCharMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE); return result.c; @@ -456,10 +449,9 @@ { TRACE2("jni", "CallShortMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE); return result.s; @@ -498,10 +490,9 @@ { TRACE2("jni", "CallIntMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE); return result.i; @@ -540,10 +531,9 @@ { TRACE2("jni", "CallLongMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE); return result.j; @@ -582,10 +572,9 @@ { TRACE2("jni", "CallFloatMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE); return result.f; @@ -624,10 +613,9 @@ { TRACE2("jni", "CallDoubleMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, FALSE); return result.d; @@ -683,10 +671,9 @@ { TRACE2("jni", "CallNonvirtualVoidMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - call_method_no_ref_result(jni_env, obj, methodID, args, 0, TRUE); } //CallNonvirtualVoidMethodA @@ -731,10 +718,9 @@ { TRACE2("jni", "CallNonvirtualObjectMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return NULL; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; - jvalue result; Method *method = (Method *)methodID; if (!ensure_initialised(jni_env, method->get_class())) @@ -793,10 +779,9 @@ { TRACE2("jni", "CallNonvirtualBooleanMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE); return result.z; @@ -843,10 +828,9 @@ { TRACE2("jni", "CallNonvirtualByteMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE); return result.b; @@ -893,10 +877,9 @@ { TRACE2("jni", "CallNonvirtualCharMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE); return result.c; @@ -943,10 +926,9 @@ { TRACE2("jni", "CallNonvirtualShortMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE); return result.s; @@ -993,10 +975,9 @@ { TRACE2("jni", "CallNonvirtualIntMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE); return result.i; @@ -1043,10 +1024,9 @@ { TRACE2("jni", "CallNonvirtualLongMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE); return result.j; @@ -1093,10 +1073,9 @@ { TRACE2("jni", "CallNonvirtualFloatMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE); return result.f; @@ -1143,10 +1122,9 @@ { TRACE2("jni", "CallNonvirtualDoubleMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_method_no_ref_result(jni_env, obj, methodID, args, &result, TRUE); return result.d; @@ -1210,10 +1188,9 @@ { TRACE2("jni", "CallStaticObjectMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return NULL; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return NULL; - jvalue result; Method *method = (Method *)methodID; if (!ensure_initialised(jni_env, method->get_class())) @@ -1261,10 +1238,9 @@ { TRACE2("jni", "CallStaticBooleanMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result); return result.z; @@ -1302,10 +1278,9 @@ { TRACE2("jni", "CallStaticByteMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result); return result.b; @@ -1343,10 +1318,9 @@ { TRACE2("jni", "CallStaticCharMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result); return result.c; @@ -1384,10 +1358,9 @@ { TRACE2("jni", "CallStaticShortMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result); return result.s; @@ -1425,10 +1398,9 @@ { TRACE2("jni", "CallStaticIntMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result); return result.i; @@ -1466,10 +1438,9 @@ { TRACE2("jni", "CallStaticLongMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result); return result.j; @@ -1507,10 +1478,9 @@ { TRACE2("jni", "CallStaticFloatMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result); return result.f; @@ -1548,10 +1518,9 @@ { TRACE2("jni", "CallStaticDoubleMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return 0; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return 0; - jvalue result; call_static_method_no_ref_result(jni_env, clazz, methodID, args, &result); return result.d; @@ -1588,10 +1557,9 @@ { TRACE2("jni", "CallStaticVoidMethodA called, id = " << methodID); assert(hythread_is_suspend_enabled()); + + if (exn_raised()) return; - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (vm_env->IsVmShutdowning()) return; - call_static_method_no_ref_result(jni_env, clazz, methodID, args, 0); } //CallStaticVoidMethodA Index: trunk/vm/vmcore/src/thread/thread_generic.cpp =================================================================== --- trunk/vm/vmcore/src/thread/thread_generic.cpp (revision 489284) +++ trunk/vm/vmcore/src/thread/thread_generic.cpp (working copy) @@ -126,7 +126,11 @@ // Initialize arguments. args[0].l = java_thread; - args[1].l = exn_get(); + if (vm_env->IsVmShutdowning()) { + args[1].l = NULL; + } else { + args[1].l = exn_get(); + } exn_clear(); hythread_suspend_disable();