Overview
Comment: | Rename of_atomic_*32 to of_atomic_*_32 and add of_atomic_cmpswap_ptr. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
4e1ab534038b8d80ed93bece91728c9d |
User & Date: | js on 2010-02-05 14:03:11 |
Other Links: | manifest | tags |
Context
2010-02-05
| ||
22:16 | Conditional imports in ObjFW.h. check-in: a5c1129e8d user: js tags: trunk | |
14:03 | Rename of_atomic_*32 to of_atomic_*_32 and add of_atomic_cmpswap_ptr. check-in: 4e1ab53403 user: js tags: trunk | |
14:00 | Small optimization for -[componentsJoinedByString:]. check-in: 0ccbebce04 user: js tags: trunk | |
Changes
Modified src/OFObject.m from [747590c79e] to [a529b1aaf1].
︙ | ︙ | |||
498 499 500 501 502 503 504 | @throw [OFMemoryNotPartOfObjectException newWithClass: isa pointer: ptr]; } - retain { #ifdef OF_ATOMIC_OPS | | | | 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 | @throw [OFMemoryNotPartOfObjectException newWithClass: isa pointer: ptr]; } - retain { #ifdef OF_ATOMIC_OPS of_atomic_inc_32(&PRE_IVAR->retain_count); #else assert(of_spinlock_lock(&PRE_IVAR->retain_spinlock)); PRE_IVAR->retain_count++; assert(of_spinlock_unlock(&PRE_IVAR->retain_spinlock)); #endif return self; } - (size_t)retainCount { assert(PRE_IVAR->retain_count >= 0); return (size_t)PRE_IVAR->retain_count; } - (void)release { #ifdef OF_ATOMIC_OPS if (of_atomic_dec_32(&PRE_IVAR->retain_count) <= 0) [self dealloc]; #else size_t c; assert(of_spinlock_lock(&PRE_IVAR->retain_spinlock)); c = --PRE_IVAR->retain_count; assert(of_spinlock_unlock(&PRE_IVAR->retain_spinlock)); |
︙ | ︙ |
Modified src/atomic.h from [9244f42746] to [9d7b0c4eb9].
︙ | ︙ | |||
17 18 19 20 21 22 23 | #endif #ifdef OF_HAVE_LIBKERN_OSATOMIC_H # include <libkern/OSAtomic.h> #endif static OF_INLINE int32_t | | | | | | | | | > > > > > > > > > > > > > > > > > | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | #endif #ifdef OF_HAVE_LIBKERN_OSATOMIC_H # include <libkern/OSAtomic.h> #endif static OF_INLINE int32_t of_atomic_add_32(volatile int32_t *p, int32_t i) { #if !defined(OF_THREADS) return (*p += i); #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_add_and_fetch(p, i); #elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) return OSAtomicAdd32Barrier(i, p); #endif } static OF_INLINE int32_t of_atomic_sub_32(volatile int32_t *p, int32_t i) { #if !defined(OF_THREADS) return (*p -= i); #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_sub_and_fetch(p, i); #elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) return OSAtomicAdd32Barrier(-i, p); #endif } static OF_INLINE int32_t of_atomic_inc_32(volatile int32_t *p) { #if !defined(OF_THREADS) return ++*p; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_add_and_fetch(p, 1); #elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) return OSAtomicIncrement32Barrier(p); #endif } static OF_INLINE int32_t of_atomic_dec_32(volatile int32_t *p) { #if !defined(OF_THREADS) return --*p; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_sub_and_fetch(p, 1); #elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) return OSAtomicDecrement32Barrier(p); #endif } static OF_INLINE uint32_t of_atomic_or_32(volatile uint32_t *p, uint32_t i) { #if !defined(OF_THREADS) return (*p |= i); #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_or_and_fetch(p, i); #elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) return OSAtomicOr32Barrier(i, p); #endif } static OF_INLINE uint32_t of_atomic_and_32(volatile uint32_t *p, uint32_t i) { #if !defined(OF_THREADS) return (*p &= i); #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_and_and_fetch(p, i); #elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) return OSAtomicAnd32Barrier(i, p); #endif } static OF_INLINE uint32_t of_atomic_xor_32(volatile uint32_t *p, uint32_t i) { #if !defined(OF_THREADS) return (*p ^= i); #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_xor_and_fetch(p, i); #elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) return OSAtomicXor32Barrier(i, p); #endif } static OF_INLINE BOOL of_atomic_cmpswap_32(volatile int32_t *p, int32_t o, int32_t n) { #if !defined(OF_THREADS) if (*p == o) { *p = n; return YES; } return NO; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_bool_compare_and_swap(p, o, n); #elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) return OSAtomicCompareAndSwap32Barrier(o, n, p); #endif } static OF_INLINE BOOL of_atomic_cmpswap_ptr(void* volatile *p, void *o, void *n) { #if !defined(OF_THREADS) if (*p == o) { *p = n; return YES; } return NO; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_bool_compare_and_swap(p, o, n); #elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) return OSAtomicCompareAndSwapPtrBarrier(o, n, p); #endif } |
Modified src/threading.h from [f03917fe6f] to [d98a519a69].
︙ | ︙ | |||
208 209 210 211 212 213 214 | #endif } static OF_INLINE BOOL of_spinlock_trylock(of_spinlock_t *s) { #if defined(OF_ATOMIC_OPS) | | | 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | #endif } static OF_INLINE BOOL of_spinlock_trylock(of_spinlock_t *s) { #if defined(OF_ATOMIC_OPS) return (of_atomic_cmpswap_32(s, 0, 1) ? YES : NO); #elif defined(OF_HAVE_PTHREAD_SPINLOCKS) return (pthread_spin_trylock(s) ? NO : YES); #else return of_mutex_trylock(s); #endif } |
︙ | ︙ | |||
238 239 240 241 242 243 244 | #endif } static OF_INLINE BOOL of_spinlock_unlock(of_spinlock_t *s) { #if defined(OF_ATOMIC_OPS) | | | 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 | #endif } static OF_INLINE BOOL of_spinlock_unlock(of_spinlock_t *s) { #if defined(OF_ATOMIC_OPS) of_atomic_and_32((uint32_t*)s, 0); return YES; #elif defined(OF_HAVE_PTHREAD_SPINLOCKS) return (pthread_spin_unlock(s) ? NO : YES); #else return of_mutex_unlock(s); #endif } |
︙ | ︙ |