eina: add generic macro to generate error when outside of the main loop.
authorcedric <cedric>
Tue, 9 Aug 2011 08:48:57 +0000 (08:48 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 9 Aug 2011 08:48:57 +0000 (08:48 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@62240 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/include/eina_lock.h
src/lib/eina_main.c

index 54af1aa..7fab471 100644 (file)
@@ -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
+
 /**
  * @}
  */
index 976f08f..d05e8f1 100644 (file)
@@ -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();