@@ -21,22 +21,22 @@ #import "runtime.h" #import "runtime-private.h" #import "OFObject.h" +#import "globals.h" +#define property_locks objc_globals.property_locks + #ifdef OF_HAVE_THREADS # import "threading.h" -# define NUM_SPINLOCKS 8 /* needs to be a power of 2 */ -# define SPINLOCK_HASH(p) ((unsigned)((uintptr_t)p >> 4) & (NUM_SPINLOCKS - 1)) -static of_spinlock_t spinlocks[NUM_SPINLOCKS]; -#endif +# define SPINLOCK_HASH(p) \ + ((unsigned)((uintptr_t)p >> 4) & (NUM_PROPERTY_LOCKS - 1)) -#ifdef OF_HAVE_THREADS OF_CONSTRUCTOR() { - for (size_t i = 0; i < NUM_SPINLOCKS; i++) - if (!of_spinlock_new(&spinlocks[i])) + for (size_t i = 0; i < NUM_PROPERTY_LOCKS; i++) + if (!of_spinlock_new(&property_locks[i])) OBJC_ERROR("Failed to initialize spinlocks!") } #endif id @@ -45,15 +45,15 @@ if (atomic) { id *ptr = (id *)(void *)((char *)self + offset); #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(ptr); - OF_ENSURE(of_spinlock_lock(&spinlocks[hash])); + OF_ENSURE(of_spinlock_lock(&property_locks[hash])); @try { return [[*ptr retain] autorelease]; } @finally { - OF_ENSURE(of_spinlock_unlock(&spinlocks[hash])); + OF_ENSURE(of_spinlock_unlock(&property_locks[hash])); } #else return [[*ptr retain] autorelease]; #endif } @@ -68,11 +68,11 @@ if (atomic) { id *ptr = (id *)(void *)((char *)self + offset); #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(ptr); - OF_ENSURE(of_spinlock_lock(&spinlocks[hash])); + OF_ENSURE(of_spinlock_lock(&property_locks[hash])); @try { #endif id old = *ptr; switch (copy) { @@ -87,11 +87,11 @@ } [old release]; #ifdef OF_HAVE_THREADS } @finally { - OF_ENSURE(of_spinlock_unlock(&spinlocks[hash])); + OF_ENSURE(of_spinlock_unlock(&property_locks[hash])); } #endif return; } @@ -120,15 +120,15 @@ { if (atomic) { #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(src); - OF_ENSURE(of_spinlock_lock(&spinlocks[hash])); + OF_ENSURE(of_spinlock_lock(&property_locks[hash])); #endif memcpy(dest, src, size); #ifdef OF_HAVE_THREADS - OF_ENSURE(of_spinlock_unlock(&spinlocks[hash])); + OF_ENSURE(of_spinlock_unlock(&property_locks[hash])); #endif return; } @@ -141,17 +141,17 @@ { if (atomic) { #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(src); - OF_ENSURE(of_spinlock_lock(&spinlocks[hash])); + OF_ENSURE(of_spinlock_lock(&property_locks[hash])); #endif memcpy(dest, src, size); #ifdef OF_HAVE_THREADS - OF_ENSURE(of_spinlock_unlock(&spinlocks[hash])); + OF_ENSURE(of_spinlock_unlock(&property_locks[hash])); #endif return; } memcpy(dest, src, size); }