Index: src/tlskey.h ================================================================== --- src/tlskey.h +++ src/tlskey.h @@ -32,12 +32,14 @@ #elif defined(OF_WINDOWS) # include typedef DWORD of_tlskey_t; #elif defined(OF_AMIGAOS) # include -# import "OFMapTable.h" -typedef OFMapTable *of_tlskey_t; +@class OFMapTable; +typedef struct { + OFMapTable *mapTable; +} *of_tlskey_t; #endif #ifdef __cplusplus extern "C" { #endif @@ -72,41 +74,15 @@ 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; -} +/* 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 Index: src/tlskey.m ================================================================== --- src/tlskey.m +++ src/tlskey.m @@ -31,16 +31,17 @@ #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) { + 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 } @@ -50,10 +51,59 @@ #if defined(OF_HAVE_PTHREADS) return (pthread_key_delete(key) == 0); #elif defined(OF_WINDOWS) return TlsFree(key); #elif defined(OF_AMIGAOS) - [key release]; + [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