Comment: | Split threading.[hm] into multiple files
This allows the runtime to only link against the parts it needs, without |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
5358e9ea6ac164a89342237f61d88849 |
User & Date: | js on 2019-08-01 20:14:35 |
Other Links: | manifest | tags |
2019-08-01
| ||
20:49 | .travis.yml: Update environments check-in: 1b5cca4b91 user: js tags: trunk | |
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 | |
Modified src/Makefile from [a542ed1b69] to [79f960eb72].
︙ | ︙ | |||
117 118 119 120 121 122 123 124 125 126 127 128 129 130 | OFZIPArchiveEntry.m \ base64.m \ crc16.m \ crc32.m \ huffman_tree.m \ of_asprintf.m \ of_strptime.m \ pbkdf2.m \ scrypt.m \ ${UNICODE_M} \ ${USE_SRCS_FILES} \ ${USE_SRCS_PLUGINS} \ ${USE_SRCS_SOCKETS} \ ${USE_SRCS_THREADS} \ | > | 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | OFZIPArchiveEntry.m \ base64.m \ crc16.m \ crc32.m \ huffman_tree.m \ of_asprintf.m \ of_strptime.m \ once.m \ pbkdf2.m \ scrypt.m \ ${UNICODE_M} \ ${USE_SRCS_FILES} \ ${USE_SRCS_PLUGINS} \ ${USE_SRCS_SOCKETS} \ ${USE_SRCS_THREADS} \ |
︙ | ︙ | |||
147 148 149 150 151 152 153 | OFTCPSocket.m \ OFUDPSocket.m \ socket.m SRCS_THREADS = OFCondition.m \ OFMutex.m \ OFRecursiveMutex.m \ OFThreadPool.m \ | > > | > | 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | OFTCPSocket.m \ OFUDPSocket.m \ socket.m SRCS_THREADS = OFCondition.m \ OFMutex.m \ OFRecursiveMutex.m \ OFThreadPool.m \ condition.m \ mutex.m \ thread.m \ tlskey.m SRCS_WINDOWS = OFWin32ConsoleStdIOStream.m \ OFWindowsRegistryKey.m INCLUDES_ATOMIC = atomic.h \ atomic_builtins.h \ atomic_no_threads.h \ atomic_osatomic.h \ |
︙ | ︙ |
Modified src/OFAutoreleasePool.m from [8f3a2dc0ae] to [966b634bbb].
︙ | ︙ | |||
17 18 19 20 21 22 23 | #include "config.h" #import "OFAutoreleasePool.h" #import "OFAutoreleasePool+Private.h" #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) | | | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include "config.h" #import "OFAutoreleasePool.h" #import "OFAutoreleasePool+Private.h" #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) # import "tlskey.h" # # import "OFInitializationFailedException.h" #endif #define MAX_CACHE_SIZE 0x20 #if defined(OF_HAVE_COMPILER_TLS) |
︙ | ︙ |
Modified src/OFBlock.m from [4165d94e90] to [acebb38475].
︙ | ︙ | |||
30 31 32 33 34 35 36 | # import "runtime/private.h" #endif #ifdef OF_HAVE_ATOMIC_OPS # import "atomic.h" #endif #ifdef OF_HAVE_THREADS | | | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | # import "runtime/private.h" #endif #ifdef OF_HAVE_ATOMIC_OPS # import "atomic.h" #endif #ifdef OF_HAVE_THREADS # import "mutex.h" #endif typedef struct of_block_byref_t of_block_byref_t; struct of_block_byref_t { Class isa; of_block_byref_t *forwarding; int flags; |
︙ | ︙ |
Modified src/OFCondition.h from [f84c7704e4] to [d32472266f].
︙ | ︙ | |||
12 13 14 15 16 17 18 19 20 21 22 23 24 25 | * 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 "OFMutex.h" OF_ASSUME_NONNULL_BEGIN @class OFDate; /*! * @class OFCondition OFCondition.h ObjFW/OFCondition.h | > > | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | * 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 "OFMutex.h" #import "condition.h" OF_ASSUME_NONNULL_BEGIN @class OFDate; /*! * @class OFCondition OFCondition.h ObjFW/OFCondition.h |
︙ | ︙ |
Modified src/OFMutex.h from [f9e2027d27] to [4b8e64a2be].
︙ | ︙ | |||
14 15 16 17 18 19 20 | * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" #import "OFLocking.h" | | | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" #import "OFLocking.h" #import "mutex.h" OF_ASSUME_NONNULL_BEGIN /*! * @class OFMutex OFMutex.h ObjFW/OFMutex.h * * @brief A class for creating mutual exclusions. |
︙ | ︙ |
Modified src/OFObject.m from [9fed2e9f2d] to [ea3b6b261c].
︙ | ︙ | |||
56 57 58 59 60 61 62 | #import "OFString.h" #import "instance.h" #if defined(OF_HAVE_ATOMIC_OPS) # import "atomic.h" #elif defined(OF_HAVE_THREADS) | | | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #import "OFString.h" #import "instance.h" #if defined(OF_HAVE_ATOMIC_OPS) # import "atomic.h" #elif defined(OF_HAVE_THREADS) # import "mutex.h" #endif #if defined(OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR) extern id of_forward(id, SEL, ...); extern struct stret of_forward_stret(id, SEL, ...); #else # define of_forward of_method_not_found |
︙ | ︙ |
Modified src/OFRecursiveMutex.h from [f7e792d83e] to [f3a0853f17].
︙ | ︙ | |||
14 15 16 17 18 19 20 | * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" #import "OFLocking.h" | | | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" #import "OFLocking.h" #import "mutex.h" OF_ASSUME_NONNULL_BEGIN /*! * @class OFRecursiveMutex OFRecursiveMutex.h ObjFW/OFRecursiveMutex.h * * @brief A class for creating mutual exclusions which can be entered |
︙ | ︙ |
Modified src/OFSecureData.m from [e075377cde] to [fa28a56f57].
︙ | ︙ | |||
30 31 32 33 34 35 36 | #import "OFInitializationFailedException.h" #import "OFInvalidArgumentException.h" #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" #ifdef OF_HAVE_THREADS | | | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #import "OFInitializationFailedException.h" #import "OFInvalidArgumentException.h" #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" #ifdef OF_HAVE_THREADS # import "tlskey.h" #endif #define CHUNK_SIZE 16 struct page { struct page *next, *previous; void *map; |
︙ | ︙ |
Modified src/OFSystemInfo.m from [9a78967309] to [f7d600acca].
︙ | ︙ | |||
48 49 50 51 52 53 54 | #import "OFArray.h" #import "OFDictionary.h" #import "OFLocale.h" #import "OFString.h" #import "OFNotImplementedException.h" | < | < | 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #import "OFArray.h" #import "OFDictionary.h" #import "OFLocale.h" #import "OFString.h" #import "OFNotImplementedException.h" #import "once.h" #if defined(OF_MACOS) || defined(OF_IOS) # ifdef HAVE_SYSDIR_H # include <sysdir.h> # endif #endif #ifdef OF_WINDOWS |
︙ | ︙ | |||
338 339 340 341 342 343 344 | + (unsigned int)ObjFWVersionMinor { return OBJFW_VERSION_MINOR; } + (OFString *)operatingSystemName { | < < < < < < < < < < < < < < < < | 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 | + (unsigned int)ObjFWVersionMinor { return OBJFW_VERSION_MINOR; } + (OFString *)operatingSystemName { static of_once_t onceControl = OF_ONCE_INIT; of_once(&onceControl, initOperatingSystemName); return operatingSystemName; } + (OFString *)operatingSystemVersion { static of_once_t onceControl = OF_ONCE_INIT; of_once(&onceControl, initOperatingSystemVersion); return operatingSystemVersion; } #ifdef OF_HAVE_FILES + (OFString *)userDataPath { |
︙ | ︙ |
Modified src/OFThread.h from [deb7104407] to [dc390a6e23].
︙ | ︙ | |||
16 17 18 19 20 21 22 | */ #include <setjmp.h> #import "OFObject.h" #ifdef OF_HAVE_THREADS | | | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | */ #include <setjmp.h> #import "OFObject.h" #ifdef OF_HAVE_THREADS # import "thread.h" #endif OF_ASSUME_NONNULL_BEGIN /*! @file */ @class OFDate; |
︙ | ︙ |
Modified src/OFThread.m from [0906d8e684] to [6c09ccf959].
︙ | ︙ | |||
105 106 107 108 109 110 111 | if (DOSBase != NULL) CloseLibrary(DOSBase); } #endif #if defined(OF_HAVE_THREADS) | | | 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | if (DOSBase != NULL) CloseLibrary(DOSBase); } #endif #if defined(OF_HAVE_THREADS) # import "tlskey.h" static of_tlskey_t threadSelfKey; static OFThread *mainThread; static void callMain(id object) { |
︙ | ︙ |
Modified src/ObjFW.h from [927e22debb] to [a9de46c0be].
︙ | ︙ | |||
241 242 243 244 245 246 247 248 | #ifdef OF_HAVE_ATOMIC_OPS # import "atomic.h" #endif #import "OFLocking.h" #import "OFThread.h" #ifdef OF_HAVE_THREADS | > | > > | 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 | #ifdef OF_HAVE_ATOMIC_OPS # import "atomic.h" #endif #import "OFLocking.h" #import "OFThread.h" #import "once.h" #ifdef OF_HAVE_THREADS # import "thread.h" # import "mutex.h" # import "condition.h" # import "OFThreadPool.h" # import "OFMutex.h" # import "OFRecursiveMutex.h" # import "OFCondition.h" #endif #import "base64.h" |
︙ | ︙ |
Modified src/autorelease.m from [5ee0c99289] to [b0d97cac69].
︙ | ︙ | |||
20 21 22 23 24 25 26 | #include <stdio.h> #include <stdlib.h> #import "OFObject.h" #import "OFSystemInfo.h" #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) | | | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <stdio.h> #include <stdlib.h> #import "OFObject.h" #import "OFSystemInfo.h" #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) # import "tlskey.h" #endif #if defined(OF_HAVE_COMPILER_TLS) static thread_local id *objects = NULL; static thread_local id *top = NULL; static thread_local size_t size = 0; #elif defined(OF_HAVE_THREADS) |
︙ | ︙ |
Added src/condition.h version [d4d414aa35].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "objfw-defs.h" #include "platform.h" #if !defined(OF_HAVE_THREADS) || \ (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS)) # error No conditions available! #endif /* For of_time_interval_t */ #import "OFObject.h" #import "mutex.h" #if defined(OF_HAVE_PTHREADS) # include <pthread.h> typedef pthread_cond_t of_condition_t; #elif defined(OF_WINDOWS) # include <windows.h> typedef struct { HANDLE event; int count; } of_condition_t; #endif extern bool of_condition_new(of_condition_t *condition); extern bool of_condition_signal(of_condition_t *condition); extern bool of_condition_broadcast(of_condition_t *condition); extern bool of_condition_wait(of_condition_t *condition, of_mutex_t *mutex); extern bool of_condition_timed_wait(of_condition_t *condition, of_mutex_t *mutex, of_time_interval_t timeout); extern bool of_condition_free(of_condition_t *condition); |
Added src/condition.m version [2ae0545ef5].
> > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "config.h" #import "condition.h" #if defined(OF_HAVE_PTHREADS) # include "condition_pthread.m" #elif defined(OF_WINDOWS) # include "condition_winapi.m" #endif |
Added src/condition_pthread.m version [953df43013].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 <math.h> bool of_condition_new(of_condition_t *condition) { return (pthread_cond_init(condition, NULL) == 0); } bool of_condition_signal(of_condition_t *condition) { return (pthread_cond_signal(condition) == 0); } bool of_condition_broadcast(of_condition_t *condition) { return (pthread_cond_broadcast(condition) == 0); } bool of_condition_wait(of_condition_t *condition, of_mutex_t *mutex) { return (pthread_cond_wait(condition, mutex) == 0); } bool of_condition_timed_wait(of_condition_t *condition, of_mutex_t *mutex, of_time_interval_t timeout) { struct timespec ts; ts.tv_sec = (time_t)timeout; ts.tv_nsec = lrint((timeout - ts.tv_sec) * 1000000000); return (pthread_cond_timedwait(condition, mutex, &ts) == 0); } bool of_condition_free(of_condition_t *condition) { return (pthread_cond_destroy(condition) == 0); } |
Added src/condition_winapi.m version [c7f4f2bb50].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 85 86 87 88 89 90 91 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "config.h" bool of_condition_new(of_condition_t *condition) { condition->count = 0; if ((condition->event = CreateEvent(NULL, FALSE, 0, NULL)) == NULL) return false; return true; } bool of_condition_signal(of_condition_t *condition) { return SetEvent(condition->event); } bool of_condition_broadcast(of_condition_t *condition) { for (int i = 0; i < condition->count; i++) if (!SetEvent(condition->event)) return false; return true; } bool of_condition_wait(of_condition_t *condition, of_mutex_t *mutex) { DWORD status; if (!of_mutex_unlock(mutex)) return false; of_atomic_int_inc(&condition->count); status = WaitForSingleObject(condition->event, INFINITE); of_atomic_int_dec(&condition->count); if (!of_mutex_lock(mutex)) return false; return (status == WAIT_OBJECT_0); } bool of_condition_timed_wait(of_condition_t *condition, of_mutex_t *mutex, of_time_interval_t timeout) { DWORD status; if (!of_mutex_unlock(mutex)) return false; of_atomic_int_inc(&condition->count); status = WaitForSingleObject(condition->event, timeout * 1000); of_atomic_int_dec(&condition->count); if (!of_mutex_lock(mutex)) return false; return (status == WAIT_OBJECT_0); } bool of_condition_free(of_condition_t *condition) { if (condition->count != 0) return false; return CloseHandle(condition->event); } |
Modified src/exceptions/OFException.m from [fde76d6a75] to [6ae5b59e9b].
︙ | ︙ | |||
32 33 34 35 36 37 38 | #import "OFLocale.h" #import "OFInitializationFailedException.h" #import "OFLockFailedException.h" #import "OFUnlockFailedException.h" #if !defined(HAVE_STRERROR_R) && defined(OF_HAVE_THREADS) | | | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #import "OFLocale.h" #import "OFInitializationFailedException.h" #import "OFLockFailedException.h" #import "OFUnlockFailedException.h" #if !defined(HAVE_STRERROR_R) && defined(OF_HAVE_THREADS) # import "mutex.h" #endif #if defined(OF_WINDOWS) && defined(OF_HAVE_SOCKETS) # include <winerror.h> #endif #if defined(OF_ARM) && !defined(__ARM_DWARF_EH__) |
︙ | ︙ |
Added src/mutex.h version [44aab7ac4a].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 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 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "objfw-defs.h" #include "platform.h" #if !defined(OF_HAVE_THREADS) || \ (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS)) # error No mutexes available! #endif #import "macros.h" #if defined(OF_HAVE_PTHREADS) # include <pthread.h> typedef pthread_mutex_t of_mutex_t; #elif defined(OF_WINDOWS) # include <windows.h> typedef CRITICAL_SECTION of_mutex_t; #endif #if defined(OF_HAVE_ATOMIC_OPS) # import "atomic.h" typedef volatile int of_spinlock_t; # define OF_SPINCOUNT 10 #elif defined(OF_HAVE_PTHREAD_SPINLOCKS) typedef pthread_spinlock_t of_spinlock_t; #else typedef of_mutex_t of_spinlock_t; #endif #ifdef OF_HAVE_SCHED_YIELD # include <sched.h> #endif #if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS) # define of_rmutex_t of_mutex_t #else typedef struct { of_mutex_t mutex; of_tlskey_t count; } of_rmutex_t; #endif 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); extern bool of_mutex_free(of_mutex_t *mutex); extern bool of_rmutex_new(of_rmutex_t *rmutex); extern bool of_rmutex_lock(of_rmutex_t *rmutex); extern bool of_rmutex_trylock(of_rmutex_t *rmutex); extern bool of_rmutex_unlock(of_rmutex_t *rmutex); extern bool of_rmutex_free(of_rmutex_t *rmutex); /* Spinlocks are inlined for performance. */ static OF_INLINE void of_thread_yield(void) { #if defined(OF_HAVE_SCHED_YIELD) sched_yield(); #elif defined(OF_WINDOWS) Sleep(0); #endif } static OF_INLINE bool of_spinlock_new(of_spinlock_t *spinlock) { #if defined(OF_HAVE_ATOMIC_OPS) *spinlock = 0; return true; #elif defined(OF_HAVE_PTHREAD_SPINLOCKS) return (pthread_spin_init(spinlock, 0) == 0); #else return of_mutex_new(spinlock); #endif } static OF_INLINE bool of_spinlock_trylock(of_spinlock_t *spinlock) { #if defined(OF_HAVE_ATOMIC_OPS) if (of_atomic_int_cmpswap(spinlock, 0, 1)) { of_memory_barrier_acquire(); return true; } return false; #elif defined(OF_HAVE_PTHREAD_SPINLOCKS) return (pthread_spin_trylock(spinlock) == 0); #else return of_mutex_trylock(spinlock); #endif } static OF_INLINE bool of_spinlock_lock(of_spinlock_t *spinlock) { #if defined(OF_HAVE_ATOMIC_OPS) size_t i; for (i = 0; i < OF_SPINCOUNT; i++) if (of_spinlock_trylock(spinlock)) return true; while (!of_spinlock_trylock(spinlock)) of_thread_yield(); return true; #elif defined(OF_HAVE_PTHREAD_SPINLOCKS) return (pthread_spin_lock(spinlock) == 0); #else return of_mutex_lock(spinlock); #endif } static OF_INLINE bool of_spinlock_unlock(of_spinlock_t *spinlock) { #if defined(OF_HAVE_ATOMIC_OPS) bool ret = of_atomic_int_cmpswap(spinlock, 1, 0); of_memory_barrier_release(); return ret; #elif defined(OF_HAVE_PTHREAD_SPINLOCKS) return (pthread_spin_unlock(spinlock) == 0); #else return of_mutex_unlock(spinlock); #endif } static OF_INLINE bool of_spinlock_free(of_spinlock_t *spinlock) { #if defined(OF_HAVE_ATOMIC_OPS) return true; #elif defined(OF_HAVE_PTHREAD_SPINLOCKS) return (pthread_spin_destroy(spinlock) == 0); #else return of_mutex_free(spinlock); #endif } |
Added src/mutex.m version [619bce178b].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 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 114 115 116 117 118 119 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "config.h" #import "mutex.h" #if defined(OF_HAVE_PTHREADS) # include "mutex_pthread.m" #elif defined(OF_WINDOWS) # include "mutex_winapi.m" #endif #if !defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) && !defined(OF_WINDOWS) bool of_rmutex_new(of_rmutex_t *rmutex) { if (!of_mutex_new(&rmutex->mutex)) return false; if (!of_tlskey_new(&rmutex->count)) return false; return true; } bool of_rmutex_lock(of_rmutex_t *rmutex) { uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); if (count > 0) { if (!of_tlskey_set(rmutex->count, (void *)(count + 1))) return false; return true; } if (!of_mutex_lock(&rmutex->mutex)) return false; if (!of_tlskey_set(rmutex->count, (void *)1)) { of_mutex_unlock(&rmutex->mutex); return false; } return true; } bool of_rmutex_trylock(of_rmutex_t *rmutex) { uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); if (count > 0) { if (!of_tlskey_set(rmutex->count, (void *)(count + 1))) return false; return true; } if (!of_mutex_trylock(&rmutex->mutex)) return false; if (!of_tlskey_set(rmutex->count, (void *)1)) { of_mutex_unlock(&rmutex->mutex); return false; } return true; } bool of_rmutex_unlock(of_rmutex_t *rmutex) { uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); if (count > 1) { if (!of_tlskey_set(rmutex->count, (void *)(count - 1))) return false; return true; } if (!of_tlskey_set(rmutex->count, (void *)0)) return false; if (!of_mutex_unlock(&rmutex->mutex)) return false; return true; } bool of_rmutex_free(of_rmutex_t *rmutex) { if (!of_mutex_free(&rmutex->mutex)) return false; if (!of_tlskey_free(rmutex->count)) return false; return true; } #endif |
Added src/mutex_pthread.m version [7e6b2b2e32].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 85 86 87 88 89 90 91 92 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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. */ bool of_mutex_new(of_mutex_t *mutex) { return (pthread_mutex_init(mutex, NULL) == 0); } bool of_mutex_lock(of_mutex_t *mutex) { return (pthread_mutex_lock(mutex) == 0); } bool of_mutex_trylock(of_mutex_t *mutex) { return (pthread_mutex_trylock(mutex) == 0); } bool of_mutex_unlock(of_mutex_t *mutex) { return (pthread_mutex_unlock(mutex) == 0); } bool of_mutex_free(of_mutex_t *mutex) { return (pthread_mutex_destroy(mutex) == 0); } #ifdef OF_HAVE_RECURSIVE_PTHREAD_MUTEXES bool of_rmutex_new(of_rmutex_t *rmutex) { pthread_mutexattr_t attr; if (pthread_mutexattr_init(&attr) != 0) return false; if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) return false; if (pthread_mutex_init(rmutex, &attr) != 0) return false; if (pthread_mutexattr_destroy(&attr) != 0) return false; return true; } bool of_rmutex_lock(of_rmutex_t *rmutex) { return of_mutex_lock(rmutex); } bool of_rmutex_trylock(of_rmutex_t *rmutex) { return of_mutex_trylock(rmutex); } bool of_rmutex_unlock(of_rmutex_t *rmutex) { return of_mutex_unlock(rmutex); } bool of_rmutex_free(of_rmutex_t *rmutex) { return of_mutex_free(rmutex); } #endif |
Added src/mutex_winapi.m version [01cabee958].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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. */ bool of_mutex_new(of_mutex_t *mutex) { InitializeCriticalSection(mutex); return true; } bool of_mutex_lock(of_mutex_t *mutex) { EnterCriticalSection(mutex); return true; } bool of_mutex_trylock(of_mutex_t *mutex) { return TryEnterCriticalSection(mutex); } bool of_mutex_unlock(of_mutex_t *mutex) { LeaveCriticalSection(mutex); return true; } bool of_mutex_free(of_mutex_t *mutex) { DeleteCriticalSection(mutex); return true; } bool of_rmutex_new(of_rmutex_t *rmutex) { return of_mutex_new(rmutex); } bool of_rmutex_lock(of_rmutex_t *rmutex) { return of_mutex_lock(rmutex); } bool of_rmutex_trylock(of_rmutex_t *rmutex) { return of_mutex_trylock(rmutex); } bool of_rmutex_unlock(of_rmutex_t *rmutex) { return of_mutex_unlock(rmutex); } bool of_rmutex_free(of_rmutex_t *rmutex) { return of_mutex_free(rmutex); } |
Added src/once.h version [b8f741bcba].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "objfw-defs.h" #include "platform.h" #if defined(OF_HAVE_PTHREADS) # include <pthread.h> typedef pthread_once_t of_once_t; # define OF_ONCE_INIT PTHREAD_ONCE_INIT #elif defined(OF_HAVE_ATOMIC_OPS) typedef volatile int of_once_t; # define OF_ONCE_INIT 0 #elif !defined(OF_HAVE_THREADS) typedef int of_once_t; # define OF_ONCE_INIT 0 #endif extern void of_once(of_once_t *control, void (*func)(void)); |
Added src/once.m version [9475bcca1a].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "config.h" #import "once.h" #if defined(OF_HAVE_THREADS) && defined(OF_HAVE_ATOMIC_OPS) # import "atomic.h" # import "mutex.h" #endif void of_once(of_once_t *control, void (*func)(void)) { #if !defined(OF_HAVE_THREADS) if (*control == 0) { *control = 1; func(); } #elif defined(OF_HAVE_PTHREADS) pthread_once(control, func); #elif defined(OF_HAVE_ATOMIC_OPS) if (of_atomic_int_cmpswap(control, 0, 1)) { func(); of_memory_barrier(); of_atomic_int_inc(control); } else while (*control == 1) of_thread_yield(); #else # error No of_once available #endif } |
Modified src/runtime/Makefile from [ec23ad162e] to [a2eae9738b].
︙ | ︙ | |||
24 25 26 27 28 29 30 | protocol.m \ selector.m \ sparsearray.m \ static-instances.m \ synchronized.m \ ${USE_SRCS_THREADS} SRCS_THREADS = threading.m \ | > | | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | protocol.m \ selector.m \ sparsearray.m \ static-instances.m \ synchronized.m \ ${USE_SRCS_THREADS} SRCS_THREADS = threading.m \ ../mutex.m \ ../once.m INCLUDES = ObjFWRT.h includesubdir = ObjFWRT OBJS_EXTRA = ${LOOKUP_ASM_LOOKUP_ASM_A} LIB_OBJS_EXTRA = ${LOOKUP_ASM_LOOKUP_ASM_LIB_A} AMIGA_LIB_OBJS_START = amiga-library.amigalib.o AMIGA_LIB_OBJS_EXTRA = amiga-glue.amigalib.o \ |
︙ | ︙ |
Modified src/runtime/arc.m from [0243808085] to [190a57a818].
︙ | ︙ | |||
16 17 18 19 20 21 22 23 | */ #include "config.h" #import "ObjFWRT.h" #import "private.h" #ifdef OF_HAVE_THREADS | > > > | < < < | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | */ #include "config.h" #import "ObjFWRT.h" #import "private.h" #import "OFObject.h" #import "OFBlock.h" #ifdef OF_HAVE_THREADS # import "mutex.h" #endif struct weak_ref { id **locations; size_t count; }; static struct objc_hashtable *hashtable; |
︙ | ︙ |
Modified src/runtime/exception.m from [fae3aff94d] to [00f195dbf4].
︙ | ︙ | |||
24 25 26 27 28 29 30 | #include <string.h> #import "ObjFWRT.h" #import "private.h" #import "macros.h" #ifdef OF_HAVE_THREADS | | | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <string.h> #import "ObjFWRT.h" #import "private.h" #import "macros.h" #ifdef OF_HAVE_THREADS # include "mutex.h" #endif #ifdef HAVE_SEH_EXCEPTIONS # include <windows.h> #endif #if defined(HAVE_DWARF_EXCEPTIONS) |
︙ | ︙ |
Modified src/runtime/property.m from [bfdd708620] to [af06feb764].
︙ | ︙ | |||
21 22 23 24 25 26 27 | #import "ObjFWRT.h" #import "private.h" #import "OFObject.h" #ifdef OF_HAVE_THREADS | | | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #import "ObjFWRT.h" #import "private.h" #import "OFObject.h" #ifdef OF_HAVE_THREADS # import "mutex.h" # define NUM_SPINLOCKS 8 /* needs to be a power of 2 */ # define SPINLOCK_HASH(p) ((unsigned)((uintptr_t)p >> 4) & (NUM_SPINLOCKS - 1)) static of_spinlock_t spinlocks[NUM_SPINLOCKS]; #endif #ifdef OF_HAVE_THREADS OF_CONSTRUCTOR() |
︙ | ︙ |
Modified src/runtime/synchronized.m from [b6b74f5fb8] to [ce42389707].
︙ | ︙ | |||
20 21 22 23 24 25 26 | #include <stdio.h> #include <stdlib.h> #import "ObjFWRT.h" #import "private.h" #ifdef OF_HAVE_THREADS | | | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <stdio.h> #include <stdlib.h> #import "ObjFWRT.h" #import "private.h" #ifdef OF_HAVE_THREADS # import "mutex.h" static struct lock_s { id object; int count; of_rmutex_t rmutex; struct lock_s *next; } *locks = NULL; |
︙ | ︙ |
Modified src/runtime/threading.m from [4b5bfa32f7] to [0ddddee005].
︙ | ︙ | |||
18 19 20 21 22 23 24 | #include "config.h" #include <stdio.h> #include <stdlib.h> #import "ObjFWRT.h" #import "private.h" | > | | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include "config.h" #include <stdio.h> #include <stdlib.h> #import "ObjFWRT.h" #import "private.h" #import "mutex.h" #import "once.h" static of_rmutex_t globalMutex; static void init(void) { if (!of_rmutex_new(&globalMutex)) |
︙ | ︙ |
Modified src/socket.m from [b2488d7024] to [2f5d16033d].
︙ | ︙ | |||
33 34 35 36 37 38 39 | #import "OFInvalidFormatException.h" #import "OFLockFailedException.h" #import "OFUnlockFailedException.h" #import "socket.h" #import "socket_helpers.h" #ifdef OF_HAVE_THREADS | | > | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #import "OFInvalidFormatException.h" #import "OFLockFailedException.h" #import "OFUnlockFailedException.h" #import "socket.h" #import "socket_helpers.h" #ifdef OF_HAVE_THREADS # include "mutex.h" #endif #include "once.h" #ifdef OF_NINTENDO_3DS # include <3ds/types.h> # include <3ds/services/soc.h> #endif #ifdef OF_HAVE_THREADS |
︙ | ︙ | |||
85 86 87 88 89 90 91 | initSuccessful = true; } bool of_socket_init() { | < < < < < < < < | 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | initSuccessful = true; } bool of_socket_init() { static of_once_t onceControl = OF_ONCE_INIT; of_once(&onceControl, init); return initSuccessful; } int of_socket_errno() { |
︙ | ︙ |
Added src/thread.h version [34fb8d0893].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "objfw-defs.h" #include "platform.h" #if !defined(OF_HAVE_THREADS) || \ (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS)) # error No threads available! #endif #import "macros.h" #if defined(OF_HAVE_PTHREADS) # include <pthread.h> typedef pthread_t of_thread_t; #elif defined(OF_WINDOWS) # include <windows.h> typedef HANDLE of_thread_t; #endif typedef struct of_thread_attr_t { float priority; size_t stackSize; } of_thread_attr_t; #if defined(OF_HAVE_PTHREADS) # define of_thread_is_current(t) pthread_equal(t, pthread_self()) # define of_thread_current pthread_self #elif defined(OF_WINDOWS) # define of_thread_is_current(t) (t == GetCurrentThread()) # define of_thread_current GetCurrentThread #endif 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); |
Added src/thread.m version [97cad1fce3].
> > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "config.h" #import "thread.h" #if defined(OF_HAVE_PTHREADS) # include "thread_pthread.m" #elif defined(OF_WINDOWS) # include "thread_winapi.m" #endif |
Added src/thread_pthread.m version [4bb0d2efdf].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 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 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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. */ #ifdef HAVE_PTHREAD_NP_H # include <pthread_np.h> #endif #ifdef OF_HAIKU # include <kernel/OS.h> #endif #import "macros.h" static int minPrio = 0, maxPrio = 0, normalPrio = 0; struct thread_ctx { void (*function)(id object); id object; }; /* * This is done here to make sure this is done as early as possible in the main * thread. */ OF_CONSTRUCTOR() { pthread_attr_t pattr; if (pthread_attr_init(&pattr) == 0) { #ifdef HAVE_PTHREAD_ATTR_GETSCHEDPOLICY int policy; #endif struct sched_param param; #ifdef HAVE_PTHREAD_ATTR_GETSCHEDPOLICY if (pthread_attr_getschedpolicy(&pattr, &policy) == 0) { minPrio = sched_get_priority_min(policy); maxPrio = sched_get_priority_max(policy); if (minPrio == -1 || maxPrio == -1) minPrio = maxPrio = 0; } if (pthread_attr_getschedparam(&pattr, ¶m) != 0) normalPrio = param.sched_priority; else minPrio = maxPrio = 0; pthread_attr_destroy(&pattr); #endif } } static void * functionWrapper(void *data) { struct thread_ctx *ctx = data; pthread_cleanup_push(free, data); ctx->function(ctx->object); pthread_cleanup_pop(1); return NULL; } bool of_thread_attr_init(of_thread_attr_t *attr) { pthread_attr_t pattr; if (pthread_attr_init(&pattr) != 0) return false; @try { attr->priority = 0; if (pthread_attr_getstacksize(&pattr, &attr->stackSize) != 0) return false; } @finally { pthread_attr_destroy(&pattr); } return true; } bool of_thread_new(of_thread_t *thread, void (*function)(id), id object, const of_thread_attr_t *attr) { bool ret; pthread_attr_t pattr; if (pthread_attr_init(&pattr) != 0) return false; @try { struct thread_ctx *ctx; if (attr != NULL) { struct sched_param param; if (attr->priority < -1 || attr->priority > 1) return false; #ifdef HAVE_PTHREAD_ATTR_SETINHERITSCHED if (pthread_attr_setinheritsched(&pattr, PTHREAD_EXPLICIT_SCHED) != 0) return false; #endif if (attr->priority < 0) { param.sched_priority = minPrio + (1.0f + attr->priority) * (normalPrio - minPrio); } else param.sched_priority = normalPrio + attr->priority * (maxPrio - normalPrio); if (pthread_attr_setschedparam(&pattr, ¶m) != 0) return false; if (attr->stackSize > 0) { if (pthread_attr_setstacksize(&pattr, attr->stackSize) != 0) return false; } } if ((ctx = malloc(sizeof(*ctx))) == NULL) return false; ctx->function = function; ctx->object = object; ret = (pthread_create(thread, &pattr, functionWrapper, ctx) == 0); } @finally { pthread_attr_destroy(&pattr); } return ret; } bool of_thread_join(of_thread_t thread) { void *ret; if (pthread_join(thread, &ret) != 0) return false; #ifdef PTHREAD_CANCELED return (ret != PTHREAD_CANCELED); #else return true; #endif } 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); #elif defined(HAVE_PTHREAD_SETNAME_NP) # if defined(OF_MACOS) || defined(OF_IOS) pthread_setname_np(name); # elif defined(__GLIBC__) char buffer[16]; strncpy(buffer, name, 15); buffer[15] = 0; pthread_setname_np(pthread_self(), buffer); # endif #endif } |
Added src/thread_winapi.m version [b6b9499d85].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "config.h" #import "macros.h" bool of_thread_attr_init(of_thread_attr_t *attr) { attr->priority = 0; attr->stackSize = 0; return true; } bool of_thread_new(of_thread_t *thread, void (*function)(id), id object, const of_thread_attr_t *attr) { *thread = CreateThread(NULL, (attr != NULL ? attr->stackSize : 0), (LPTHREAD_START_ROUTINE)function, (void *)object, 0, NULL); if (thread == NULL) return false; if (attr != NULL && attr->priority != 0) { DWORD priority; if (attr->priority < -1 || attr->priority > 1) return false; if (attr->priority < 0) priority = THREAD_PRIORITY_LOWEST + (1.0 + attr->priority) * (THREAD_PRIORITY_NORMAL - THREAD_PRIORITY_LOWEST); else priority = THREAD_PRIORITY_NORMAL + attr->priority * (THREAD_PRIORITY_HIGHEST - THREAD_PRIORITY_NORMAL); if (!SetThreadPriority(*thread, priority)) return false; } return true; } bool of_thread_join(of_thread_t thread) { if (WaitForSingleObject(thread, INFINITE)) return false; CloseHandle(thread); return true; } bool of_thread_detach(of_thread_t thread) { /* FIXME */ return true; } void of_thread_set_name(const char *name) { } |
Deleted src/threading.h version [3939aad58d].
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Deleted src/threading.m version [ea45eac8db].
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Deleted src/threading_pthread.m version [45235a8a16].
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Deleted src/threading_winapi.m version [8b9c6a4ff4].
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Added src/tlskey.h version [b6004072bd].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "objfw-defs.h" #include "platform.h" #if !defined(OF_HAVE_THREADS) || \ (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS)) # error No thread-local storage available! #endif #import "macros.h" #if defined(OF_HAVE_PTHREADS) # include <pthread.h> typedef pthread_key_t of_tlskey_t; #elif defined(OF_WINDOWS) # include <windows.h> typedef DWORD of_tlskey_t; #endif extern bool of_tlskey_new(of_tlskey_t *key); extern bool of_tlskey_free(of_tlskey_t key); /* TLS keys are inlined for performance. */ #if defined(OF_HAVE_PTHREADS) static OF_INLINE void * of_tlskey_get(of_tlskey_t key) { return pthread_getspecific(key); } static OF_INLINE bool of_tlskey_set(of_tlskey_t key, void *ptr) { return (pthread_setspecific(key, ptr) == 0); } #elif defined(OF_WINDOWS) static OF_INLINE void * of_tlskey_get(of_tlskey_t key) { return TlsGetValue(key); } static OF_INLINE bool of_tlskey_set(of_tlskey_t key, void *ptr) { return TlsSetValue(key, ptr); } #endif |
Added src/tlskey.m version [14860d8d54].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 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 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * 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 "config.h" #import "tlskey.h" bool of_tlskey_new(of_tlskey_t *key) { #if defined(OF_HAVE_PTHREADS) return (pthread_key_create(key, NULL) == 0); #elif defined(OF_WINDOWS) return ((*key = TlsAlloc()) != TLS_OUT_OF_INDEXES); #endif } bool of_tlskey_free(of_tlskey_t key) { #if defined(OF_HAVE_PTHREADS) return (pthread_key_delete(key) == 0); #elif defined(OF_WINDOWS) return TlsFree(key); #endif } |