diff --git a/legacy/eina/AUTHORS b/legacy/eina/AUTHORS index 354de527af..1483270717 100644 --- a/legacy/eina/AUTHORS +++ b/legacy/eina/AUTHORS @@ -19,3 +19,4 @@ Sebastian Dransfeld Myungjae Lee Youness Alaoui billiob (Boris Faure) +Sung W. Park diff --git a/legacy/eina/src/include/eina_inline_lock_posix.x b/legacy/eina/src/include/eina_inline_lock_posix.x index 2da5bfcc08..77f5b8b4ed 100644 --- a/legacy/eina/src/include/eina_inline_lock_posix.x +++ b/legacy/eina/src/include/eina_inline_lock_posix.x @@ -44,6 +44,7 @@ typedef void (*Eina_Lock_Bt_Func) (); typedef struct _Eina_Lock Eina_Lock; typedef struct _Eina_RWLock Eina_RWLock; typedef struct _Eina_Condition Eina_Condition; +typedef pthread_key_t Eina_TLS; struct _Eina_Lock { @@ -477,4 +478,32 @@ eina_rwlock_release(Eina_RWLock *mutex) return EINA_LOCK_SUCCEED; } +static inline Eina_Bool +eina_tls_new(Eina_TLS *key) +{ + if (pthread_key_create(key, NULL) != 0) + return EINA_FALSE; + return EINA_TRUE; +} + +static inline void +eina_tls_free(Eina_TLS key) +{ + pthread_key_delete(key); +} + +static inline void * +eina_tls_get(Eina_TLS key) +{ + return pthread_getspecific(key); +} + +static inline Eina_Bool +eina_tls_set(Eina_TLS key, const void *data) +{ + if (pthread_setspecific(key, data) != 0) + return EINA_FALSE; + return EINA_TRUE; +} + #endif diff --git a/legacy/eina/src/include/eina_inline_lock_void.x b/legacy/eina/src/include/eina_inline_lock_void.x index e6d503a358..64097afef9 100644 --- a/legacy/eina/src/include/eina_inline_lock_void.x +++ b/legacy/eina/src/include/eina_inline_lock_void.x @@ -215,6 +215,30 @@ eina_rwlock_take_write(Eina_RWLock *mutex EINA_UNUSED) return EINA_LOCK_FAIL; } +static inline Eina_Bool +eina_tls_new(Eina_TLS *key) +{ + return EINA_FALSE; +} + +static inline void +eina_tls_free(Eina_TLS key) +{ +} + +static inline void * +eina_tls_get(Eina_TLS key) +{ + return NULL; +} + +static inline Eina_Bool +eina_tls_set(Eina_TLS key, const void *data) +{ + return EINA_FALSE; +} + + /** * @} */ diff --git a/legacy/eina/src/include/eina_inline_lock_win32.x b/legacy/eina/src/include/eina_inline_lock_win32.x index 7cc58b9044..fa0c8e6080 100644 --- a/legacy/eina/src/include/eina_inline_lock_win32.x +++ b/legacy/eina/src/include/eina_inline_lock_win32.x @@ -433,4 +433,32 @@ eina_rwlock_release(Eina_RWLock *mutex) return EINA_LOCK_SUCCEED; } +static inline Eina_Bool +eina_tls_new(Eina_TLS *key) +{ + if (TlsAlloc() == TLS_OUT_OF_INDEXES) + return EINA_FALSE; + return EINA_TRUE; +} + +static inline void +eina_tls_free(Eina_TLS key) +{ + TlsFree(key); +} + +static inline void * +eina_tls_get(Eina_TLS key) +{ + return (void*)TlsGetValue(key); +} + +static inline Eina_Bool +eina_tls_set(Eina_TLS key, const void *data) +{ + if (TlsSetValue(key, (LPVOID)data) == 0) + return EINA_FALSE; + return EINA_TRUE; +} + #endif diff --git a/legacy/eina/src/include/eina_inline_lock_wince.x b/legacy/eina/src/include/eina_inline_lock_wince.x index 1be0890841..965d475ce9 100644 --- a/legacy/eina/src/include/eina_inline_lock_wince.x +++ b/legacy/eina/src/include/eina_inline_lock_wince.x @@ -23,8 +23,9 @@ EAPI extern Eina_Bool _threads_activated; -typedef HANDLE Eina_Lock; +typedef HANDLE Eina_Lock; typedef Eina_Lock Eina_RWLock; +typedef DWORD Eina_TLS; static inline Eina_Bool eina_lock_new(Eina_Lock *mutex) @@ -144,4 +145,34 @@ eina_rwlock_release(Eina_RWLock *mutex) return eina_lock_release(mutex); } +static inline Eina_Bool +eina_tls_new(Eina_TLS *key) +{ + if (TlsAlloc() == TLS_OUT_OF_INDEXES) + return EINA_FALSE; + return EINA_TRUE; +} + +static inline void +eina_tls_free(Eina_TLS key) +{ + TlsFree(key); +} + +static inline void * +eina_tls_get(Eina_TLS key) +{ + return (void*)TlsGetValue(key); +} + +static inline Eina_Bool +eina_tls_set(Eina_TLS key, const void *data) +{ + if (TlsSetValue(key, (LPVOID)data) == 0) + return EINA_FALSE; + return EINA_TRUE; +} + + + #endif diff --git a/legacy/eina/src/include/eina_lock.h b/legacy/eina/src/include/eina_lock.h index 3b2f61040d..7c26dc0022 100644 --- a/legacy/eina/src/include/eina_lock.h +++ b/legacy/eina/src/include/eina_lock.h @@ -76,6 +76,12 @@ static inline Eina_Lock_Result eina_rwlock_take_read(Eina_RWLock *mutex); static inline Eina_Lock_Result eina_rwlock_take_write(Eina_RWLock *mutex); static inline Eina_Lock_Result eina_rwlock_release(Eina_RWLock *mutex); +static inline Eina_Bool eina_tls_new(Eina_TLS *key); +static inline void eina_tls_free(Eina_TLS key); +static inline void *eina_tls_get(Eina_TLS key); +static inline Eina_Bool eina_tls_set(Eina_TLS key, const void *data); + + #ifdef EINA_HAVE_DEBUG_THREADS # define EINA_MAIN_LOOP_CHECK_RETURN_VAL(val) \ do { \