< prev index next >

src/hotspot/os/solaris/os_solaris.cpp

Print this page




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 


< prev index next >