ecore: lock all broadcast.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 23 Sep 2011 13:26:54 +0000 (13:26 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 23 Sep 2011 13:26:54 +0000 (13:26 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@63567 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore/ecore.c

index db75622..2560d91 100644 (file)
@@ -87,6 +87,7 @@ static Eina_Condition _thread_feedback_cond;
 static Eina_Lock _thread_id_lock;
 static int _thread_id = -1;
 static int _thread_id_max = 0;
+static int _thread_id_update = 0;
 
 Eina_Lock _ecore_main_loop_lock;
 int _ecore_main_lock_count;
@@ -361,9 +362,9 @@ ecore_thread_main_loop_begin(void)
    eina_condition_new(&order->c, &order->m);
    order->suspend = EINA_TRUE;
 
-   eina_lock_take(&order->m);
    _ecore_main_loop_thread_safe_call(order);
 
+   eina_lock_take(&order->m);
    while (order->current_id != _thread_id)
      eina_condition_wait(&order->c);
    eina_lock_release(&order->m);
@@ -400,6 +401,7 @@ ecore_thread_main_loop_end(void)
    current_id = _thread_id;
 
    eina_lock_take(&_thread_mutex);
+   _thread_id_update = _thread_id;
    eina_condition_broadcast(&_thread_cond);
    eina_lock_release(&_thread_mutex);
 
@@ -675,11 +677,13 @@ _thread_callback(void *data __UNUSED__,
           {
              eina_lock_take(&_thread_mutex);
 
+            eina_lock_take(&call->m);
             _thread_id = call->current_id;
-
              eina_condition_broadcast(&call->c);
+            eina_lock_release(&call->m);
 
-             eina_condition_wait(&_thread_cond);
+            while (_thread_id_update != _thread_id)
+              eina_condition_wait(&_thread_cond);
              eina_lock_release(&_thread_mutex);
 
             _thread_id = -1;