ObjFW  Check-in [2be191ec57]

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: 2be191ec575779c705b30d8a49e75888be2102a1108c7486f20f1885fec68ddb
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
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

#include "config.h"

#import <objc/objc.h>

#import "OFExceptions.h"







id
objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic)
{
	if (atomic) {
		@synchronized (self) {
			id ptr = *(id*)((char*)self + offset);





			return [[ptr retain] autorelease];


		}
	}

	return *(id*)((char*)self + offset);
}

void
objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id value, BOOL atomic,
    BOOL copy)
{
	if (atomic) {
		@synchronized ((atomic ? self : nil)) {
			id *ptr = (id*)((char*)self + offset);





			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];



			return;
		}

	}

	id *ptr = (id*)((char*)self + offset);
	id old = *ptr;

	switch (copy) {
	case 0:







>
>
>
>
>
>




<
|
>
>
>
>
>
|
>
>











<
|
>
>
>
>
>



















>
>
|
<
|
>







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: