2084 // -1 means registration failed 2085 return (void *)-1; 2086 } 2087 2088 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler); 2089 } 2090 2091 void os::signal_raise(int signal_number) { 2092 raise(signal_number); 2093 } 2094 2095 // The following code is moved from os.cpp for making this 2096 // code platform specific, which it is by its very nature. 2097 2098 // a counter for each possible signal value 2099 static int Sigexit = 0; 2100 static jint *pending_signals = NULL; 2101 static int *preinstalled_sigs = NULL; 2102 static struct sigaction *chainedsigactions = NULL; 2103 static Semaphore* sig_sem = NULL; 2104 typedef int (*version_getting_t)(); 2105 version_getting_t os::Solaris::get_libjsig_version = NULL; 2106 2107 int os::sigexitnum_pd() { 2108 assert(Sigexit > 0, "signal memory not yet initialized"); 2109 return Sigexit; 2110 } 2111 2112 void os::Solaris::init_signal_mem() { 2113 // Initialize signal structures 2114 Maxsignum = SIGRTMAX; 2115 Sigexit = Maxsignum+1; 2116 assert(Maxsignum >0, "Unable to obtain max signal number"); 2117 2118 // Initialize signal structures 2119 // pending_signals has one int per signal 2120 // The additional signal is for SIGEXIT - exit signal to signal_thread 2121 pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1), mtInternal); 2122 memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1))); 2123 2124 if (UseSignalChaining) { 2125 chainedsigactions = (struct sigaction *)malloc(sizeof(struct sigaction) 3951 if (sigismember(&check_signal_done, sig)) { 3952 print_signal_handlers(tty, buf, O_BUFLEN); 3953 } 3954 3955 } 3956 3957 void os::Solaris::install_signal_handlers() { 3958 signal_handlers_are_installed = true; 3959 3960 // signal-chaining 3961 typedef void (*signal_setting_t)(); 3962 signal_setting_t begin_signal_setting = NULL; 3963 signal_setting_t end_signal_setting = NULL; 3964 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 3965 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting")); 3966 if (begin_signal_setting != NULL) { 3967 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 3968 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting")); 3969 get_signal_action = CAST_TO_FN_PTR(get_signal_t, 3970 dlsym(RTLD_DEFAULT, "JVM_get_signal_action")); 3971 get_libjsig_version = CAST_TO_FN_PTR(version_getting_t, 3972 dlsym(RTLD_DEFAULT, "JVM_get_libjsig_version")); 3973 libjsig_is_loaded = true; 3974 if (os::Solaris::get_libjsig_version != NULL) { 3975 int libjsigversion = (*os::Solaris::get_libjsig_version)(); 3976 assert(libjsigversion == JSIG_VERSION_1_4_1, "libjsig version mismatch"); 3977 } 3978 assert(UseSignalChaining, "should enable signal-chaining"); 3979 } 3980 if (libjsig_is_loaded) { 3981 // Tell libjsig jvm is setting signal handlers 3982 (*begin_signal_setting)(); 3983 } 3984 3985 set_signal_handler(SIGSEGV, true, true); 3986 set_signal_handler(SIGPIPE, true, true); 3987 set_signal_handler(SIGXFSZ, true, true); 3988 set_signal_handler(SIGBUS, true, true); 3989 set_signal_handler(SIGILL, true, true); 3990 set_signal_handler(SIGFPE, true, true); 3991 set_signal_handler(ASYNC_SIGNAL, true, true); 3992 3993 if (libjsig_is_loaded) { 3994 // Tell libjsig jvm finishes setting signal handlers 3995 (*end_signal_setting)(); 3996 } 3997 | 2084 // -1 means registration failed 2085 return (void *)-1; 2086 } 2087 2088 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler); 2089 } 2090 2091 void os::signal_raise(int signal_number) { 2092 raise(signal_number); 2093 } 2094 2095 // The following code is moved from os.cpp for making this 2096 // code platform specific, which it is by its very nature. 2097 2098 // a counter for each possible signal value 2099 static int Sigexit = 0; 2100 static jint *pending_signals = NULL; 2101 static int *preinstalled_sigs = NULL; 2102 static struct sigaction *chainedsigactions = NULL; 2103 static Semaphore* sig_sem = NULL; 2104 2105 int os::sigexitnum_pd() { 2106 assert(Sigexit > 0, "signal memory not yet initialized"); 2107 return Sigexit; 2108 } 2109 2110 void os::Solaris::init_signal_mem() { 2111 // Initialize signal structures 2112 Maxsignum = SIGRTMAX; 2113 Sigexit = Maxsignum+1; 2114 assert(Maxsignum >0, "Unable to obtain max signal number"); 2115 2116 // Initialize signal structures 2117 // pending_signals has one int per signal 2118 // The additional signal is for SIGEXIT - exit signal to signal_thread 2119 pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1), mtInternal); 2120 memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1))); 2121 2122 if (UseSignalChaining) { 2123 chainedsigactions = (struct sigaction *)malloc(sizeof(struct sigaction) 3949 if (sigismember(&check_signal_done, sig)) { 3950 print_signal_handlers(tty, buf, O_BUFLEN); 3951 } 3952 3953 } 3954 3955 void os::Solaris::install_signal_handlers() { 3956 signal_handlers_are_installed = true; 3957 3958 // signal-chaining 3959 typedef void (*signal_setting_t)(); 3960 signal_setting_t begin_signal_setting = NULL; 3961 signal_setting_t end_signal_setting = NULL; 3962 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 3963 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting")); 3964 if (begin_signal_setting != NULL) { 3965 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 3966 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting")); 3967 get_signal_action = CAST_TO_FN_PTR(get_signal_t, 3968 dlsym(RTLD_DEFAULT, "JVM_get_signal_action")); 3969 libjsig_is_loaded = true; 3970 assert(UseSignalChaining, "should enable signal-chaining"); 3971 } 3972 if (libjsig_is_loaded) { 3973 // Tell libjsig jvm is setting signal handlers 3974 (*begin_signal_setting)(); 3975 } 3976 3977 set_signal_handler(SIGSEGV, true, true); 3978 set_signal_handler(SIGPIPE, true, true); 3979 set_signal_handler(SIGXFSZ, true, true); 3980 set_signal_handler(SIGBUS, true, true); 3981 set_signal_handler(SIGILL, true, true); 3982 set_signal_handler(SIGFPE, true, true); 3983 set_signal_handler(ASYNC_SIGNAL, true, true); 3984 3985 if (libjsig_is_loaded) { 3986 // Tell libjsig jvm finishes setting signal handlers 3987 (*end_signal_setting)(); 3988 } 3989 |