nixpkgs/pkgs/os-specific/darwin/apple-source-releases/objc4/spinlocks.patch

108 lines
3.1 KiB
Diff

--- objc4-551.1/runtime/objc-os.h 2013-06-10 21:16:15.000000000 -0400
+++ ../objc4-551.1/runtime/objc-os.h 2015-01-19 01:01:36.000000000 -0500
@@ -77,27 +77,72 @@
# include <mach-o/getsect.h>
# include <mach-o/dyld_priv.h>
# include <malloc/malloc.h>
-# include <os/lock_private.h>
# include <libkern/OSAtomic.h>
# include <libkern/OSCacheControl.h>
-# include <System/pthread_machdep.h>
# include "objc-probes.h" // generated dtrace probe definitions.
+#define __PTK_FRAMEWORK_OBJC_KEY5 45
+#define __PTK_FRAMEWORK_OBJC_KEY6 46
+#define __PTK_FRAMEWORK_OBJC_KEY7 47
+#define __PTK_FRAMEWORK_OBJC_KEY8 48
+#define __PTK_FRAMEWORK_OBJC_KEY9 49
+
+extern "C" int pthread_key_init_np(int, void (*)(void *));
+
// Some libc functions call objc_msgSend()
// so we can't use them without deadlocks.
void syslog(int, const char *, ...) UNAVAILABLE_ATTRIBUTE;
void vsyslog(int, const char *, va_list) UNAVAILABLE_ATTRIBUTE;
+#if defined(__i386__) || defined(__x86_64__)
+
+// Inlined spinlock.
+// Not for arm on iOS because it hurts uniprocessor performance.
+
+#define ARR_SPINLOCK_INIT 0
+// XXX -- Careful: OSSpinLock isn't volatile, but should be
+typedef volatile int ARRSpinLock;
+__attribute__((always_inline))
+static inline void ARRSpinLockLock(ARRSpinLock *l)
+{
+ unsigned y;
+again:
+ if (__builtin_expect(__sync_lock_test_and_set(l, 1), 0) == 0) {
+ return;
+ }
+ for (y = 1000; y; y--) {
+#if defined(__i386__) || defined(__x86_64__)
+ asm("pause");
+#endif
+ if (*l == 0) goto again;
+ }
+ thread_switch(THREAD_NULL, SWITCH_OPTION_DEPRESS, 1);
+ goto again;
+}
+__attribute__((always_inline))
+static inline void ARRSpinLockUnlock(ARRSpinLock *l)
+{
+ __sync_lock_release(l);
+}
+__attribute__((always_inline))
+static inline int ARRSpinLockTry(ARRSpinLock *l)
+{
+ return __sync_bool_compare_and_swap(l, 0, 1);
+}
+
+#define spinlock_t ARRSpinLock
+#define spinlock_trylock(l) ARRSpinLockTry(l)
+#define spinlock_lock(l) ARRSpinLockLock(l)
+#define spinlock_unlock(l) ARRSpinLockUnlock(l)
+#define SPINLOCK_INITIALIZER ARR_SPINLOCK_INIT
-#define spinlock_t os_lock_handoff_s
-#define spinlock_trylock(l) os_lock_trylock(l)
-#define spinlock_lock(l) os_lock_lock(l)
-#define spinlock_unlock(l) os_lock_unlock(l)
-#define SPINLOCK_INITIALIZER OS_LOCK_HANDOFF_INIT
+#endif
#if !TARGET_OS_IPHONE
-# include <CrashReporterClient.h>
+#define CRSetCrashLogMessage(msg)
+#define CRGetCrashLogMessage() 0
+#define CRSetCrashLogMessage2(msg)
#else
// CrashReporterClient not yet available on iOS
__BEGIN_DECLS
@@ -594,21 +639,13 @@
{
assert(is_valid_direct_key(k));
- if (_pthread_has_direct_tsd()) {
- return _pthread_getspecific_direct(k);
- } else {
- return pthread_getspecific(k);
- }
+ return pthread_getspecific(k);
}
static inline void tls_set_direct(tls_key_t k, void *value)
{
assert(is_valid_direct_key(k));
- if (_pthread_has_direct_tsd()) {
- _pthread_setspecific_direct(k, value);
- } else {
- pthread_setspecific(k, value);
- }
+ pthread_setspecific(k, value);
}
// not arm