static void initialize_signal_handler(GCTYPE *gc) { # ifdef NEED_OSX_MACH_HANDLER # if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) macosx_init_exception_handler(MASTERGC == 0); # else macosx_init_exception_handler(1); # endif # endif # ifdef NEED_SIGSTACK { stack_t ss; uintptr_t sz = 10*SIGSTKSZ; ss.ss_sp = malloc(sz); ss.ss_size = sz; ss.ss_flags = 0; sigaltstack(&ss, NULL); } # endif # ifdef NEED_SIGACTION { struct sigaction act, oact; memset(&act, 0, sizeof(act)); act.sa_sigaction = fault_handler; sigemptyset(&act.sa_mask); /* In Racket, SIGCHLD or SIGINT handling may trigger a write barrier: */ sigaddset(&act.sa_mask, SIGINT); sigaddset(&act.sa_mask, SIGCHLD); act.sa_flags = SA_SIGINFO; # ifdef NEED_SIGSTACK act.sa_flags |= SA_ONSTACK; # endif sigaction(USE_SIGACTON_SIGNAL_KIND, &act, &oact); # ifdef USE_ANOTHER_SIGACTON_SIGNAL_KIND sigaction(USE_ANOTHER_SIGACTON_SIGNAL_KIND, &act, &oact); # endif } # endif # ifdef NEED_SIGWIN { HMODULE hm; PVOID (WINAPI*aveh)(ULONG, gcPVECTORED_EXCEPTION_HANDLER); hm = LoadLibrary("kernel32.dll"); if (hm) aveh = (PVOID (WINAPI*)(ULONG, gcPVECTORED_EXCEPTION_HANDLER))GetProcAddress(hm, "AddVectoredExceptionHandler"); else aveh = NULL; if (aveh) aveh(TRUE, fault_handler); else /* older than Windows XP */ gc->generations_available = 0; } # endif }
int main(int argc, char **argv) { macosx_init_exception_handler(); printf("Allocating test pages:\n"); normal_page = vm_malloc_pages(MPAGE_SIZE, MPAGE_SIZE,0); printf(" ... normal page at %p\n", normal_page); big_page = vm_malloc_pages(BPAGE_SIZE, MPAGE_SIZE,0); printf(" ... big page at %p\n", big_page); printf("Setting protection on test pages\n"); vm_protect_pages(normal_page, MPAGE_SIZE, 0); printf(" ... normal page %p set\n", normal_page); vm_protect_pages(big_page, MPAGE_SIZE, 0); printf(" ... big page %p set\n", big_page); printf("Writing to test pages\n"); normal_page[2] = 'A'; big_page[2] = 'A'; printf("Reading from test pages:\n"); printf(" ... normal_page %p's second byte is %c\n", normal_page, normal_page[2]); printf(" ... big_page %p's second byte is %c\n", big_page, big_page[2]); printf("Freeing test pages:\n"); vm_free_pages(normal_page, MPAGE_SIZE); printf(" ... freed normal page\n"); vm_free_pages(big_page, MPAGE_SIZE); printf(" ... freed big page\n"); }
static void initialize_signal_handler() { # ifdef NEED_OSX_MACH_HANDLER macosx_init_exception_handler(); # endif # ifdef NEED_SIGACTION { struct sigaction act, oact; memset(&act, 0, sizeof(sigaction)); act.sa_sigaction = fault_handler; sigemptyset(&act.sa_mask); /* In MzScheme, SIGCHLD or SIGINT handling may trigger a write barrier: */ sigaddset(&act.sa_mask, SIGINT); sigaddset(&act.sa_mask, SIGCHLD); act.sa_flags = SA_SIGINFO; sigaction(USE_SIGACTON_SIGNAL_KIND, &act, &oact); } # endif # ifdef NEED_SIGWIN { HMODULE hm; PVOID (WINAPI*aveh)(ULONG, gcPVECTORED_EXCEPTION_HANDLER); hm = LoadLibrary("kernel32.dll"); if (hm) aveh = (PVOID (WINAPI*)(ULONG, gcPVECTORED_EXCEPTION_HANDLER))GetProcAddress(hm, "AddVectoredExceptionHandler"); else aveh = NULL; if (aveh) aveh(TRUE, fault_handler); else generations_available = 0; } # endif }