Overview
Comment: | tlskey: Create OFMapTable lazily
of_tlskey_new() is called in constructors, but at that time, OFMapTable |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
acc67b0bb64a4e00ecf3fe4bf80416d7 |
User & Date: | js on 2019-08-02 02:16:04 |
Other Links: | manifest | tags |
Context
2019-08-02
| ||
11:42 | .travis.yml: Disable Xcode 11 & 32-bit Xcode 10.2 check-in: b373d2f8b9 user: js tags: trunk | |
02:16 | tlskey: Create OFMapTable lazily check-in: acc67b0bb6 user: js tags: trunk | |
2019-08-01
| ||
22:13 | OFMutableData: Add -[mutable{First,Last}Item] check-in: e308b28e00 user: js tags: trunk | |
Changes
Modified src/tlskey.h from [bf8d4b8a75] to [a0b1148f7c].
︙ | ︙ | |||
30 31 32 33 34 35 36 | # 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> | | > > | | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | # 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> @class OFMapTable; typedef struct { OFMapTable *mapTable; } *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); |
︙ | ︙ | |||
70 71 72 73 74 75 76 | static OF_INLINE bool of_tlskey_set(of_tlskey_t key, void *ptr) { return TlsSetValue(key, ptr); } #elif defined(OF_AMIGAOS) | < < < < | < < < < < < | | < | < > | < < < < | < < < < < < < < < | | < < | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | static OF_INLINE bool of_tlskey_set(of_tlskey_t key, void *ptr) { return TlsSetValue(key, ptr); } #elif defined(OF_AMIGAOS) /* Those are too big too inline. */ # ifdef __cplusplus extern "C" { # endif extern void *of_tlskey_get(of_tlskey_t key); extern bool of_tlskey_set(of_tlskey_t key, void *ptr); # ifdef __cplusplus } # endif #endif |
Modified src/tlskey.m from [b1f544f482] to [b1dffe2b41].
︙ | ︙ | |||
29 30 31 32 33 34 35 | 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) | < | < < | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | 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) if ((*key = calloc(1, sizeof(*key))) == NULL) return false; /* * We create the map table lazily, as some TLS are created in * constructors, at which time OFMapTable is not available yet. */ 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->mapTable release]; free(key); return true; #endif } #ifdef OF_AMIGAOS void * of_tlskey_get(of_tlskey_t key) { void *ret; Forbid(); @try { if (key->mapTable == NULL) key->mapTable = [[OFMapTable alloc] initWithKeyFunctions: functions objectFunctions: functions]; ret = [key->mapTable objectForKey: FindTask(NULL)]; } @finally { Permit(); } return ret; } bool of_tlskey_set(of_tlskey_t key, void *ptr) { Forbid(); @try { struct Task *task = FindTask(NULL); if (key->mapTable == NULL) key->mapTable = [[OFMapTable alloc] initWithKeyFunctions: functions objectFunctions: functions]; if (ptr == NULL) [key->mapTable removeObjectForKey: task]; else [key->mapTable setObject: ptr forKey: task]; } @catch (id e) { return false; } @finally { Permit(); } return true; } #endif |