summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2014-01-22 11:04:05 +0100
committerJérémy Zurcher <jeremy@asynk.ch>2014-01-22 11:04:05 +0100
commitd07fa27ff8c7309d09f60874c88473321b90784a (patch)
tree1da914cd3ea05f42da55449387c531b47ee6b8d0
parentc70841a8d50c25ee2f2e0bb43528399e89dbc7a0 (diff)
downloadefl-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.x12
-rw-r--r--src/lib/eina/eina_lock.h2
-rw-r--r--src/tests/eina/eina_test_lock.c40
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);