From fb56b5f5e34053cde13eedfcc60b7c690149ee84 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 9 Aug 2011 08:48:57 +0000 Subject: [PATCH] eina: add generic macro to generate error when outside of the main loop. SVN revision: 62240 --- legacy/eina/src/include/eina_lock.h | 35 +++++++++++++++++++++++++++++ legacy/eina/src/lib/eina_main.c | 6 +++++ 2 files changed, 41 insertions(+) diff --git a/legacy/eina/src/include/eina_lock.h b/legacy/eina/src/include/eina_lock.h index 54af1aaa8d..7fab47133d 100644 --- a/legacy/eina/src/include/eina_lock.h +++ b/legacy/eina/src/include/eina_lock.h @@ -21,6 +21,7 @@ #include "eina_config.h" #include "eina_types.h" +#include "eina_error.h" /** * @addtogroup Eina_Tools_Group Tools @@ -53,6 +54,8 @@ typedef enum # include "eina_inline_lock_void.x" #endif +EAPI extern Eina_Error EINA_ERROR_NOT_MAIN_LOOP; + static inline Eina_Bool eina_lock_new(Eina_Lock *mutex); static inline void eina_lock_free(Eina_Lock *mutex); static inline Eina_Lock_Result eina_lock_take(Eina_Lock *mutex); @@ -73,6 +76,38 @@ 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); +#ifdef EINA_HAVE_DEBUG_THREADS +# define EINA_MAIN_LOOP_CHECK_RETURN_VAL(val) \ + do { \ + if (EINA_UNLIKELY(eina_main_loop_is())) \ + { \ + eina_error_set(EINA_ERROR_NOT_MAIN_LOOP); \ + EINA_LOG_ERR("You are calling %s from outside" \ + "of the main loop threads in %s at line %i", \ + __FUNCTION__, \ + __FILE__, \ + __LINE__); \ + return val; \ + } \ + } while (0) +# define EINA_MAIN_LOOP_CHECK_RETURN \ + do { \ + if (EINA_UNLIKELY(eina_main_loop_is())) \ + { \ + eina_error_set(EINA_ERROR_NOT_MAIN_LOOP); \ + EINA_LOG_ERR("You are calling %s from outside" \ + "of the main loop threads in %s at line %i", \ + __FUNCTION__, \ + __FILE__, \ + __LINE__); \ + return ; \ + } \ + } while (0) +#else +# define EINA_MAIN_LOOP_CHECK_RETURN_VAL(val) +# define EINA_MAIN_LOOP_CHECK_RETURN +#endif + /** * @} */ diff --git a/legacy/eina/src/lib/eina_main.c b/legacy/eina/src/lib/eina_main.c index 976f08f445..d05e8f18de 100644 --- a/legacy/eina/src/lib/eina_main.c +++ b/legacy/eina/src/lib/eina_main.c @@ -82,6 +82,9 @@ static int _eina_log_dom = -1; #define DBG(...) EINA_LOG_DOM_DBG(_eina_log_dom, __VA_ARGS__) EAPI Eina_Bool _eina_threads_activated = EINA_FALSE; +EAPI Eina_Error EINA_ERROR_NOT_MAIN_LOOP = 0; + +static const char EINA_ERROR_NOT_MAIN_LOOP_STR[] = "Main loop thread check failed."; #ifdef EFL_HAVE_THREADS # ifdef _WIN32_WCE @@ -222,6 +225,9 @@ eina_init(void) return 0; } + EINA_ERROR_NOT_MAIN_LOOP = eina_error_msg_static_register( + EINA_ERROR_NOT_MAIN_LOOP_STR); + #ifdef EFL_HAVE_THREADS # ifdef _WIN32_CE _eina_main_loop = (HANDLE) GetCurrentThreadId();