Index: src/tlskey.h ================================================================== --- src/tlskey.h +++ src/tlskey.h @@ -18,11 +18,11 @@ #include "objfw-defs.h" #include "platform.h" #if !defined(OF_HAVE_THREADS) || \ - (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS)) + (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS)) # error No thread-local storage available! #endif #import "macros.h" @@ -30,10 +30,14 @@ # include typedef pthread_key_t of_tlskey_t; #elif defined(OF_WINDOWS) # include typedef DWORD of_tlskey_t; +#elif defined(OF_AMIGAOS) +# include +# import "OFMapTable.h" +typedef OFMapTable *of_tlskey_t; #endif #ifdef __cplusplus extern "C" { #endif @@ -66,7 +70,43 @@ 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 Index: src/tlskey.m ================================================================== --- src/tlskey.m +++ src/tlskey.m @@ -17,17 +17,32 @@ #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) @@ -34,7 +49,11 @@ { #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 }