summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric.bail@samsung.com>2014-03-06 14:26:30 +0900
committerCedric BAIL <cedric.bail@samsung.com>2014-03-06 14:27:26 +0900
commitc3e0f5c4ef7922c2fe29db66e4744a987f31bff3 (patch)
tree18c8c2b515d9452a9cc6ce0296eb82f951729d27
parent25c58f149a22cfc62e093d31627b2f11542a37c1 (diff)
downloadefl-c3e0f5c4ef7922c2fe29db66e4744a987f31bff3.tar.gz
eina: make Eina_Error thread safe.
@feature
-rw-r--r--src/lib/eina/eina_error.c20
-rw-r--r--src/lib/eina/eina_error.h4
-rw-r--r--src/lib/eina/eina_lock.h2
3 files changed, 22 insertions, 4 deletions
diff --git a/src/lib/eina/eina_error.c b/src/lib/eina/eina_error.c
index 428c4146b9..0ccac35568 100644
--- a/src/lib/eina/eina_error.c
+++ b/src/lib/eina/eina_error.c
@@ -23,6 +23,7 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <stdint.h>
#ifdef HAVE_EVIL
# include <Evil.h>
@@ -36,6 +37,7 @@
#include "eina_safety_checks.h"
#include "eina_error.h"
#include "eina_stringshare.h"
+#include "eina_lock.h"
/* TODO
* + add a wrapper for assert?
@@ -62,7 +64,9 @@ struct _Eina_Error_Message
static Eina_Error_Message *_eina_errors = NULL;
static size_t _eina_errors_count = 0;
static size_t _eina_errors_allocated = 0;
+
static Eina_Error _eina_last_error;
+static Eina_TLS _eina_last_key;
static Eina_Error_Message *
_eina_error_msg_alloc(void)
@@ -132,6 +136,7 @@ eina_error_init(void)
/* TODO register the eina's basic errors */
EINA_ERROR_OUT_OF_MEMORY = eina_error_msg_static_register(
EINA_ERROR_OUT_OF_MEMORY_STR);
+ eina_tls_new(&_eina_last_key);
return EINA_TRUE;
}
@@ -158,11 +163,14 @@ eina_error_shutdown(void)
if (eem->string_allocated)
eina_stringshare_del(eem->string);
- free(_eina_errors);
+ free(_eina_errors);
_eina_errors = NULL;
_eina_errors_count = 0;
_eina_errors_allocated = 0;
+ eina_tls_free(_eina_last_key);
+ _eina_last_error = 0;
+
return EINA_TRUE;
}
@@ -249,13 +257,19 @@ eina_error_msg_get(Eina_Error error)
EAPI Eina_Error
eina_error_get(void)
{
- return _eina_last_error;
+ if (eina_main_loop_is())
+ return _eina_last_error;
+
+ return (Eina_Error)(uintptr_t) eina_tls_get(_eina_last_key);
}
EAPI void
eina_error_set(Eina_Error err)
{
- _eina_last_error = err;
+ if (eina_main_loop_is())
+ _eina_last_error = err;
+ else
+ eina_tls_set(_eina_last_key, (void*)(uintptr_t) err);
}
EAPI Eina_Error
diff --git a/src/lib/eina/eina_error.h b/src/lib/eina/eina_error.h
index e4205e4e45..61f375070c 100644
--- a/src/lib/eina/eina_error.h
+++ b/src/lib/eina/eina_error.h
@@ -150,6 +150,8 @@ EAPI Eina_Bool eina_error_msg_modify(Eina_Error error,
*
* This function returns the last error set by eina_error_set(). The
* description of the message is returned by eina_error_msg_get().
+ *
+ * This function is thread safe @since 1.10, but slower to use.
*/
EAPI Eina_Error eina_error_get(void);
@@ -163,6 +165,8 @@ EAPI Eina_Error eina_error_get(void);
*
* @note This is also used to clear previous errors, in that case @p err should
* be @c 0.
+ *
+ * This function is thread safe @since 1.10, but slower to use.
*/
EAPI void eina_error_set(Eina_Error err);
diff --git a/src/lib/eina/eina_lock.h b/src/lib/eina/eina_lock.h
index ac0c8b1bb3..7c12717a11 100644
--- a/src/lib/eina/eina_lock.h
+++ b/src/lib/eina/eina_lock.h
@@ -22,7 +22,7 @@
#include "eina_config.h"
#include "eina_types.h"
#include "eina_error.h"
-
+#include "eina_main.h"
/**
* @addtogroup Eina_Tools_Group Tools
*