#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
return 0;
}
+#endif
+
/*
Returns a recursive mutex that is safe under suspension.
#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);