Differences From Artifact [b1f544f482]:
- File src/tlskey.m — part of check-in [abaf310373] at 2019-08-01 21:31:25 on branch trunk — Add thread-local storage for AmigaOS (user: js, size: 1372) [annotate] [blame] [check-ins using]
To Artifact [b1dffe2b41]:
- File
src/tlskey.m
— part of check-in
[acc67b0bb6]
at
2019-08-02 02:16:04
on branch trunk
— tlskey: Create OFMapTable lazily
of_tlskey_new() is called in constructors, but at that time, OFMapTable
might not be available yet. (user: js, size: 2249) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
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 |