fix bug where idlers might not be able to run.
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 27 Apr 2011 11:09:49 +0000 (11:09 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 27 Apr 2011 11:09:49 +0000 (11:09 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/e_dbus@58954 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
src/lib/dbus/e_dbus.c
src/lib/dbus/e_dbus_private.h

index c430a0d..33ad9b3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,3 +9,10 @@
 2011-03-19  Mike Blumenkrantz
 
         * Fix crash in e-notify-send when invalid DBUS_SESSION_BUS_ADDRESS is specified
+
+2011-04-27  Carsten Haitzler (The Rasterman)
+
+        * Fix bug when app has no idle time (always busy), idlers
+        can't run to process edbus dispatches. Move this to an idle
+        enterer that wil be run.
+
index 179b149..024b4c6 100644 (file)
@@ -185,7 +185,7 @@ e_dbus_connection_free(void *data)
 
   if (cd->conn_name) free(cd->conn_name);
 
-  if (cd->idler) ecore_idler_del(cd->idler);
+  if (cd->idler) ecore_idle_enterer_del(cd->idler);
 
   free(cd);
 }
@@ -199,11 +199,25 @@ cb_main_wakeup(void *data)
 
   cd = data;
 
-  if (!cd->idler) cd->idler = ecore_idler_add(e_dbus_idler, cd);
+  if (!cd->idler) cd->idler = ecore_idle_enterer_add(e_dbus_idler, cd);
   else DBG("already idling");
 }
 
 static void
+e_dbus_loop_wakeup(void)
+{
+  static int dummy_event = 0;
+
+  /* post a dummy event to get the mainloop back to normal - this is
+   * needed because idlers are very special things that won't re-evaluate
+   * timers and other stuff while idelrs run - idle_exiters and enterers
+   * can do this safely, but not idlers. idelrs were meant to be used
+   * very sparingly for very special cases */
+  if (dummy_event == 0) dummy_event = ecore_event_type_new();
+  ecore_event_add(dummy_event, NULL, NULL, NULL);
+}
+
+static void
 cb_dispatch_status(DBusConnection *conn __UNUSED__, DBusDispatchStatus new_status, void *data)
 {
   E_DBus_Connection *cd;
@@ -211,21 +225,13 @@ cb_dispatch_status(DBusConnection *conn __UNUSED__, DBusDispatchStatus new_statu
   DBG("dispatch status: %d!", new_status);
   cd = data;
 
-  if (new_status == DBUS_DISPATCH_DATA_REMAINS && !cd->idler) cd->idler = ecore_idler_add(e_dbus_idler, cd);
+  if (new_status == DBUS_DISPATCH_DATA_REMAINS && !cd->idler) cd->idler = ecore_idle_enterer_add(e_dbus_idler, cd);
 
   else if (new_status != DBUS_DISPATCH_DATA_REMAINS && cd->idler) 
   {
-    static int dummy_event = 0;
-
-    ecore_idler_del(cd->idler);
+    ecore_idle_enterer_del(cd->idler);
     cd->idler = NULL;
-    /* post a dummy event to get the mainloop back to normal - this is
-     * needed because idlers are very special things that won't re-evaluate
-     * timers and other stuff while idelrs run - idle_exiters and enterers
-     * can do this safely, but not idlers. idelrs were meant to be used
-     * very sparingly for very special cases */
-    if (dummy_event == 0) dummy_event = ecore_event_type_new();
-    ecore_event_add(dummy_event, NULL, NULL, NULL);
+    e_dbus_loop_wakeup();
   }
 }
 
@@ -437,6 +443,7 @@ e_dbus_idler(void *data)
       e_dbus_connection_close(cd);
     } while (--close_connection);
   }
+  e_dbus_loop_wakeup();
   return ECORE_CALLBACK_RENEW;
 }
 
@@ -554,7 +561,7 @@ e_dbus_connection_close(E_DBus_Connection *conn)
   /* Idler functin must be cancelled when dbus connection is  unreferenced */
   if (conn->idler)
     {
-      ecore_idler_del(conn->idler);
+      ecore_idle_enterer_del(conn->idler);
       conn->idler = NULL;
     }
 
index 93fce49..c74caee 100644 (file)
@@ -26,7 +26,7 @@ struct E_DBus_Connection
   Eina_List *signal_handlers;
   void (*signal_dispatcher)(E_DBus_Connection *conn, DBusMessage *msg);
 
-  Ecore_Idler *idler;
+  Ecore_Idle_Enterer *idler;
 
   int refcount;
 };