Fix the build after the signals changes.
[mono.git] / mono / utils / mono-mutex.c
index 6d5796e220a44dfd8be8cfd2e6fb227d3387af0e..6abad5756b0a8fea1204a675ec34425ded02cdb5 100644 (file)
 #include <string.h>
 #include <errno.h>
 #include <assert.h>
+#include <mono/utils/mono-memory-model.h>
+
+#ifndef HOST_WIN32
 #include <sys/time.h>
+#endif
 
 #include "mono-mutex.h"
 
+#ifndef HOST_WIN32
+
 #if defined(__APPLE__)
 #define _DARWIN_C_SOURCE
 #include <pthread_spis.h>
+#include <dlfcn.h>
 #endif
 
 #ifndef HAVE_PTHREAD_MUTEX_TIMEDLOCK
@@ -88,6 +95,8 @@ mono_once (mono_once_t *once, void (*once_init) (void))
        return 0;
 }
 
+#endif
+
 /*
 Returns a recursive mutex that is safe under suspension.
 
@@ -127,10 +136,18 @@ mono_mutex_init_suspend_safe (mono_mutex_t *mutex)
 #if defined(__APPLE__)
        int res;
        pthread_mutexattr_t attr;
+       static gboolean inited;
+       static int (*setpolicy_np) (pthread_mutexattr_t *, int);
+
+       if (!inited) {
+               setpolicy_np = dlsym (RTLD_NEXT, "pthread_mutexattr_setpolicy_np");
+               mono_atomic_store_release (&inited, TRUE);
+       }
 
        pthread_mutexattr_init (&attr);
        pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
-       pthread_mutexattr_setpolicy_np (&attr, _PTHREAD_MUTEX_POLICY_FIRSTFIT);
+       if (setpolicy_np)
+               setpolicy_np (&attr, _PTHREAD_MUTEX_POLICY_FIRSTFIT);
        res = pthread_mutex_init (mutex, &attr);
        pthread_mutexattr_destroy (&attr);