ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/Unix/main_unix.cpp
(Generate patch)

Comparing SheepShaver/src/Unix/main_unix.cpp (file contents):
Revision 1.95 by asvitkine, 2011-12-28T23:24:30Z vs.
Revision 1.98 by asvitkine, 2011-12-30T17:38:39Z

# Line 429 | Line 429 | static void get_system_info(void)
429                  }
430                  fclose(proc_file);
431          } else {
432 +                char str[256];
433                  sprintf(str, GetString(STR_PROC_CPUINFO_WARN), strerror(errno));
434                  WarningAlert(str);
435          }
# Line 611 | Line 612 | static bool load_mac_rom(void)
612          return true;
613   }
614  
615 < int main(int argc, char **argv)
615 > static bool install_signal_handlers(void)
616   {
617          char str[256];
618 <        bool memory_mapped_from_zero, ram_rom_areas_contiguous;
619 <        const char *vmdir = NULL;
618 > #if !EMULATED_PPC
619 >        // Create and install stacks for signal handlers
620 >        sig_stack.ss_sp = malloc(SIG_STACK_SIZE);
621 >        D(bug("Signal stack at %p\n", sig_stack.ss_sp));
622 >        if (sig_stack.ss_sp == NULL) {
623 >                ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR));
624 >                return false;
625 >        }
626 >        sig_stack.ss_flags = 0;
627 >        sig_stack.ss_size = SIG_STACK_SIZE;
628 >        if (sigaltstack(&sig_stack, NULL) < 0) {
629 >                sprintf(str, GetString(STR_SIGALTSTACK_ERR), strerror(errno));
630 >                ErrorAlert(str);
631 >                return false;
632 >        }
633 >        extra_stack.ss_sp = malloc(SIG_STACK_SIZE);
634 >        D(bug("Extra stack at %p\n", extra_stack.ss_sp));
635 >        if (extra_stack.ss_sp == NULL) {
636 >                ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR));
637 >                return false;
638 >        }
639 >        extra_stack.ss_flags = 0;
640 >        extra_stack.ss_size = SIG_STACK_SIZE;
641 >
642 >        // Install SIGSEGV and SIGBUS handlers
643 >        sigemptyset(&sigsegv_action.sa_mask);   // Block interrupts during SEGV handling
644 >        sigaddset(&sigsegv_action.sa_mask, SIGUSR2);
645 >        sigsegv_action.sa_sigaction = sigsegv_handler;
646 >        sigsegv_action.sa_flags = SA_ONSTACK | SA_SIGINFO;
647 > #ifdef HAVE_SIGNAL_SA_RESTORER
648 >        sigsegv_action.sa_restorer = NULL;
649 > #endif
650 >        if (sigaction(SIGSEGV, &sigsegv_action, NULL) < 0) {
651 >                sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno));
652 >                ErrorAlert(str);
653 >                return false;
654 >        }
655 >        if (sigaction(SIGBUS, &sigsegv_action, NULL) < 0) {
656 >                sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGBUS", strerror(errno));
657 >                ErrorAlert(str);
658 >                return false;
659 >        }
660 > #else
661 >        // Install SIGSEGV handler for CPU emulator
662 >        if (!sigsegv_install_handler(sigsegv_handler)) {
663 >                sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno));
664 >                ErrorAlert(str);
665 >                return false;
666 >        }
667 > #endif
668 >        return true;
669 > }
670 >
671 > static bool init_sdl()
672 > {
673 >        int sdl_flags = 0;
674 > #ifdef USE_SDL_VIDEO
675 >        sdl_flags |= SDL_INIT_VIDEO;
676 > #endif
677 > #ifdef USE_SDL_AUDIO
678 >        sdl_flags |= SDL_INIT_AUDIO;
679 > #endif
680 >        assert(sdl_flags != 0);
681  
682   #ifdef USE_SDL_VIDEO
683          // Don't let SDL block the screensaver
# Line 625 | Line 687 | int main(int argc, char **argv)
687          setenv("SDL_HAS3BUTTONMOUSE", "1", TRUE);
688   #endif
689  
690 +        if (SDL_Init(sdl_flags) == -1) {
691 +                char str[256];
692 +                sprintf(str, "Could not initialize SDL: %s.\n", SDL_GetError());
693 +                ErrorAlert(str);
694 +                return false;
695 +        }
696 +        atexit(SDL_Quit);
697 +
698 +        // Don't let SDL catch SIGINT and SIGTERM signals
699 +        signal(SIGINT, SIG_DFL);
700 +        signal(SIGTERM, SIG_DFL);
701 +        return true;
702 + }
703 +
704 + int main(int argc, char **argv)
705 + {
706 +        char str[256];
707 +        bool memory_mapped_from_zero, ram_rom_areas_contiguous;
708 +        const char *vmdir = NULL;
709 +
710          // Initialize variables
711          RAMBase = 0;
712          tzset();
# Line 715 | Line 797 | int main(int argc, char **argv)
797  
798   #ifdef USE_SDL
799          // Initialize SDL system
800 <        int sdl_flags = 0;
719 < #ifdef USE_SDL_VIDEO
720 <        sdl_flags |= SDL_INIT_VIDEO;
721 < #endif
722 < #ifdef USE_SDL_AUDIO
723 <        sdl_flags |= SDL_INIT_AUDIO;
724 < #endif
725 <        assert(sdl_flags != 0);
726 <        if (SDL_Init(sdl_flags) == -1) {
727 <                char str[256];
728 <                sprintf(str, "Could not initialize SDL: %s.\n", SDL_GetError());
729 <                ErrorAlert(str);
800 >        if (!init_sdl())
801                  goto quit;
731        }
732        atexit(SDL_Quit);
733
734        // Don't let SDL catch SIGINT and SIGTERM signals
735        signal(SIGINT, SIG_DFL);
736        signal(SIGTERM, SIG_DFL);
802   #endif
803  
804   #ifndef USE_SDL_VIDEO
# Line 757 | Line 822 | int main(int argc, char **argv)
822          mon_init();
823   #endif
824  
825 < #if !EMULATED_PPC
826 <        // Create and install stacks for signal handlers
762 <        sig_stack.ss_sp = malloc(SIG_STACK_SIZE);
763 <        D(bug("Signal stack at %p\n", sig_stack.ss_sp));
764 <        if (sig_stack.ss_sp == NULL) {
765 <                ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR));
766 <                goto quit;
767 <        }
768 <        sig_stack.ss_flags = 0;
769 <        sig_stack.ss_size = SIG_STACK_SIZE;
770 <        if (sigaltstack(&sig_stack, NULL) < 0) {
771 <                sprintf(str, GetString(STR_SIGALTSTACK_ERR), strerror(errno));
772 <                ErrorAlert(str);
773 <                goto quit;
774 <        }
775 <        extra_stack.ss_sp = malloc(SIG_STACK_SIZE);
776 <        D(bug("Extra stack at %p\n", extra_stack.ss_sp));
777 <        if (extra_stack.ss_sp == NULL) {
778 <                ErrorAlert(GetString(STR_NOT_ENOUGH_MEMORY_ERR));
779 <                goto quit;
780 <        }
781 <        extra_stack.ss_flags = 0;
782 <        extra_stack.ss_size = SIG_STACK_SIZE;
783 < #endif
784 <
785 < #if !EMULATED_PPC
786 <        // Install SIGSEGV and SIGBUS handlers
787 <        sigemptyset(&sigsegv_action.sa_mask);   // Block interrupts during SEGV handling
788 <        sigaddset(&sigsegv_action.sa_mask, SIGUSR2);
789 <        sigsegv_action.sa_sigaction = sigsegv_handler;
790 <        sigsegv_action.sa_flags = SA_ONSTACK | SA_SIGINFO;
791 < #ifdef HAVE_SIGNAL_SA_RESTORER
792 <        sigsegv_action.sa_restorer = NULL;
793 < #endif
794 <        if (sigaction(SIGSEGV, &sigsegv_action, NULL) < 0) {
795 <                sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno));
796 <                ErrorAlert(str);
797 <                goto quit;
798 <        }
799 <        if (sigaction(SIGBUS, &sigsegv_action, NULL) < 0) {
800 <                sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGBUS", strerror(errno));
801 <                ErrorAlert(str);
825 >  // Install signal handlers
826 >        if (!install_signal_handlers())
827                  goto quit;
803        }
804 #else
805        // Install SIGSEGV handler for CPU emulator
806        if (!sigsegv_install_handler(sigsegv_handler)) {
807                sprintf(str, GetString(STR_SIG_INSTALL_ERR), "SIGSEGV", strerror(errno));
808                ErrorAlert(str);
809                goto quit;
810        }
811 #endif
828  
829          // Initialize VM system
830          vm_init();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines