From fef1dc318f6be6b85a3b345961e5794b2a82e6c4 Mon Sep 17 00:00:00 2001 From: "Sung W. Park" Date: Mon, 17 Oct 2011 05:06:01 +0000 Subject: [PATCH] From: "Sung W. Park" "... I've created a resource context per thread using TLS. Since there is no TLS support in Eina, I've added 4 APIs for that as well. Another patch has been submitted but i'll just include it in here as well. ..." SVN revision: 64120 --- legacy/eina/AUTHORS | 1 + .../eina/src/include/eina_inline_lock_posix.x | 29 ++++++++++++++++ .../eina/src/include/eina_inline_lock_void.x | 24 ++++++++++++++ .../eina/src/include/eina_inline_lock_win32.x | 28 ++++++++++++++++ .../eina/src/include/eina_inline_lock_wince.x | 33 ++++++++++++++++++- legacy/eina/src/include/eina_lock.h | 6 ++++ 6 files changed, 120 insertions(+), 1 deletion(-) 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 { \