From 94a3230bec06c6600ad70ec305d7f64548a5d695 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. ..." git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@64120 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- AUTHORS | 1 + src/include/eina_inline_lock_posix.x | 29 +++++++++++++++++++++++++++++ src/include/eina_inline_lock_void.x | 24 ++++++++++++++++++++++++ src/include/eina_inline_lock_win32.x | 28 ++++++++++++++++++++++++++++ src/include/eina_inline_lock_wince.x | 33 ++++++++++++++++++++++++++++++++- src/include/eina_lock.h | 6 ++++++ 6 files changed, 120 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 354de52..1483270 100644 --- a/AUTHORS +++ b/AUTHORS @@ -19,3 +19,4 @@ Sebastian Dransfeld Myungjae Lee Youness Alaoui billiob (Boris Faure) +Sung W. Park diff --git a/src/include/eina_inline_lock_posix.x b/src/include/eina_inline_lock_posix.x index 2da5bfc..77f5b8b 100644 --- a/src/include/eina_inline_lock_posix.x +++ b/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/src/include/eina_inline_lock_void.x b/src/include/eina_inline_lock_void.x index e6d503a..64097af 100644 --- a/src/include/eina_inline_lock_void.x +++ b/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/src/include/eina_inline_lock_win32.x b/src/include/eina_inline_lock_win32.x index 7cc58b9..fa0c8e6 100644 --- a/src/include/eina_inline_lock_win32.x +++ b/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/src/include/eina_inline_lock_wince.x b/src/include/eina_inline_lock_wince.x index 1be0890..965d475 100644 --- a/src/include/eina_inline_lock_wince.x +++ b/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/src/include/eina_lock.h b/src/include/eina_lock.h index 3b2f610..7c26dc0 100644 --- a/src/include/eina_lock.h +++ b/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 { \ -- 2.7.4