ecore: Use eina locks for _ecore_lock()
authorMike McCormack <mj.mccormack@samsung.com>
Fri, 12 Aug 2011 05:21:49 +0000 (05:21 +0000)
committerMike McCormack <mikem@ring3k.org>
Fri, 12 Aug 2011 05:21:49 +0000 (05:21 +0000)
Always count lock calls too.

Signed-off-by: Mike McCormack <mj.mccormack@samsung.com>
SVN revision: 62372

legacy/ecore/src/lib/ecore/ecore.c
legacy/ecore/src/lib/ecore/ecore_private.h
legacy/ecore/src/lib/ecore/ecore_thread.c

index 9b14b5568dab8b1d7e508930140fd1739741ab83..7af5d4d12c64b784296b6408e290881fd8be6f3d 100644 (file)
@@ -64,6 +64,8 @@ static void _thread_callback(void *data, void *buffer, unsigned int nbyte);
 static Eina_List *_thread_cb = NULL;
 static Ecore_Pipe *_thread_call = NULL;
 static Eina_Lock _thread_safety;
+Eina_Lock _ecore_main_loop_lock;
+int _ecore_main_lock_count;
 
 /** OpenBSD does not define CODESET
  * FIXME ??
@@ -139,6 +141,7 @@ ecore_init(void)
    _ecore_time_init();
 
    eina_lock_new(&_thread_safety);
+   eina_lock_new(&_ecore_main_loop_lock);
    _thread_call = ecore_pipe_add(_thread_callback, NULL);
 
 #if HAVE_MALLINFO
index 10a4f492bf6e311bcc96f70937e97eac2e06dc17..2982de3e3207e0740998026f92eedea77bfed764 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef _ECORE_PRIVATE_H
 #define _ECORE_PRIVATE_H
 
+#include <assert.h>
+
 extern int _ecore_log_dom ;
 #ifdef  _ECORE_DEFAULT_LOG_DOM
 # undef _ECORE_DEFAULT_LOG_DOM
@@ -199,22 +201,31 @@ void _ecore_main_loop_shutdown(void);
 
 void _ecore_throttle(void);
 
-#ifdef HAVE_THREAD_SAFETY
-void _ecore_lock(void);
-void _ecore_unlock(void);
-#else
+extern int _ecore_main_lock_count;
+extern Eina_Lock _ecore_main_loop_lock;
+
 static inline void
 _ecore_lock(void)
 {
+#ifdef HAVE_THREAD_SAFETY
+   eina_lock_take(&_ecore_main_loop_lock);
+#else
    /* at least check we're not being called from a thread */
    EINA_MAIN_LOOP_CHECK_RETURN;
+#endif
+   _ecore_main_lock_count++;
+   assert(_ecore_main_lock_count == 1);
 }
 
 static inline void
 _ecore_unlock(void)
 {
-}
+   _ecore_main_lock_count--;
+   assert(_ecore_main_lock_count == 0);
+#ifdef HAVE_THREAD_SAFETY
+   eina_lock_release(&_ecore_main_loop_lock);
 #endif
+}
 
 /*
  * Callback wrappers all assume that ecore _ecore_lock has been called
index 625b448897f2a8d8796ac8d9670d9e36184dc3d3..987294b09fa3e2214060ca0705b17018b7da6186 100644 (file)
@@ -390,7 +390,6 @@ static LRWK(_ecore_thread_global_hash_lock);
 static LK(_ecore_thread_global_hash_mutex);
 static CD(_ecore_thread_global_hash_cond);
 
-static LK(_ecore_main_loop_mutex);
 static Eina_Bool have_main_loop_thread = 0;
 
 static Eina_Trash *_ecore_thread_worker_trash = NULL;
@@ -794,7 +793,6 @@ _ecore_thread_init(void)
    LKI(_ecore_pending_job_threads_mutex);
    LRWKI(_ecore_thread_global_hash_lock);
    LKI(_ecore_thread_global_hash_mutex);
-   LKI(_ecore_main_loop_mutex);
    CDI(_ecore_thread_global_hash_cond);
 #endif
 }
@@ -874,26 +872,6 @@ _ecore_thread_assert_main_loop_thread(const char *function)
      }
 }
 
-#ifdef HAVE_THREAD_SAFETY
-static int lock_count;
-
-void
-_ecore_lock(void)
-{
-  LKL(_ecore_main_loop_mutex);
-  lock_count++;
-  assert(lock_count == 1);
-}
-
-void
-_ecore_unlock(void)
-{
-  lock_count--;
-  assert(lock_count == 0);
-  LKU(_ecore_main_loop_mutex);
-}
-#endif
-
 EAPI Ecore_Thread *
 ecore_thread_run(Ecore_Thread_Cb func_blocking,
                  Ecore_Thread_Cb func_end,