From nobody Mon Sep 17 00:00:00 2001 From: Pavel Afremov Date: Wed, 4 Apr 2007 10:49:45 +0400 Subject: [PATCH] Fix up a bug of 128 error code on Windows x86-64. Patch contains: • Add check on the null into get_vm_thread_fast_self. • Add support of signals shutdown processing for Windows platforms. • Add empty stub of signals shutdown for all Linux platforms. --- vm/vmcore/include/vm_threads.h | 2 +- vm/vmcore/src/init/vm_shutdown.cpp | 4 ++++ vm/vmcore/src/util/linux/signals_em64t.cpp | 4 ++++ vm/vmcore/src/util/linux/signals_ia32.cpp | 4 ++++ vm/vmcore/src/util/linux/signals_ipf.cpp | 4 +++- vm/vmcore/src/util/win/nt_platform_utils.cpp | 14 +++++++++++--- 6 files changed, 27 insertions(+), 5 deletions(-) b92c7684d0331f2f686f67bec8339b86a4e1edbc diff --git a/vm/vmcore/include/vm_threads.h b/vm/vmcore/include/vm_threads.h index a35f6e9..96ddd42 100644 --- a/vm/vmcore/include/vm_threads.h +++ b/vm/vmcore/include/vm_threads.h @@ -180,7 +180,7 @@ VMEXPORT extern vm_thread_accessor *get_ inline VM_thread *get_vm_thread_fast_self() { register hythread_t thr = hythread_self(); - return (VM_thread *)hythread_tls_get(thr, TM_THREAD_VM_TLS_KEY); + return thr ? ((VM_thread *)hythread_tls_get(thr, TM_THREAD_VM_TLS_KEY)) : NULL; } inline VM_thread *get_vm_thread(hythread_t thr) { diff --git a/vm/vmcore/src/init/vm_shutdown.cpp b/vm/vmcore/src/init/vm_shutdown.cpp index 3edee4f..c2b8b72 100644 --- a/vm/vmcore/src/init/vm_shutdown.cpp +++ b/vm/vmcore/src/init/vm_shutdown.cpp @@ -206,6 +206,10 @@ #endif status = jthread_detach(java_thread); if (status != TM_ERROR_NONE) return JNI_ERR; + // Shitdown signals + extern void shutdown_signals(); + shutdown_signals(); + // Call Agent_OnUnload() for agents and unload agents. java_vm->vm_env->TI->Shutdown(java_vm); diff --git a/vm/vmcore/src/util/linux/signals_em64t.cpp b/vm/vmcore/src/util/linux/signals_em64t.cpp index f15cf70..e253bcf 100644 --- a/vm/vmcore/src/util/linux/signals_em64t.cpp +++ b/vm/vmcore/src/util/linux/signals_em64t.cpp @@ -579,3 +579,7 @@ void initialize_signals() get_executable_name(executable, sizeof(executable)); } //initialize_signals + +void shutdown_signals() { + //FIXME: should be defined in future +} //shutdown_signals \ No newline at end of file diff --git a/vm/vmcore/src/util/linux/signals_ia32.cpp b/vm/vmcore/src/util/linux/signals_ia32.cpp index 02083e3..4ea14db 100644 --- a/vm/vmcore/src/util/linux/signals_ia32.cpp +++ b/vm/vmcore/src/util/linux/signals_ia32.cpp @@ -786,3 +786,7 @@ void initialize_signals() } } //initialize_signals + +void shutdown_signals() { + //FIXME: should be defined in future +} //shutdown_signals \ No newline at end of file diff --git a/vm/vmcore/src/util/linux/signals_ipf.cpp b/vm/vmcore/src/util/linux/signals_ipf.cpp index b978da5..e174d8c 100644 --- a/vm/vmcore/src/util/linux/signals_ipf.cpp +++ b/vm/vmcore/src/util/linux/signals_ipf.cpp @@ -427,7 +427,9 @@ void initialize_signals() { } } //initialize_signals - +void shutdown_signals() { + //FIXME: should be defined in future +} //shutdown_signals #if 0 diff --git a/vm/vmcore/src/util/win/nt_platform_utils.cpp b/vm/vmcore/src/util/win/nt_platform_utils.cpp index fd7c65f..34ce896 100644 --- a/vm/vmcore/src/util/win/nt_platform_utils.cpp +++ b/vm/vmcore/src/util/win/nt_platform_utils.cpp @@ -52,6 +52,8 @@ BOOL ctrl_handler(DWORD ctrlType) return FALSE; } +static PVOID veh = NULL; + void initialize_signals(){ TRACE2("signals", "Setting console control handle..."); BOOL ok = SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ctrl_handler, TRUE); @@ -59,11 +61,17 @@ void initialize_signals(){ // add VEH to catch NPE's from bytecode TRACE2("signals", "Adding vectored exception handler..."); - PVOID res; - res = AddVectoredExceptionHandler(0, vectored_exception_handler); - assert(res); + veh = AddVectoredExceptionHandler(0, vectored_exception_handler); + assert(veh); } +void shutdown_signals() { + TRACE2("signals", "Removing vectored exception handler..."); + ULONG res; + res = RemoveVectoredExceptionHandler(veh); + assert(res); +} //shutdown_signals + //The following is for socket error handling const char *sock_errstr[] = { NULL, /* 10000 WSABASEERR */ -- 1.3.3