[Places] register OSX mach threads
svn: r17141
This commit is contained in:
parent
93488dfe1e
commit
a9f964094a
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Provides:
|
Provides:
|
||||||
initialize_signal_handler();
|
initialize_signal_handler(GCTYPE *gc)
|
||||||
remove_signal_handler();
|
remove_signal_handler();
|
||||||
Requires:
|
Requires:
|
||||||
generations_available - mutable int, Windows only
|
generations_available - mutable int, Windows only
|
||||||
|
@ -147,7 +147,11 @@ void fault_handler(int sn, siginfo_t *si, void *ctx)
|
||||||
static void initialize_signal_handler(GCTYPE *gc)
|
static void initialize_signal_handler(GCTYPE *gc)
|
||||||
{
|
{
|
||||||
# ifdef NEED_OSX_MACH_HANDLER
|
# ifdef NEED_OSX_MACH_HANDLER
|
||||||
macosx_init_exception_handler();
|
# if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC)
|
||||||
|
macosx_init_exception_handler(MASTERGC == 0);
|
||||||
|
# else
|
||||||
|
macosx_init_exception_handler(1);
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifdef NEED_SIGACTION
|
# ifdef NEED_SIGACTION
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,6 +35,64 @@ static int designate_modified(void *p);
|
||||||
int designate_modified(void *p);
|
int designate_modified(void *p);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MZ_USE_PLACES) && defined (MZ_PRECISE_GC)
|
||||||
|
typedef struct OSXThreadData {
|
||||||
|
struct OSXThreadData *next;
|
||||||
|
mach_port_t thread_port_id;
|
||||||
|
Thread_Local_Variables *tlvs;
|
||||||
|
} OSXThreadData;
|
||||||
|
|
||||||
|
/* static const int OSX_THREAD_TABLE_SIZE = 256; */
|
||||||
|
#define OSX_THREAD_TABLE_SIZE 256
|
||||||
|
static OSXThreadData *osxthreads[OSX_THREAD_TABLE_SIZE];
|
||||||
|
static pthread_mutex_t osxthreadsmutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
static Thread_Local_Variables *get_mach_thread_tlvs(mach_port_t threadid) {
|
||||||
|
int index = threadid % OSX_THREAD_TABLE_SIZE;
|
||||||
|
OSXThreadData *thread;
|
||||||
|
Thread_Local_Variables *tlvs = NULL;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&osxthreadsmutex);
|
||||||
|
{
|
||||||
|
for (thread = osxthreads[index]; thread; thread = thread->next)
|
||||||
|
{
|
||||||
|
if (thread->thread_port_id == threadid) {
|
||||||
|
tlvs = thread->tlvs;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&osxthreadsmutex);
|
||||||
|
|
||||||
|
return tlvs;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_thread_locals_from_mach_thread_id(mach_port_t threadid) {
|
||||||
|
Thread_Local_Variables *tlvs = get_mach_thread_tlvs(threadid);
|
||||||
|
#ifdef USE_THREAD_LOCAL
|
||||||
|
pthread_setspecific(scheme_thread_local_key, tlvs);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void register_mach_thread() {
|
||||||
|
mach_port_t thread_self = mach_thread_self();
|
||||||
|
int index = thread_self % OSX_THREAD_TABLE_SIZE;
|
||||||
|
OSXThreadData * thread = malloc(sizeof(OSXThreadData));
|
||||||
|
|
||||||
|
thread->thread_port_id = thread_self;
|
||||||
|
thread->tlvs = scheme_get_thread_local_variables();
|
||||||
|
|
||||||
|
/* PUSH thread record onto osxthreads datastructure */
|
||||||
|
pthread_mutex_lock(&osxthreadsmutex);
|
||||||
|
{
|
||||||
|
thread->next = osxthreads[index];
|
||||||
|
osxthreads[index] = thread;
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&osxthreadsmutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__POWERPC__)
|
#if defined(__POWERPC__)
|
||||||
# define ARCH_thread_state_t ppc_thread_state_t
|
# define ARCH_thread_state_t ppc_thread_state_t
|
||||||
# define ARCH_THREAD_STATE PPC_THREAD_STATE
|
# define ARCH_THREAD_STATE PPC_THREAD_STATE
|
||||||
|
@ -227,6 +285,11 @@ kern_return_t GC_catch_exception_raise(mach_port_t port,
|
||||||
&exc_state_count);
|
&exc_state_count);
|
||||||
p = (void *)exc_state.__faultvaddr;
|
p = (void *)exc_state.__faultvaddr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MZ_USE_PLACES) && defined (MZ_PRECISE_GC)
|
||||||
|
set_thread_locals_from_mach_thread_id(thread_port);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (designate_modified(p))
|
if (designate_modified(p))
|
||||||
return KERN_SUCCESS;
|
return KERN_SUCCESS;
|
||||||
else
|
else
|
||||||
|
@ -306,14 +369,22 @@ void GC_attach_current_thread_exceptions_to_handler()
|
||||||
GCPRINT(GCOUTF, "Couldn't set exception ports: %s\n", mach_error_string(retval));
|
GCPRINT(GCOUTF, "Couldn't set exception ports: %s\n", mach_error_string(retval));
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
#if defined(MZ_USE_PLACES) && defined (MZ_PRECISE_GC)
|
||||||
|
register_mach_thread();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this initializes the subsystem (sets the exception port, starts the
|
/* this initializes the subsystem (sets the exception port, starts the
|
||||||
exception handling thread, etc) */
|
exception handling thread, etc) */
|
||||||
static void macosx_init_exception_handler()
|
static void macosx_init_exception_handler(int isMASTERGC)
|
||||||
{
|
{
|
||||||
kern_return_t retval;
|
kern_return_t retval;
|
||||||
|
|
||||||
|
if (!isMASTERGC) {
|
||||||
|
GC_attach_current_thread_exceptions_to_handler();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(!task_self) task_self = mach_task_self();
|
if(!task_self) task_self = mach_task_self();
|
||||||
|
|
||||||
/* allocate the port we're going to get exceptions on */
|
/* allocate the port we're going to get exceptions on */
|
||||||
|
|
|
@ -196,6 +196,17 @@ mz_proc_thread* mzrt_proc_first_thread_init() {
|
||||||
|
|
||||||
mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start start_proc, void* data) {
|
mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start start_proc, void* data) {
|
||||||
mz_proc_thread *thread = (mz_proc_thread*)malloc(sizeof(mz_proc_thread));
|
mz_proc_thread *thread = (mz_proc_thread*)malloc(sizeof(mz_proc_thread));
|
||||||
|
pthread_attr_t *attr;
|
||||||
|
|
||||||
|
#ifdef OS_X
|
||||||
|
pthread_attr_t attr_storage;
|
||||||
|
attr = &attr_storage;
|
||||||
|
pthread_attr_init(attr);
|
||||||
|
pthread_attr_setstacksize(attr, 8*1024*1024); /*8MB*/
|
||||||
|
#else
|
||||||
|
attr = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MZ_PRECISE_GC
|
#ifdef MZ_PRECISE_GC
|
||||||
mzrt_thread_stub_data *stub_data = (mzrt_thread_stub_data*)malloc(sizeof(mzrt_thread_stub_data));
|
mzrt_thread_stub_data *stub_data = (mzrt_thread_stub_data*)malloc(sizeof(mzrt_thread_stub_data));
|
||||||
thread->mbox = pt_mbox_create();
|
thread->mbox = pt_mbox_create();
|
||||||
|
@ -205,13 +216,13 @@ mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start start_proc, void* dat
|
||||||
# ifdef WIN32
|
# ifdef WIN32
|
||||||
thread->threadid = CreateThread(NULL, 0, start_proc, data, 0, NULL);
|
thread->threadid = CreateThread(NULL, 0, start_proc, data, 0, NULL);
|
||||||
# else
|
# else
|
||||||
pthread_create(&thread->threadid, NULL, mzrt_thread_stub, stub_data);
|
pthread_create(&thread->threadid, attr, mzrt_thread_stub, stub_data);
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# ifdef WIN32
|
# ifdef WIN32
|
||||||
thread->threadid = GC_CreateThread(NULL, 0, start_proc, data, 0, NULL);
|
thread->threadid = GC_CreateThread(NULL, 0, start_proc, data, 0, NULL);
|
||||||
# else
|
# else
|
||||||
GC_pthread_create(&thread->threadid, NULL, start_proc, data);
|
GC_pthread_create(&thread->threadid, attr, start_proc, data);
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
return thread;
|
return thread;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user