#include <sys/time.h>
#endif
-#ifdef HAVE_VALGRIND_MEMCHECK_H
-#include <valgrind/memcheck.h>
-#endif
-
#include <mono/metadata/assembly.h>
#include <mono/metadata/loader.h>
#include <mono/metadata/tabledefs.h>
#include <mono/metadata/mono-config.h>
#include <mono/metadata/environment.h>
#include <mono/metadata/mono-debug.h>
-#include <mono/metadata/gc-internal.h>
#include <mono/metadata/threads-types.h>
#include <mono/metadata/verify.h>
#include <mono/metadata/verify-internals.h>
#include <mono/metadata/mempool-internals.h>
#include <mono/metadata/attach.h>
+#include <mono/metadata/gc-internal.h>
#include <mono/utils/mono-math.h>
#include <mono/utils/mono-compiler.h>
#include <mono/utils/mono-counters.h>
-#include <mono/utils/mono-logger.h>
+#include <mono/utils/mono-logger-internal.h>
#include <mono/utils/mono-mmap.h>
#include <mono/utils/dtrace.h>
#include <mach/exception.h>
#include <mach/task.h>
#include <pthread.h>
-
-#ifdef HAVE_SGEN_GC
-#undef pthread_create
-#undef pthread_join
-#undef pthread_detach
-#endif
+#include <dlfcn.h>
/*
* This code disables the CrashReporter of MacOS X by installing
mach_exception_port,
EXCEPTION_DEFAULT,
MACHINE_THREAD_STATE) == KERN_SUCCESS);
+
+ mono_gc_register_mach_exception_thread (thread);
}
+/* This is #define'd by Boehm GC to _GC_dlopen. */
+#undef dlopen
+
void
mono_runtime_install_handlers (void)
{
macosx_register_exception_handler ();
mono_runtime_posix_install_handlers ();
+
+ /* Snow Leopard has a horrible bug: http://openradar.appspot.com/7209349
+ * This causes obscure SIGTRAP's for any application that comes across this built on
+ * Snow Leopard. This is a horrible hack to ensure that the private __CFInitialize
+ * is run on the main thread, so that we don't get SIGTRAPs later
+ */
+#if defined (__APPLE__) && (defined (__i386__) || defined (__x86_64__))
+ {
+ void *handle = dlopen ("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", RTLD_LAZY);
+ if (handle == NULL)
+ return;
+
+ dlclose (handle);
+ }
+#endif
}
pid_t
mono_runtime_syscall_fork ()
{
-#if defined(__i386__)
- /* Apple's fork syscall returns a regpair in EAX:EDX.
- * EAX == pid of caller always
- * EDX == 0 for parent, 1 for child
- */
- register_t eax;
- register_t edx;
- pid_t pid;
-
- __asm__ __volatile__ (
- "mov $0x2, %%eax;"
- "int $0x80;"
- "mov %%eax, %0;"
- "mov %%edx, %1;"
- : "=m" (eax), "=m" (edx));
-
- if (edx == 0) {
- pid = eax;
- } else if (edx == 1) {
- pid = 0;
- } else {
- g_assert_not_reached ();
- }
-
- return pid;
-#else
- g_assert_not_reached ();
-#endif
+ return (pid_t) fork ();
}
gboolean