From: cedric Date: Tue, 9 Aug 2011 08:48:57 +0000 (+0000) Subject: eina: add generic macro to generate error when outside of the main loop. X-Git-Tag: 2.0_alpha~64^2~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3fa4b36cfc95213b45105b9d483775e5b2ab88b3;p=framework%2Fuifw%2Feina.git eina: add generic macro to generate error when outside of the main loop. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/eina@62240 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/src/include/eina_lock.h b/src/include/eina_lock.h index 54af1aa..7fab471 100644 --- a/src/include/eina_lock.h +++ b/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/src/lib/eina_main.c b/src/lib/eina_main.c index 976f08f..d05e8f1 100644 --- a/src/lib/eina_main.c +++ b/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();