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
}
|
| ︙ | ︙ |