40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
+
|
#import "OFThread.h"
#import "OFThread+Private.h"
#import "OFRunLoop.h"
#import "OFList.h"
#import "OFDate.h"
#import "OFDictionary.h"
#import "OFAutoreleasePool.h"
#import "OFAutoreleasePool+Private.h"
#ifdef _WIN32
# include <windows.h>
#endif
#import "OFInitializationFailedException.h"
#import "OFInvalidArgumentException.h"
|
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
|
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
|
-
+
-
-
-
-
-
-
-
+
-
+
|
{
OFThread *thread = (OFThread*)object;
if (!of_tlskey_set(threadSelfKey, thread))
@throw [OFInitializationFailedException
exceptionWithClass: [thread class]];
objc_autoreleasePoolPush();
thread->_pool = objc_autoreleasePoolPush();
/*
* Nasty workaround for thread implementations which can't return a
* value on join.
*/
# ifdef OF_HAVE_BLOCKS
if (thread->_threadBlock != NULL)
thread->_returnValue = [thread->_threadBlock() retain];
else
# endif
thread->_returnValue = [[thread main] retain];
[thread handleTermination];
thread->_running = OF_THREAD_WAITING_FOR_JOIN;
# ifdef OF_OBJFW_RUNTIME
/*
* As the values returned by objc_autoreleasePoolPush() in the ObjFW
* runtime are not actually pointers, but sequential numbers, 0 means
* we pop everything.
*/
objc_autoreleasePoolPop(0);
objc_autoreleasePoolPop(thread->_pool);
# endif
[OFAutoreleasePool OF_handleThreadTermination];
[thread release];
return 0;
}
static void
|
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
|
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
|
-
-
-
-
-
-
-
+
-
+
|
thread->_returnValue = [object retain];
[thread handleTermination];
thread->_running = OF_THREAD_WAITING_FOR_JOIN;
}
# ifdef OF_OBJFW_RUNTIME
/*
* As the values returned by objc_autoreleasePoolPush() in the ObjFW
* runtime are not actually pointers, but sequential numbers, 0 means
* we pop everything.
*/
objc_autoreleasePoolPop(0);
objc_autoreleasePoolPop(thread->_pool);
# endif
[OFAutoreleasePool OF_handleThreadTermination];
[thread release];
of_thread_exit();
}
+ (void)OF_createMainThread
|