Index: src/threading.h ================================================================== --- src/threading.h +++ src/threading.h @@ -104,10 +104,12 @@ extern void of_thread_set_name(of_thread_t thread, const char *name); extern bool of_thread_join(of_thread_t thread); extern bool of_thread_detach(of_thread_t thread); extern void OF_NO_RETURN_FUNC of_thread_exit(void); extern void of_once(of_once_t *control, void (*func)(void)); +extern bool of_tlskey_new(of_tlskey_t *key); +extern bool of_tlskey_free(of_tlskey_t key); extern bool of_mutex_new(of_mutex_t *mutex); extern bool of_mutex_lock(of_mutex_t *mutex); extern bool of_mutex_trylock(of_mutex_t *mutex); extern bool of_mutex_unlock(of_mutex_t *mutex); extern bool of_mutex_free(of_mutex_t *mutex); @@ -124,57 +126,37 @@ of_mutex_t *mutex, of_time_interval_t timeout); extern bool of_condition_free(of_condition_t *condition); /* TLS keys and spinlocks are inlined for performance. */ -static OF_INLINE bool -of_tlskey_new(of_tlskey_t *key) -{ #if defined(OF_HAVE_PTHREADS) - return !pthread_key_create(key, NULL); -#elif defined(OF_WINDOWS) - return ((*key = TlsAlloc()) != TLS_OUT_OF_INDEXES); -#else -# error of_tlskey_new not implemented! -#endif +static OF_INLINE void* +of_tlskey_get(of_tlskey_t key) +{ + return pthread_getspecific(key); } +static OF_INLINE bool +of_tlskey_set(of_tlskey_t key, void *ptr) +{ + return !pthread_setspecific(key, ptr); +} +#elif defined(OF_WINDOWS) static OF_INLINE void* of_tlskey_get(of_tlskey_t key) { -#if defined(OF_HAVE_PTHREADS) - return pthread_getspecific(key); -#elif defined(OF_WINDOWS) return TlsGetValue(key); -#else -# error of_tlskey_get not implemented! -#endif } static OF_INLINE bool of_tlskey_set(of_tlskey_t key, void *ptr) { -#if defined(OF_HAVE_PTHREADS) - return !pthread_setspecific(key, ptr); -#elif defined(OF_WINDOWS) - return TlsSetValue(key, ptr); -#else -# error of_tlskey_set not implemented! -#endif -} - -static OF_INLINE bool -of_tlskey_free(of_tlskey_t key) -{ -#if defined(OF_HAVE_PTHREADS) - return !pthread_key_delete(key); -#elif defined(OF_WINDOWS) - return TlsFree(key); -#else -# error of_tlskey_free not implemented! -#endif -} + return TlsSetValue(key, ptr); +} +#else +# error No thread local storage available! +#endif static OF_INLINE void of_thread_yield(void) { #if defined(OF_HAVE_SCHED_YIELD) Index: src/threading_pthread.m ================================================================== --- src/threading_pthread.m +++ src/threading_pthread.m @@ -199,10 +199,22 @@ void of_once(of_once_t *control, void (*func)(void)) { pthread_once(control, func); } + +bool +of_tlskey_new(of_tlskey_t *key) +{ + return (pthread_key_create(key, NULL) == 0); +} + +bool +of_tlskey_free(of_tlskey_t key) +{ + return (pthread_key_delete(key) == 0); +} bool of_mutex_new(of_mutex_t *mutex) { return (pthread_mutex_init(mutex, NULL) == 0); Index: src/threading_winapi.m ================================================================== --- src/threading_winapi.m +++ src/threading_winapi.m @@ -87,10 +87,22 @@ void of_thread_set_name(of_thread_t thread, const char *name) { } + +bool +of_tlskey_new(of_tlskey_t *key) +{ + return ((*key = TlsAlloc()) != TLS_OUT_OF_INDEXES); +} + +bool +of_tlskey_free(of_tlskey_t key) +{ + return TlsFree(key); +} bool of_mutex_new(of_mutex_t *mutex) { InitializeCriticalSection(mutex);