diff options
Diffstat (limited to 'tools/debugserver/source/MacOSX/MachException.cpp')
-rw-r--r-- | tools/debugserver/source/MacOSX/MachException.cpp | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/tools/debugserver/source/MacOSX/MachException.cpp b/tools/debugserver/source/MacOSX/MachException.cpp index 5f085867db2cd..cc309e47d86bf 100644 --- a/tools/debugserver/source/MacOSX/MachException.cpp +++ b/tools/debugserver/source/MacOSX/MachException.cpp @@ -47,13 +47,13 @@ extern "C" kern_return_t catch_mach_exception_raise_state_identity( extern "C" boolean_t mach_exc_server(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); -// Any access to the g_message variable should be done by locking the -// g_message_mutex first, using the g_message variable, then unlocking -// the g_message_mutex. See MachException::Message::CatchExceptionRaise() -// for sample code. - +// Note: g_message points to the storage allocated to catch the data from +// catching the current exception raise. It's populated when we catch a raised +// exception which can't immediately be replied to. +// +// If it becomes possible to catch exceptions from multiple threads +// simultaneously, accesses to g_message would need to be mutually exclusive. static MachException::Data *g_message = NULL; -// static pthread_mutex_t g_message_mutex = PTHREAD_MUTEX_INITIALIZER; extern "C" kern_return_t catch_mach_exception_raise_state( mach_port_t exc_port, exception_type_t exc_type, @@ -113,8 +113,7 @@ catch_mach_exception_raise(mach_port_t exc_port, mach_port_t thread_port, g_message->task_port = task_port; g_message->thread_port = thread_port; g_message->exc_type = exc_type; - for (mach_msg_type_number_t i=0; i<exc_data_count; ++i) - g_message->exc_data.push_back(exc_data[i]); + g_message->AppendExceptionData(exc_data, exc_data_count); return KERN_SUCCESS; } else if (!MachTask::IsValid(g_message->task_port)) { // Our original exception port isn't valid anymore check for a SIGTRAP @@ -126,8 +125,7 @@ catch_mach_exception_raise(mach_port_t exc_port, mach_port_t thread_port, g_message->task_port = task_port; g_message->thread_port = thread_port; g_message->exc_type = exc_type; - for (mach_msg_type_number_t i=0; i<exc_data_count; ++i) - g_message->exc_data.push_back(exc_data[i]); + g_message->AppendExceptionData(exc_data, exc_data_count); return KERN_SUCCESS; } } @@ -272,9 +270,6 @@ kern_return_t MachException::Message::Receive(mach_port_t port, bool MachException::Message::CatchExceptionRaise(task_t task) { bool success = false; - // locker will keep a mutex locked until it goes out of scope - // PThreadMutex::Locker locker(&g_message_mutex); - // DNBLogThreaded("calling mach_exc_server"); state.task_port = task; g_message = &state; // The exc_server function is the MIG generated server handling function |