From 4c8caa51bca73bd7c454713b93e71879502eb2b2 Mon Sep 17 00:00:00 2001 From: Cyrus Harmon Date: Mon, 7 Mar 2011 23:14:01 +0000 Subject: [PATCH] 1.0.46.25: consolidate common code from x86-64-darwin-os.c and x86-darwin-os.c into darwin-os.c * lots of code in x86-64-darwin-os.c and x86-darwin-os.c was duplicated. consolidated into darwin-os.c and wrapped with appropriate #ifdefs. * darwin-os.c now #includes "thread.h" but not "bsd-os.h" --- src/runtime/darwin-os.c | 123 +++++++++++++++++++++++++++++++++++++++- src/runtime/x86-64-darwin-os.c | 113 ------------------------------------ src/runtime/x86-darwin-os.c | 117 -------------------------------------- version.lisp-expr | 2 +- 4 files changed, 123 insertions(+), 232 deletions(-) diff --git a/src/runtime/darwin-os.c b/src/runtime/darwin-os.c index 4a2bef6..63fc6e6 100644 --- a/src/runtime/darwin-os.c +++ b/src/runtime/darwin-os.c @@ -14,16 +14,20 @@ * files for more information. */ +#include "thread.h" #include "sbcl.h" #include "globals.h" #include "runtime.h" #include #include #include -#include "bsd-os.h" #include #include +#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER +#include +#endif + char * os_get_runtime_executable_path(int external) { @@ -38,3 +42,120 @@ os_get_runtime_executable_path(int external) return copied_string(path); } +#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER + +/* exc_server handles mach exception messages from the kernel and + * calls catch exception raise. We use the system-provided + * mach_msg_server, which, I assume, calls exc_server in a loop. + * + */ +extern boolean_t exc_server(); + +void * +mach_exception_handler(void *port) +{ + mach_msg_server(exc_server, 2048, (mach_port_t) port, 0); + /* mach_msg_server should never return, but it should dispatch mach + * exceptions to our catch_exception_raise function + */ + lose("mach_msg_server returned"); +} + +/* Sets up the thread that will listen for mach exceptions. note that + the exception handlers will be run on this thread. This is + different from the BSD-style signal handling situation in which the + signal handlers run in the relevant thread directly. */ + +mach_port_t mach_exception_handler_port_set = MACH_PORT_NULL; + +pthread_t +setup_mach_exception_handling_thread() +{ + kern_return_t ret; + pthread_t mach_exception_handling_thread = NULL; + pthread_attr_t attr; + + /* allocate a mach_port for this process */ + ret = mach_port_allocate(mach_task_self(), + MACH_PORT_RIGHT_PORT_SET, + &mach_exception_handler_port_set); + + /* create the thread that will receive the mach exceptions */ + + FSHOW((stderr, "Creating mach_exception_handler thread!\n")); + + pthread_attr_init(&attr); + pthread_create(&mach_exception_handling_thread, + &attr, + mach_exception_handler, + (void*) mach_exception_handler_port_set); + pthread_attr_destroy(&attr); + + return mach_exception_handling_thread; +} + +/* tell the kernel that we want EXC_BAD_ACCESS exceptions sent to the + exception port (which is being listened to do by the mach + exception handling thread). */ +kern_return_t +mach_thread_init(mach_port_t thread_exception_port) +{ + kern_return_t ret; + /* allocate a named port for the thread */ + + FSHOW((stderr, "Allocating mach port %x\n", thread_exception_port)); + + ret = mach_port_allocate_name(mach_task_self(), + MACH_PORT_RIGHT_RECEIVE, + thread_exception_port); + if (ret) { + lose("mach_port_allocate_name failed with return_code %d\n", ret); + } + + /* establish the right for the thread_exception_port to send messages */ + ret = mach_port_insert_right(mach_task_self(), + thread_exception_port, + thread_exception_port, + MACH_MSG_TYPE_MAKE_SEND); + if (ret) { + lose("mach_port_insert_right failed with return_code %d\n", ret); + } + + ret = thread_set_exception_ports(mach_thread_self(), + EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_INSTRUCTION, + thread_exception_port, + EXCEPTION_DEFAULT, + THREAD_STATE_NONE); + if (ret) { + lose("thread_set_exception_port failed with return_code %d\n", ret); + } + + ret = mach_port_move_member(mach_task_self(), + thread_exception_port, + mach_exception_handler_port_set); + if (ret) { + lose("mach_port_ failed with return_code %d\n", ret); + } + + return ret; +} + +void +setup_mach_exceptions() { + setup_mach_exception_handling_thread(); + mach_thread_init(THREAD_STRUCT_TO_EXCEPTION_PORT(all_threads)); +} + +pid_t +mach_fork() { + pid_t pid = fork(); + if (pid == 0) { + setup_mach_exceptions(); + return pid; + } else { + return pid; + } +} + +#endif + diff --git a/src/runtime/x86-64-darwin-os.c b/src/runtime/x86-64-darwin-os.c index 00da75f..7b8ca68 100644 --- a/src/runtime/x86-64-darwin-os.c +++ b/src/runtime/x86-64-darwin-os.c @@ -69,13 +69,6 @@ void sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context); void memory_fault_handler(int signal, siginfo_t *siginfo, os_context_t *context); -/* exc_server handles mach exception messages from the kernel and - * calls catch exception raise. We use the system-provided - * mach_msg_server, which, I assume, calls exc_server in a loop. - * - */ -extern boolean_t exc_server(); - /* This executes in the faulting thread as part of the signal * emulation. It is passed a context with the uc_mcontext field * pointing to a valid block of memory. */ @@ -580,110 +573,4 @@ catch_exception_raise(mach_port_t exception_port, } } -void * -mach_exception_handler(void *port) -{ - mach_msg_server(exc_server, 2048, (mach_port_t) port, 0); - /* mach_msg_server should never return, but it should dispatch mach - * exceptions to our catch_exception_raise function - */ - lose("mach_msg_server returned"); -} - -/* Sets up the thread that will listen for mach exceptions. note that - the exception handlers will be run on this thread. This is - different from the BSD-style signal handling situation in which the - signal handlers run in the relevant thread directly. */ - -mach_port_t mach_exception_handler_port_set = MACH_PORT_NULL; - -pthread_t -setup_mach_exception_handling_thread() -{ - kern_return_t ret; - pthread_t mach_exception_handling_thread = NULL; - pthread_attr_t attr; - - /* allocate a mach_port for this process */ - ret = mach_port_allocate(mach_task_self(), - MACH_PORT_RIGHT_PORT_SET, - &mach_exception_handler_port_set); - - /* create the thread that will receive the mach exceptions */ - - FSHOW((stderr, "Creating mach_exception_handler thread!\n")); - - pthread_attr_init(&attr); - pthread_create(&mach_exception_handling_thread, - &attr, - mach_exception_handler, - (void*) mach_exception_handler_port_set); - pthread_attr_destroy(&attr); - - return mach_exception_handling_thread; -} - -/* tell the kernel that we want EXC_BAD_ACCESS exceptions sent to the - exception port (which is being listened to do by the mach - exception handling thread). */ -kern_return_t -mach_thread_init(mach_port_t thread_exception_port) -{ - kern_return_t ret; - /* allocate a named port for the thread */ - - FSHOW((stderr, "Allocating mach port %x\n", thread_exception_port)); - - ret = mach_port_allocate_name(mach_task_self(), - MACH_PORT_RIGHT_RECEIVE, - thread_exception_port); - if (ret) { - lose("mach_port_allocate_name failed with return_code %d\n", ret); - } - - /* establish the right for the thread_exception_port to send messages */ - ret = mach_port_insert_right(mach_task_self(), - thread_exception_port, - thread_exception_port, - MACH_MSG_TYPE_MAKE_SEND); - if (ret) { - lose("mach_port_insert_right failed with return_code %d\n", ret); - } - - ret = thread_set_exception_ports(mach_thread_self(), - EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_INSTRUCTION, - thread_exception_port, - EXCEPTION_DEFAULT, - THREAD_STATE_NONE); - if (ret) { - lose("thread_set_exception_port failed with return_code %d\n", ret); - } - - ret = mach_port_move_member(mach_task_self(), - thread_exception_port, - mach_exception_handler_port_set); - if (ret) { - lose("mach_port_ failed with return_code %d\n", ret); - } - - return ret; -} - -void -setup_mach_exceptions() { - setup_mach_exception_handling_thread(); - mach_thread_init(THREAD_STRUCT_TO_EXCEPTION_PORT(all_threads)); -} - -pid_t -mach_fork() { - pid_t pid = fork(); - if (pid == 0) { - setup_mach_exceptions(); - return pid; - } else { - return pid; - } -} - #endif diff --git a/src/runtime/x86-darwin-os.c b/src/runtime/x86-darwin-os.c index ad41b0f..610db59 100644 --- a/src/runtime/x86-darwin-os.c +++ b/src/runtime/x86-darwin-os.c @@ -120,13 +120,6 @@ void sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context); void memory_fault_handler(int signal, siginfo_t *siginfo, os_context_t *context); -/* exc_server handles mach exception messages from the kernel and - * calls catch exception raise. We use the system-provided - * mach_msg_server, which, I assume, calls exc_server in a loop. - * - */ -extern boolean_t exc_server(); - /* This executes in the faulting thread as part of the signal * emulation. It is passed a context with the uc_mcontext field * pointing to a valid block of memory. */ @@ -505,114 +498,4 @@ catch_exception_raise(mach_port_t exception_port, return ret; } -void * -mach_exception_handler(void *port) -{ - mach_msg_server(exc_server, 2048, (mach_port_t) port, 0); - /* mach_msg_server should never return, but it should dispatch mach - * exceptions to our catch_exception_raise function - */ - lose("mach_msg_server returned"); -} - -#endif - -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER - -/* Sets up the thread that will listen for mach exceptions. note that - the exception handlers will be run on this thread. This is - different from the BSD-style signal handling situation in which the - signal handlers run in the relevant thread directly. */ - -mach_port_t mach_exception_handler_port_set = MACH_PORT_NULL; - -pthread_t -setup_mach_exception_handling_thread() -{ - kern_return_t ret; - pthread_t mach_exception_handling_thread = NULL; - pthread_attr_t attr; - - /* allocate a mach_port for this process */ - ret = mach_port_allocate(mach_task_self(), - MACH_PORT_RIGHT_PORT_SET, - &mach_exception_handler_port_set); - - /* create the thread that will receive the mach exceptions */ - - FSHOW((stderr, "Creating mach_exception_handler thread!\n")); - - pthread_attr_init(&attr); - pthread_create(&mach_exception_handling_thread, - &attr, - mach_exception_handler, - (void*) mach_exception_handler_port_set); - pthread_attr_destroy(&attr); - - return mach_exception_handling_thread; -} - -/* tell the kernel that we want EXC_BAD_ACCESS exceptions sent to the - exception port (which is being listened to do by the mach - exception handling thread). */ -kern_return_t -mach_thread_init(mach_port_t thread_exception_port) -{ - kern_return_t ret; - /* allocate a named port for the thread */ - - FSHOW((stderr, "Allocating mach port %x\n", thread_exception_port)); - - ret = mach_port_allocate_name(mach_task_self(), - MACH_PORT_RIGHT_RECEIVE, - thread_exception_port); - if (ret) { - lose("mach_port_allocate_name failed with return_code %d\n", ret); - } - - /* establish the right for the thread_exception_port to send messages */ - ret = mach_port_insert_right(mach_task_self(), - thread_exception_port, - thread_exception_port, - MACH_MSG_TYPE_MAKE_SEND); - if (ret) { - lose("mach_port_insert_right failed with return_code %d\n", ret); - } - - ret = thread_set_exception_ports(mach_thread_self(), - EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_INSTRUCTION, - thread_exception_port, - EXCEPTION_DEFAULT, - THREAD_STATE_NONE); - if (ret) { - lose("thread_set_exception_port failed with return_code %d\n", ret); - } - - ret = mach_port_move_member(mach_task_self(), - thread_exception_port, - mach_exception_handler_port_set); - if (ret) { - lose("mach_port_ failed with return_code %d\n", ret); - } - - return ret; -} - -void -setup_mach_exceptions() { - setup_mach_exception_handling_thread(); - mach_thread_init(THREAD_STRUCT_TO_EXCEPTION_PORT(all_threads)); -} - -pid_t -mach_fork() { - pid_t pid = fork(); - if (pid == 0) { - setup_mach_exceptions(); - return pid; - } else { - return pid; - } -} - #endif diff --git a/version.lisp-expr b/version.lisp-expr index 3c1144c..ab530cc 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -20,4 +20,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"1.0.46.24" +"1.0.46.25" -- 1.7.10.4