Author: mturk Date: Tue Apr 12 18:33:14 2011 New Revision: 1091533 URL: http://svn.apache.org/viewvc?rev=1091533&view=rev Log: Axe signaling for unix platforms. JVM requires libjsig.so to be preloaded if standard mechanism is used
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr/jniapi.h commons/sandbox/runtime/trunk/src/main/native/include/acr/misc.h commons/sandbox/runtime/trunk/src/main/native/os/unix/init.c commons/sandbox/runtime/trunk/src/main/native/shared/native.c Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr/jniapi.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr/jniapi.h?rev=1091533&r1=1091532&r2=1091533&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/acr/jniapi.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/acr/jniapi.h Tue Apr 12 18:33:14 2011 @@ -30,9 +30,6 @@ typedef struct acr_exc_t int line; int code; int init; -#if !defined(WINDOWS) - sigjmp_buf jump; -#endif } acr_exc_t; /** @@ -49,9 +46,8 @@ typedef struct acr_tlsd_t { acr_tls_destructor_t dtor; } acr_tlsd_t; -#if HAVE_THREAD_LOCAL -extern ACR_THREAD acr_exc_t acr_exception_frame; #if defined(WINDOWS) +extern ACR_THREAD acr_exc_t acr_exception_frame; /* Use Microsoft Structured Exception Handling wrapper * The _set_se_translator is used to call the AcrExceptionHandler. * This requires the /EHa exception model to be used @@ -68,24 +64,6 @@ extern ACR_THREAD acr_exc_t acr_exce #define __SEH_CATCH \ catch(...) -#else -/* Use exception_frame to save per-thread jmp_buf - * Signal handler routine will jump into the __SEH_CATCH block - * with code set to signal number - */ -#define __SEH_TRY \ - acr_exception_frame.file = __FILE__; \ - acr_exception_frame.line = __LINE__; \ - acr_exception_frame.func = __REAL_FUNCSIG__; \ - acr_exception_frame.desc = 0; \ - acr_exception_frame.code = 0; \ - acr_exception_frame.init = 1; \ - if (sigsetjmp(acr_exception_frame.jump, 1) == 0) - -#define __SEH_CATCH \ - else - -#endif #else /* HAVE_THREAD_LOCAL */ #define __SEH_TRY #define __SEH_CATCH if (0) @@ -98,8 +76,6 @@ extern "C" { /* Called by a signal handler */ #if defined(WINDOWS) void AcrExceptionHandler(unsigned int, struct _EXCEPTION_POINTERS *); -#else -void AcrExceptionHandler(int); #endif const char * AcrExceptionDescription(void); Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr/misc.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr/misc.h?rev=1091533&r1=1091532&r2=1091533&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/acr/misc.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/acr/misc.h Tue Apr 12 18:33:14 2011 @@ -28,9 +28,6 @@ AcrLibLockAcquire(void); void AcrLibLockRelease(void); -int -AcrSignalsInit(void); - #ifdef __cplusplus } #endif Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/init.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/init.c?rev=1091533&r1=1091532&r2=1091533&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/unix/init.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/unix/init.c Tue Apr 12 18:33:14 2011 @@ -25,84 +25,6 @@ static JavaVM *_java_vm = 0; static pthread_key_t _threadkey; static volatile int _threadkey_inited = 0; static pthread_mutex_t _lib_mutex = PTHREAD_MUTEX_INITIALIZER; -static struct sigaction *_signalset; - -#if HAVE_THREAD_LOCAL -ACR_THREAD acr_exc_t acr_exception_frame = { 0, 0, 0, 0, 0, 0 }; -/* - * 1. Signals SIGKILL, SIGSTOP cannot be blocked. - * 2. Signals SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU are not blocked because - * dealing with these signals is dangerous. - * 3. Signals SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGTRAP, SIGIOT, SIGEMT, - * SIGBUS, SIGSYS, SIGSTKFLT are not blocked because these are synchronous - * signals, which may require immediate intervention, otherwise the - * process may starve. - */ -static int sig_blocked[] = { -#ifdef SIGHUP - SIGHUP, -#endif -#ifdef SIGINT - SIGINT, -#endif -#ifdef SIGQUIT - SIGQUIT, -#endif -#ifdef SIGPIPE - SIGPIPE, -#endif -#ifdef SIGALRM - SIGALRM, -#endif -#ifdef SIGTERM - SIGTERM, -#endif -#ifdef SIGUSR1 - SIGUSR1, -#endif -#ifdef SIGUSR2 - SIGUSR2, -#endif -#ifdef SIGCHLD - SIGCHLD, -#endif -#ifdef SIGCLD - SIGCLD, -#endif -#ifdef SIGURG - SIGURG, -#endif -#ifdef SIGIO - SIGIO, -#endif -#ifdef SIGPOLL - SIGPOLL, -#endif -#ifdef SIGXCPU - SIGXCPU, -#endif -#ifdef SIGXFSZ - SIGXFSZ, -#endif -#ifdef SIGVTALRM - SIGVTALRM, -#endif -#ifdef SIGPROF - SIGPROF, -#endif -#ifdef SIGPWR - SIGPWR, -#endif -#ifdef SIGLOST - SIGLOST, -#endif -#ifdef SIGWINCH - SIGWINCH, -#endif - -1 -}; - -#endif typedef struct tlsd_t { @@ -154,67 +76,6 @@ static tlsd_t *_threadkey_get(void) return env; } -static int _sigs_inited = 0; -int -AcrSignalsInit() -{ - int i, rc = 0; - struct sigaction *ssp; - - if (_sigs_inited++) - return 0; - ssp = _signalset = malloc(ACR_NUMSIG * sizeof(struct sigaction)); - for (i = 0; i < ACR_NUMSIG; i++) { - struct sigaction act; - - memset(&act, 0, sizeof(struct sigaction)); - sigemptyset(&act.sa_mask); - act.sa_handler = SIG_DFL; - act.sa_flags = 0; -#ifdef SA_INTERRUPT /* SunOS */ - act.sa_flags |= SA_INTERRUPT; -#endif - if (sigaction(i, &act, ssp) == 0) { - /* Restore the original saved sigaction. - * ###: Is there a smarter way for getting the - * original signal handlers? - */ - sigaction(i, ssp, &act); - } - else { - /* Those are for SIGKILL and SIGSTOP - * which cannot be caught or ignored. - */ - ssp->sa_handler = SIG_ERR; - } - ++ssp; - } -#if HAVE_THREAD_LOCAL - { - struct sigaction act; - memset(&act, 0, sizeof(struct sigaction)); - sigemptyset(&act.sa_mask); - act.sa_handler = SIG_DFL; //AcrExceptionHandler; - act.sa_flags = 0; -#ifdef SA_INTERRUPT - act.sa_flags |= SA_INTERRUPT; -#endif - for (i = 0; sig_blocked[i] > 0; i++) { - /* Block most signals during SIGSEGV handling - */ - sigaddset(&act.sa_mask, sig_blocked[i]); - } - /* Handle SIGSEGV signal - */ - sigaction(SIGSEGV, &act, 0); -#if defined(HPUX11) || defined(DARWIN) - sigaction(SIGBUS, &act, 0); -#endif - } -#endif - return rc; -} - void AcrLibLockAcquire() { @@ -284,77 +145,12 @@ AcrGetJNIEnv() return tlsd->env; } -#if HAVE_THREAD_LOCAL -void AcrExceptionHandler(int sig) -{ - printf("Exception Handler for %d\n", sig); - if (sig == SIGSEGV || sig == SIGBUS) { - if (acr_exception_frame.init) { - acr_exception_frame.init = 0; - acr_exception_frame.code = sig; -#if defined(_DEBUG) || defined(DEBUG) - AcrDebugPrintf(acr_exception_frame.file, - acr_exception_frame.func, - acr_exception_frame.line, - "Executing SEH handler for %s", strsignal(sig)); -#endif - siglongjmp(acr_exception_frame.jump, 1); - } - else if (_signalset[sig].sa_handler != SIG_DFL && - _signalset[sig].sa_handler != SIG_IGN && - _signalset[sig].sa_handler != SIG_ERR) { - AcrDebugPrintf(acr_exception_frame.file, - acr_exception_frame.func, - acr_exception_frame.line, - "Executing default handler for %s", strsignal(sig)); - /* This should invoke JVM crash report - */ - (*_signalset[sig].sa_handler)(sig); - } - else { - AcrDebugPrintf(acr_exception_frame.file, - acr_exception_frame.func, - acr_exception_frame.line, - "Cannot find default handler for %s", strsignal(sig)); - abort(); - } - } -} -const char * -AcrExceptionDescription() -{ - return strsignal(acr_exception_frame.code); -} - -#else -void AcrExceptionHandler(int sig) -{ - /* Not implemented */ -} - const char * AcrExceptionDescription() { return 0; } -#endif - -ACR_JNI_EXPORT(void, Native, fini0)(JNI_STDARGS) -{ - int i; - struct sigaction *ssp; - - if (_sigs_inited != 0) { - _sigs_inited = 0; - ssp = _signalset; - for (i = 0; i < ACR_NUMSIG; i++) { - sigaction(i, ssp, 0); - ssp++; - } - } -} - #if defined(__GNUC__) || defined(__SUNPRO_C) void __attribute__ ((constructor)) AcrLibraryAttach(void) Modified: commons/sandbox/runtime/trunk/src/main/native/shared/native.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/native.c?rev=1091533&r1=1091532&r2=1091533&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/shared/native.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/shared/native.c Tue Apr 12 18:33:14 2011 @@ -30,11 +30,17 @@ ACR_JNI_EXPORT(jboolean, Native, isdbg0) ACR_JNI_EXPORT(jboolean, Native, init0)(JNI_STDARGS) { if (_loaded) - return JNI_TRUE; + return JNI_TRUE; if (AcrLoadRuntimeClasses(env) != 0) return JNI_FALSE; - if (AcrSignalsInit() != 0) - return JNI_FALSE; _loaded = JNI_TRUE; return _loaded; } + +ACR_JNI_EXPORT(void, Native, fini0)(JNI_STDARGS) +{ + if (_loaded) { + _loaded = JNI_FALSE; + } +} +