You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2008/03/31 11:20:40 UTC

svn commit: r642935 - in /harmony/enhanced/drlvm/trunk/vm/port/src: crash_handler/include/stack_dump.h crash_handler/port_crash_handler.cpp signals/linux/signals_common.cpp signals/linux/signals_ipf.cpp signals/win/signals_common.cpp

Author: gshimansky
Date: Mon Mar 31 02:20:38 2008
New Revision: 642935

URL: http://svn.apache.org/viewvc?rev=642935&view=rev
Log:
Applied patch from HARMONY-5663
[drlvm][port][signals] Crash handler should not change a behavior of signals not requested by the VM


Modified:
    harmony/enhanced/drlvm/trunk/vm/port/src/crash_handler/include/stack_dump.h
    harmony/enhanced/drlvm/trunk/vm/port/src/crash_handler/port_crash_handler.cpp
    harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_common.cpp
    harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_ipf.cpp
    harmony/enhanced/drlvm/trunk/vm/port/src/signals/win/signals_common.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/crash_handler/include/stack_dump.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/crash_handler/include/stack_dump.h?rev=642935&r1=642934&r2=642935&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/crash_handler/include/stack_dump.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/crash_handler/include/stack_dump.h Mon Mar 31 02:20:38 2008
@@ -65,6 +65,10 @@
 void create_minidump(LPEXCEPTION_POINTERS exp);
 #endif
 
+
+Boolean sd_is_handler_registered(port_sigtype signum);
+
+
 #ifdef __cplusplus
 }
 #endif

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/crash_handler/port_crash_handler.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/crash_handler/port_crash_handler.cpp?rev=642935&r1=642934&r2=642935&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/crash_handler/port_crash_handler.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/crash_handler/port_crash_handler.cpp Mon Mar 31 02:20:38 2008
@@ -23,7 +23,7 @@
 #include "signals_internal.h"
 #include "port_crash_handler.h"
 
