Overview
Comment: | Add thread-local storage for AmigaOS |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
abaf310373f7036be2c10b4e8f098653 |
User & Date: | js on 2019-08-01 21:31:25 |
Other Links: | manifest | tags |
Context
2019-08-01
| ||
22:13 | OFMutableData: Add -[mutable{First,Last}Item] check-in: e308b28e00 user: js tags: trunk | |
21:31 | Add thread-local storage for AmigaOS check-in: abaf310373 user: js tags: trunk | |
21:20 | Add of_once() for AmigaOS check-in: c2bde5d283 user: js tags: trunk | |
Changes
Modified src/tlskey.h from [35d619259b] to [bf8d4b8a75].
︙ | ︙ | |||
16 17 18 19 20 21 22 | */ #include "objfw-defs.h" #include "platform.h" #if !defined(OF_HAVE_THREADS) || \ | | > > > > | 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 | */ #include "objfw-defs.h" #include "platform.h" #if !defined(OF_HAVE_THREADS) || \ (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS)) # 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; #elif defined(OF_AMIGAOS) # include <proto/exec.h> # import "OFMapTable.h" typedef OFMapTable *of_tlskey_t; #endif #ifdef __cplusplus extern "C" { #endif extern bool of_tlskey_new(of_tlskey_t *key); extern bool of_tlskey_free(of_tlskey_t key); |
︙ | ︙ | |||
64 65 66 67 68 69 70 71 72 | return TlsGetValue(key); } static OF_INLINE bool of_tlskey_set(of_tlskey_t key, void *ptr) { return TlsSetValue(key, ptr); } #endif | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | return TlsGetValue(key); } static OF_INLINE bool of_tlskey_set(of_tlskey_t key, void *ptr) { return TlsSetValue(key, ptr); } #elif defined(OF_AMIGAOS) static OF_INLINE void * of_tlskey_get(of_tlskey_t key) { void *ret; Forbid(); @try { ret = [key objectForKey: FindTask(NULL)]; } @finally { Permit(); } return ret; } static OF_INLINE bool of_tlskey_set(of_tlskey_t key, void *ptr) { Forbid(); @try { struct Task *task = FindTask(NULL); if (ptr == NULL) [key removeObjectForKey: task]; else [key setObject: ptr forKey: task]; } @catch (id e) { return false; } @finally { Permit(); } return true; } #endif |
Modified src/tlskey.m from [14860d8d54] to [b1f544f482].
︙ | ︙ | |||
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 | * 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 } | > > > > > > > > > > > > > > > > > > > | 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 | * file. */ #include "config.h" #import "tlskey.h" #ifdef OF_AMIGAOS # import "OFMapTable.h" static const of_map_table_functions_t functions = { NULL }; #endif 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); #elif defined(OF_AMIGAOS) @try { *key = [[OFMapTable alloc] initWithKeyFunctions: functions objectFunctions: functions]; } @catch (id e) { return false; } return true; #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); #elif defined(OF_AMIGAOS) [key release]; return true; #endif } |