Overview
| Comment: | Use spinlocks in objc_properties.m. |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
2be191ec575779c705b30d8a49e75888 |
| User & Date: | js on 2010-01-25 22:40:58 |
| Other Links: | manifest | tags |
Context
|
2010-01-29
| ||
| 15:21 | Make retain count int32_t. (check-in: b725e983ae user: js tags: trunk) | |
|
2010-01-25
| ||
| 22:40 | Use spinlocks in objc_properties.m. (check-in: 2be191ec57 user: js tags: trunk) | |
| 22:39 | Add of_atomic_cmpswap32 and spinlocks to atomic.h. (check-in: 212482d8c6 user: js tags: trunk) | |
Changes
Modified src/objc_properties.m from [14cd33968d] to [684035ffa6].
| ︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 |
#include "config.h"
#import <objc/objc.h>
#import "OFExceptions.h"
id
objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic)
{
if (atomic) {
| > > > > > > < | > > > > > | > > < | > > > > > > > | < | > | 11 12 13 14 15 16 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 |
#include "config.h"
#import <objc/objc.h>
#import "OFExceptions.h"
#import "atomic.h"
#define NUM_SPINLOCKS 8 /* needs to be a power of 2 */
#define SPINLOCK_HASH(p) ((uintptr_t)p >> 4) & (NUM_SPINLOCKS - 1)
static of_spinlock_t spinlocks[NUM_SPINLOCKS] = {};
id
objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic)
{
if (atomic) {
id *ptr = (id*)((char*)self + offset);
unsigned hash = SPINLOCK_HASH(ptr);
of_spinlock_lock(spinlocks[hash]);
@try {
return [[*ptr retain] autorelease];
} @finally {
of_spinlock_unlock(spinlocks[hash]);
}
}
return *(id*)((char*)self + offset);
}
void
objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id value, BOOL atomic,
BOOL copy)
{
if (atomic) {
id *ptr = (id*)((char*)self + offset);
unsigned hash = SPINLOCK_HASH(ptr);
of_spinlock_lock(spinlocks[hash]);
@try {
id old = *ptr;
switch (copy) {
case 0:
*ptr = [value retain];
break;
case 2:
/*
* Apple uses this to indicate that the copy
* should be mutable. Please hit them for
* abusing a poor BOOL!
*/
*ptr = [value mutableCopy];
break;
default:
*ptr = [value copy];
}
[old release];
} @finally {
of_spinlock_unlock(spinlocks[hash]);
}
return;
}
id *ptr = (id*)((char*)self + offset);
id old = *ptr;
switch (copy) {
case 0:
|
| ︙ | ︙ |