-static port_signal_handler signal_callbacks[] =
+port_signal_handler signal_callbacks[] =
 {
     NULL, // PORT_SIGNAL_GPF
     NULL, // PORT_SIGNAL_STACK_OVERFLOW
@@ -55,16 +55,12 @@
     unsigned count,
     port_unwind_compiled_frame unwind_callback)
 {
-    if (initialize_signals() != 0)
+    if (port_mutex_create(&g_mutex, APR_THREAD_MUTEX_NESTED) != APR_SUCCESS)
         return FALSE;
 
 	if (init_private_tls_data() != 0)
 	    return FALSE;
 
-    port_mutex_create(&g_mutex, APR_THREAD_MUTEX_NESTED);
-
-    sd_init_crash_handler();
-
     for (unsigned iii = 0; iii < count; iii++)
     {
         assert(registrations[iii].signum >= PORT_SIGNAL_MIN);
@@ -72,6 +68,12 @@
         signal_callbacks[registrations[iii].signum] = registrations[iii].callback;
     }
 
+    // initialize_signals needs to know what handlers are registered
+    if (initialize_signals() != 0)
+        return FALSE;
+
+    sd_init_crash_handler();
+
     g_unwind_callback = unwind_callback;
 
     // Set default flags
@@ -158,12 +160,14 @@
 {
     if (!iscrash)
     {
-        assert(signum >= PORT_SIGNAL_MIN);
-        assert(signum <= PORT_SIGNAL_MAX);
+        if (signum < PORT_SIGNAL_MIN ||
+            signum > PORT_SIGNAL_MAX)
+            return 0;
 
         if (signal_callbacks[signum] != NULL)
         {
-            Boolean cres = signal_callbacks[signum](signum, regs, fault_addr);
+            Boolean cres =
+                signal_callbacks[signum](signum, regs, fault_addr);
 
             if (cres) // signal was processed
                 return 0;
@@ -188,4 +192,9 @@
     }
 
     return -1;
+}
+
+Boolean sd_is_handler_registered(port_sigtype signum)
+{
+    return signal_callbacks[signum] != NULL;
 }

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_common.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_common.cpp?rev=642935&r1=642934&r2=642935&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_common.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_common.cpp Mon Mar 31 02:20:38 2008
@@ -187,18 +187,19 @@
 struct sig_reg
 {
     int signal;
+    port_sigtype port_sig;
     int flags;
     bool set_up;
 };
 
 static sig_reg signals_used[] =
 {
-    { SIGTRAP, SA_SIGINFO, false },
-    { SIGSEGV, SA_SIGINFO | SA_ONSTACK, false },
-    { SIGFPE,  SA_SIGINFO, false },
-    { SIGINT,  SA_SIGINFO, false },
-    { SIGQUIT, SA_SIGINFO, false },
-    { SIGABRT, SA_SIGINFO, false }
+    { SIGTRAP, PORT_SIGNAL_BREAKPOINT, SA_SIGINFO, false },
+    { SIGSEGV, PORT_SIGNAL_GPF,        SA_SIGINFO | SA_ONSTACK, false },
+    { SIGFPE,  PORT_SIGNAL_ARITHMETIC, SA_SIGINFO, false },
+    { SIGINT,  PORT_SIGNAL_CTRL_C,     SA_SIGINFO, false },
+    { SIGQUIT, PORT_SIGNAL_QUIT,       SA_SIGINFO, false },
+    { SIGABRT, PORT_SIGNAL_ABORT,      SA_SIGINFO, false }
 };
 
 static struct sigaction old_actions[sizeof(signals_used)/sizeof(signals_used[0])];
@@ -222,6 +223,9 @@
 
     for (size_t i = 0; i < sizeof(signals_used)/sizeof(signals_used[0]); i++)
     {
+        if (!sd_is_handler_registered(signals_used[i].port_sig))
+            continue;
+
         sigemptyset(&sa.sa_mask);
         sa.sa_flags = signals_used[i].flags;
         sa.sa_sigaction = &general_signal_handler;
@@ -231,6 +235,8 @@
             restore_signals();
             return -1;
         }
+
+        signals_used[i].set_up = true;
     }
 
     // Prepare gdb crash handler

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_ipf.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_ipf.cpp?rev=642935&r1=642934&r2=642935&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_ipf.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/signals/linux/signals_ipf.cpp Mon Mar 31 02:20:38 2008
@@ -118,18 +118,19 @@
 struct sig_reg
 {
     int signal;
+    port_sigtype port_sig;
     int flags;
     bool set_up;
 };
 
 static sig_reg signals_used[] =
 {
-    { SIGTRAP, SA_SIGINFO, false },
-    { SIGSEGV, SA_SIGINFO | SA_ONSTACK, false },
-    { SIGFPE,  SA_SIGINFO, false },
-    { SIGINT,  SA_SIGINFO, false },
-    { SIGQUIT, SA_SIGINFO, false },
-    { SIGABRT, SA_SIGINFO, false }
+    { SIGTRAP, PORT_SIGNAL_BREAKPOINT, SA_SIGINFO, false },
+    { SIGSEGV, PORT_SIGNAL_GPF,        SA_SIGINFO | SA_ONSTACK, false },
+    { SIGFPE,  PORT_SIGNAL_ARITHMETIC, SA_SIGINFO, false },
+    { SIGINT,  PORT_SIGNAL_CTRL_C,     SA_SIGINFO, false },
+    { SIGQUIT, PORT_SIGNAL_QUIT,       SA_SIGINFO, false },
+    { SIGABRT, PORT_SIGNAL_ABORT,      SA_SIGINFO, false }
 };
 
 static struct sigaction old_actions[sizeof(signals_used)/sizeof(signals_used[0])];
@@ -153,6 +154,9 @@
 
     for (size_t i = 0; i < sizeof(signals_used)/sizeof(signals_used[0]); i++)
     {
+        if (!sd_is_handler_registered(signals_used[i].port_sig))
+            continue;
+
         sigemptyset(&sa.sa_mask);
         sa.sa_flags = signals_used[i].flags;
         sa.sa_sigaction = &general_signal_handler;
@@ -162,6 +166,8 @@
             restore_signals();
             return -1;
         }
+
+        signals_used[i].set_up = true;
     }
 
     // Prepare gdb crash handler

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/signals/win/signals_common.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/signals/win/signals_common.cpp?rev=642935&r1=642934&r2=642935&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/signals/win/signals_common.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/signals/win/signals_common.cpp Mon Mar 31 02:20:38 2008
@@ -164,13 +164,24 @@
     switch (nt_exception->ExceptionRecord->ExceptionCode)
     {
     case STATUS_STACK_OVERFLOW:
+        if (!sd_is_handler_registered(PORT_SIGNAL_STACK_OVERFLOW))
+            return EXCEPTION_CONTINUE_SEARCH;
+        break;
     case STATUS_ACCESS_VIOLATION:
+        if (!sd_is_handler_registered(PORT_SIGNAL_GPF))
+            return EXCEPTION_CONTINUE_SEARCH;
+        break;
     case JVMTI_EXCEPTION_STATUS:
+        if (!sd_is_handler_registered(PORT_SIGNAL_BREAKPOINT))
+            return EXCEPTION_CONTINUE_SEARCH;
+        break;
     case STATUS_INTEGER_DIVIDE_BY_ZERO:
     case EXCEPTION_FLT_DIVIDE_BY_ZERO:
     case EXCEPTION_FLT_OVERFLOW:
     case EXCEPTION_FLT_UNDERFLOW:
     case EXCEPTION_INT_OVERFLOW:
+        if (!sd_is_handler_registered(PORT_SIGNAL_ARITHMETIC))
+            return EXCEPTION_CONTINUE_SEARCH;
         break;
     default:
         return EXCEPTION_CONTINUE_SEARCH;
@@ -194,6 +205,9 @@
     switch (ctrlType)
     {
     case CTRL_BREAK_EVENT:
+        if (!sd_is_handler_registered(PORT_SIGNAL_CTRL_BREAK))
+            return FALSE;
+
         result = port_process_signal(PORT_SIGNAL_CTRL_BREAK, NULL, NULL, FALSE);
         if (result == 0)
             return TRUE;
@@ -204,6 +218,9 @@
     case CTRL_CLOSE_EVENT:
     case CTRL_LOGOFF_EVENT:
     case CTRL_SHUTDOWN_EVENT:
+        if (!sd_is_handler_registered(PORT_SIGNAL_CTRL_C))
+            return FALSE;
+
         result = port_process_signal(PORT_SIGNAL_CTRL_C, NULL, NULL, FALSE);
         if (result == 0)
             return TRUE;