Overview
Comment: | OFThread: Don't require of_thread_exit()
Some systems do not provide the functionality. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
b5430ac44f519f282b21beb5737749bc |
User & Date: | js on 2019-07-28 12:32:21 |
Other Links: | manifest | tags |
Context
2019-08-01
| ||
20:14 | Split threading.[hm] into multiple files check-in: 5358e9ea6a user: js tags: trunk | |
2019-07-28
| ||
12:32 | OFThread: Don't require of_thread_exit() check-in: b5430ac44f user: js tags: trunk | |
09:27 | Replace custom code for MorphOS with stat() check-in: 1cf09c3b58 user: js tags: trunk | |
Changes
Modified src/OFThread.h from [5c37148b66] to [deb7104407].
︙ | ︙ | |||
10 11 12 13 14 15 16 17 18 19 20 21 22 23 | * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" #ifdef OF_HAVE_THREADS # import "threading.h" #endif | > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include <setjmp.h> #import "OFObject.h" #ifdef OF_HAVE_THREADS # import "threading.h" #endif |
︙ | ︙ | |||
68 69 70 71 72 73 74 75 76 77 78 79 80 81 | OF_THREAD_RUNNING, OF_THREAD_WAITING_FOR_JOIN } _running; void *_pool; # ifdef OF_HAVE_BLOCKS of_thread_block_t _Nullable _threadBlock; # endif id _returnValue; OFRunLoop *_Nullable _runLoop; OFMutableDictionary *_threadDictionary; @private OFString *_Nullable _name; # ifdef OF_HAVE_SOCKETS OFDNSResolver *_DNSResolver; | > | 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | OF_THREAD_RUNNING, OF_THREAD_WAITING_FOR_JOIN } _running; void *_pool; # ifdef OF_HAVE_BLOCKS of_thread_block_t _Nullable _threadBlock; # endif jmp_buf _exitEnv; id _returnValue; OFRunLoop *_Nullable _runLoop; OFMutableDictionary *_threadDictionary; @private OFString *_Nullable _name; # ifdef OF_HAVE_SOCKETS OFDNSResolver *_DNSResolver; |
︙ | ︙ |
Modified src/OFThread.m from [67db96fe50] to [0906d8e684].
︙ | ︙ | |||
131 132 133 134 135 136 137 | of_thread_set_name( [name cStringWithEncoding: [OFLocale encoding]]); else of_thread_set_name(object_getClassName(thread)); /* * Nasty workaround for thread implementations which can't return a | | > | | | | > | 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | of_thread_set_name( [name cStringWithEncoding: [OFLocale encoding]]); else of_thread_set_name(object_getClassName(thread)); /* * Nasty workaround for thread implementations which can't return a * pointer on join, or don't have a way to exit a thread. */ if (setjmp(thread->_exitEnv) == 0) { # 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; objc_autoreleasePoolPop(thread->_pool); [OFAutoreleasePool of_handleThreadTermination]; |
︙ | ︙ | |||
323 324 325 326 327 328 329 | OF_UNREACHABLE } + (void)terminateWithObject: (id)object { OFThread *thread = of_tlskey_get(threadSelfKey); | | < < | < < < | < < < < < | 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 | OF_UNREACHABLE } + (void)terminateWithObject: (id)object { OFThread *thread = of_tlskey_get(threadSelfKey); OF_ENSURE(thread != nil); thread->_returnValue = [object retain]; longjmp(thread->_exitEnv, 1); } + (void)setName: (OFString *)name { [OFThread currentThread].name = name; if (name != nil) |
︙ | ︙ |
Modified src/threading.h from [dfd5b7db22] to [3939aad58d].
︙ | ︙ | |||
92 93 94 95 96 97 98 | extern bool of_thread_attr_init(of_thread_attr_t *attr); extern bool of_thread_new(of_thread_t *thread, void (*function)(id), id object, const of_thread_attr_t *attr); extern void of_thread_set_name(const char *name); extern bool of_thread_join(of_thread_t thread); extern bool of_thread_detach(of_thread_t thread); | < | 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | extern bool of_thread_attr_init(of_thread_attr_t *attr); extern bool of_thread_new(of_thread_t *thread, void (*function)(id), id object, const of_thread_attr_t *attr); extern void of_thread_set_name(const char *name); extern bool of_thread_join(of_thread_t thread); extern bool of_thread_detach(of_thread_t thread); extern void of_once(of_once_t *control, void (*func)(void)); extern bool of_tlskey_new(of_tlskey_t *key); extern bool of_tlskey_free(of_tlskey_t key); extern bool of_mutex_new(of_mutex_t *mutex); extern bool of_mutex_lock(of_mutex_t *mutex); extern bool of_mutex_trylock(of_mutex_t *mutex); extern bool of_mutex_unlock(of_mutex_t *mutex); |
︙ | ︙ |
Modified src/threading_pthread.m from [f1eefca76d] to [45235a8a16].
︙ | ︙ | |||
175 176 177 178 179 180 181 | bool of_thread_detach(of_thread_t thread) { return (pthread_detach(thread) == 0); } | < < < < < < < < | 175 176 177 178 179 180 181 182 183 184 185 186 187 188 | bool of_thread_detach(of_thread_t thread) { return (pthread_detach(thread) == 0); } void of_thread_set_name(const char *name) { #if defined(OF_HAIKU) rename_thread(find_thread(NULL), name); #elif defined(HAVE_PTHREAD_SET_NAME_NP) pthread_set_name_np(pthread_self(), name); |
︙ | ︙ |
Modified src/threading_winapi.m from [5c88d5e359] to [8b9c6a4ff4].
︙ | ︙ | |||
74 75 76 77 78 79 80 | bool of_thread_detach(of_thread_t thread) { /* FIXME */ return true; } | < < < < < < < < | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | bool of_thread_detach(of_thread_t thread) { /* FIXME */ return true; } void of_thread_set_name(const char *name) { } bool of_tlskey_new(of_tlskey_t *key) |
︙ | ︙ |