diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2014-01-22 11:04:05 +0100 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2014-01-22 11:04:05 +0100 |
commit | d07fa27ff8c7309d09f60874c88473321b90784a (patch) | |
tree | 1da914cd3ea05f42da55449387c531b47ee6b8d0 | |
parent | c70841a8d50c25ee2f2e0bb43528399e89dbc7a0 (diff) | |
download | efl-d07fa27ff8c7309d09f60874c88473321b90784a.tar.gz |
eo2: add eina_tls_cb_new()
adds a delete cb called at thread exit.
needed for eo2 thread safety.
if proven usefull, proper patch will be proposed to master,
with working win32 and wince backend.
-rw-r--r-- | src/lib/eina/eina_inline_lock_posix.x | 12 | ||||
-rw-r--r-- | src/lib/eina/eina_lock.h | 2 | ||||
-rw-r--r-- | src/tests/eina/eina_test_lock.c | 40 |
3 files changed, 43 insertions, 11 deletions
diff --git a/src/lib/eina/eina_inline_lock_posix.x b/src/lib/eina/eina_inline_lock_posix.x index 2e5b038ea4..63d3898385 100644 --- a/src/lib/eina/eina_inline_lock_posix.x +++ b/src/lib/eina/eina_inline_lock_posix.x @@ -489,14 +489,20 @@ eina_rwlock_release(Eina_RWLock *mutex) return EINA_LOCK_SUCCEED; } -static inline Eina_Bool -eina_tls_new(Eina_TLS *key) +static inline Eina_Bool +eina_tls_cb_new(Eina_TLS *key, void (*delete_cb)(void*)) { - if (pthread_key_create(key, NULL) != 0) + if (pthread_key_create(key, delete_cb) != 0) return EINA_FALSE; return EINA_TRUE; } +static inline Eina_Bool +eina_tls_new(Eina_TLS *key) +{ + return eina_tls_cb_new(key, NULL); +} + static inline void eina_tls_free(Eina_TLS key) { diff --git a/src/lib/eina/eina_lock.h b/src/lib/eina/eina_lock.h index b0afa4193f..c7d55d1cc1 100644 --- a/src/lib/eina/eina_lock.h +++ b/src/lib/eina/eina_lock.h @@ -91,6 +91,8 @@ static inline Eina_Lock_Result eina_rwlock_release(Eina_RWLock *mutex); /** @relates static Eina_Bool eina_tls_new(pthread_key_t *key) */ static inline Eina_Bool eina_tls_new(Eina_TLS *key); +/** @relates static Eina_Bool eina_tls_cb_new(pthread_key_t *key, void (*delete_cb)(void*)) */ +static inline Eina_Bool eina_tls_cb_new(Eina_TLS *key, void (*delete_cb)(void*)); /** @relates static void eina_tls_free(pthread_key_t key) */ static inline void eina_tls_free(Eina_TLS key); /** @relates static void eina_tls_get(pthread_key_t key) */ diff --git a/src/tests/eina/eina_test_lock.c b/src/tests/eina/eina_test_lock.c index 9bac3041b8..7c6626eaa7 100644 --- a/src/tests/eina/eina_test_lock.c +++ b/src/tests/eina/eina_test_lock.c @@ -77,33 +77,57 @@ START_TEST(eina_test_spinlock) END_TEST static Eina_TLS key; +static int _eina_tls_free_count = 0; + +static void * +_eina_test_tls_alloc(int v) +{ + int *ptr = malloc(sizeof(int)); + *ptr = v; + + return ptr; +} + +static void +_eina_test_tls_free(void *ptr) +{ + _eina_tls_free_count++; + free(ptr); +} static void * _eina_test_tls_thread(void *data EINA_UNUSED, Eina_Thread t EINA_UNUSED) { - unsigned int mystack = 21; + int *ptr; + + ptr = eina_tls_get(key); + fail_if(eina_tls_get(key) != NULL); - fail_if(!eina_tls_set(key, &mystack)); - fail_if(eina_tls_get(key) != &mystack); + fail_if(!eina_tls_set(key, _eina_test_tls_alloc(24))); + + ptr = eina_tls_get(key); + fail_if(eina_tls_get(key) == NULL); + fail_if(*ptr != 24); return NULL; } START_TEST(eina_test_tls) { - unsigned int ft = 42; - fail_if(!eina_init()); - fail_if(!eina_tls_new(&key)); + fail_if(!eina_tls_cb_new(&key, _eina_test_tls_free)); - fail_if(!eina_tls_set(key, &ft)); + fail_if(!eina_tls_set(key, _eina_test_tls_alloc(42))); fail_if(!eina_thread_create(&thread, EINA_THREAD_NORMAL, 0, _eina_test_tls_thread, NULL)); eina_thread_join(thread); + fail_if(_eina_tls_free_count != 1); - fail_if(eina_tls_get(key) != &ft); + int *ptr = eina_tls_get(key); + fail_if(eina_tls_get(key) == NULL); + fail_if(*ptr != 42); eina_tls_free(key); |