--- SheepShaver/src/Unix/main_unix.cpp 2011/12/28 23:24:30 1.95 +++ SheepShaver/src/Unix/main_unix.cpp 2011/12/30 17:38:39 1.98 @@ -429,6 +429,7 @@ static void get_system_info(void) } fclose(proc_file); } else { + char str[256]; sprintf(str, GetString(STR_PROC_CPUINFO_WARN), strerror(errno)); WarningAlert(str); } @@ -611,11 +612,72 @@ static bool load_mac_rom(void) return true; } -int main(int argc, char **argv) +static bool install_signal_handlers(void) { char str[256]; - bool memory_mapped_from_zero, ram_rom_areas_contiguous; - const char *vmdir = NULL; +#if !EMULATED_PPC + // Create and install stacks for signal handlers + sig_stack.ss_sp = malloc(SIG_STACK_SIZE); + D(bug("Signal stack at %p\n", sig_stack.ss_sp)); + if (sig_stack.ss_sp == NULL) { + ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR)); + return false; + } + sig_stack.ss_flags = 0; + sig_stack.ss_size = SIG_STACK_SIZE; + if (sigaltstack(&sig_stack, NULL) < 0) { + sprintf(str, GetString(STR_SIGALTSTACK_ERR), strerror(errno)); + ErrorAlert(str); + return false; + } + extra_stack.ss_sp = malloc(SIG_STACK_SIZE); + D(bug("Extra stack at %p\n", extra_stack.ss_sp)); + if (extra_stack.ss_sp == NULL) { + ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR)); + return false; + } + extra_stack.ss_flags = 0; + extra_stack.ss_size = SIG_STACK_SIZE; + + // Install SIGSEGV and SIGBUS handlers + sigemptyset(&sigsegv_action.sa_mask); // Block interrupts during SEGV handling + sigaddset(&sigsegv_action.sa_mask, SIGUSR2); + sigsegv_action.sa_sigaction = sigsegv_handler; + sigsegv_action.sa_flags = SA_ONSTACK | SA_SIGINFO; +#ifdef HAVE_SIGNAL_SA_RESTORER + sigsegv_action.sa_restorer = NULL; +#endif + if (sigaction(SIGSEGV, &sigsegv_action, NULL) < 0) { + sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno)); + ErrorAlert(str); + return false; + } + if (sigaction(SIGBUS, &sigsegv_action, NULL) < 0) { + sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGBUS", strerror(errno)); + ErrorAlert(str); + return false; + } +#else + // Install SIGSEGV handler for CPU emulator + if (!sigsegv_install_handler(sigsegv_handler)) { + sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno)); + ErrorAlert(str); + return false; + } +#endif + return true; +} + +static bool init_sdl() +{ + int sdl_flags = 0; +#ifdef USE_SDL_VIDEO + sdl_flags |= SDL_INIT_VIDEO; +#endif +#ifdef USE_SDL_AUDIO + sdl_flags |= SDL_INIT_AUDIO; +#endif + assert(sdl_flags != 0); #ifdef USE_SDL_VIDEO // Don't let SDL block the screensaver @@ -625,6 +687,26 @@ int main(int argc, char **argv) setenv("SDL_HAS3BUTTONMOUSE", "1", TRUE); #endif + if (SDL_Init(sdl_flags) == -1) { + char str[256]; + sprintf(str, "Could not initialize SDL: %s.\n", SDL_GetError()); + ErrorAlert(str); + return false; + } + atexit(SDL_Quit); + + // Don't let SDL catch SIGINT and SIGTERM signals + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + return true; +} + +int main(int argc, char **argv) +{ + char str[256]; + bool memory_mapped_from_zero, ram_rom_areas_contiguous; + const char *vmdir = NULL; + // Initialize variables RAMBase = 0; tzset(); @@ -715,25 +797,8 @@ int main(int argc, char **argv) #ifdef USE_SDL // Initialize SDL system - int sdl_flags = 0; -#ifdef USE_SDL_VIDEO - sdl_flags |= SDL_INIT_VIDEO; -#endif -#ifdef USE_SDL_AUDIO - sdl_flags |= SDL_INIT_AUDIO; -#endif - assert(sdl_flags != 0); - if (SDL_Init(sdl_flags) == -1) { - char str[256]; - sprintf(str, "Could not initialize SDL: %s.\n", SDL_GetError()); - ErrorAlert(str); + if (!init_sdl()) goto quit; - } - atexit(SDL_Quit); - - // Don't let SDL catch SIGINT and SIGTERM signals - signal(SIGINT, SIG_DFL); - signal(SIGTERM, SIG_DFL); #endif #ifndef USE_SDL_VIDEO @@ -757,58 +822,9 @@ int main(int argc, char **argv) mon_init(); #endif -#if !EMULATED_PPC - // Create and install stacks for signal handlers - sig_stack.ss_sp = malloc(SIG_STACK_SIZE); - D(bug("Signal stack at %p\n", sig_stack.ss_sp)); - if (sig_stack.ss_sp == NULL) { - ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR)); - goto quit; - } - sig_stack.ss_flags = 0; - sig_stack.ss_size = SIG_STACK_SIZE; - if (sigaltstack(&sig_stack, NULL) < 0) { - sprintf(str, GetString(STR_SIGALTSTACK_ERR), strerror(errno)); - ErrorAlert(str); - goto quit; - } - extra_stack.ss_sp = malloc(SIG_STACK_SIZE); - D(bug("Extra stack at %p\n", extra_stack.ss_sp)); - if (extra_stack.ss_sp == NULL) { - ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR)); - goto quit; - } - extra_stack.ss_flags = 0; - extra_stack.ss_size = SIG_STACK_SIZE; -#endif - -#if !EMULATED_PPC - // Install SIGSEGV and SIGBUS handlers - sigemptyset(&sigsegv_action.sa_mask); // Block interrupts during SEGV handling - sigaddset(&sigsegv_action.sa_mask, SIGUSR2); - sigsegv_action.sa_sigaction = sigsegv_handler; - sigsegv_action.sa_flags = SA_ONSTACK | SA_SIGINFO; -#ifdef HAVE_SIGNAL_SA_RESTORER - sigsegv_action.sa_restorer = NULL; -#endif - if (sigaction(SIGSEGV, &sigsegv_action, NULL) < 0) { - sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno)); - ErrorAlert(str); - goto quit; - } - if (sigaction(SIGBUS, &sigsegv_action, NULL) < 0) { - sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGBUS", strerror(errno)); - ErrorAlert(str); + // Install signal handlers + if (!install_signal_handlers()) goto quit; - } -#else - // Install SIGSEGV handler for CPU emulator - if (!sigsegv_install_handler(sigsegv_handler)) { - sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno)); - ErrorAlert(str); - goto quit; - } -#endif // Initialize VM system vm_init();