ObjFW  Diff

Differences From Artifact [a1e7ea9f8c]:

To Artifact [90e1fd67d0]:


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







-
-
+
+









-
+



-
+


-
+









-
+



-
+






+
-
-
+
+

-
-
-
+
+
+

-
+

-
+






	of_list_object_t *iter;

	@synchronized (TLSKeys) {
		for (iter = [TLSKeys firstListObject]; iter != NULL;
		    iter = iter->next) {
			OFTLSKey *key = (OFTLSKey*)iter->object;

			if (key->destructor != NULL)
				key->destructor(iter->object);
			if (key->_destructor != NULL)
				key->_destructor(iter->object);
		}
	}
}

- init
{
	self = [super init];

	@try {
		if (!of_tlskey_new(&key))
		if (!of_tlskey_new(&_key))
			@throw [OFInitializationFailedException
			    exceptionWithClass: [self class]];

		initialized = YES;
		_initialized = YES;

		@synchronized (TLSKeys) {
			listObject = [TLSKeys appendObject: self];
			_listObject = [TLSKeys appendObject: self];
		}
	} @catch (id e) {
		[self release];
		@throw e;
	}

	return self;
}

- initWithDestructor: (void(*)(id))destructor_
- initWithDestructor: (void(*)(id))destructor
{
	self = [self init];

	destructor = destructor_;
	_destructor = destructor;

	return self;
}

- (void)dealloc
{
	if (_initialized) {
	if (destructor != NULL)
		destructor(self);
		if (_destructor != NULL)
			_destructor(self);

	if (initialized)
		of_tlskey_free(key);

		of_tlskey_free(_key);
	}

	/* In case we called [self release] in init */
	if (listObject != NULL) {
	if (_listObject != NULL) {
		@synchronized (TLSKeys) {
			[TLSKeys removeListObject: listObject];
			[TLSKeys removeListObject: _listObject];
		}
	}

	[super dealloc];
}
@end