jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=3059859e28d27919e7a51fa1301f59bd983465c4

commit 3059859e28d27919e7a51fa1301f59bd983465c4
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Tue Dec 29 17:06:53 2015 +0900

    Ecore Eldbus: Work around circular dependencies
    
    eldbus initializes ecore that may then init eldbus again,
    since one of the systemd modules is for eldbus.
    eldbus_shutdown() is then no longer functional, as there are
    two refs on eldbus.
    
    This patch solves this problem by removing the extra ref on
    eldbus from the module if it was already initialized.
    
    This patch now introduces really bad issues since there are now
    EO classes that fail to work after module load-unload-reload.
---
 .../ecore/system/systemd/ecore_system_systemd.c    | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/modules/ecore/system/systemd/ecore_system_systemd.c 
b/src/modules/ecore/system/systemd/ecore_system_systemd.c
index 5756222..26b0867 100644
--- a/src/modules/ecore/system/systemd/ecore_system_systemd.c
+++ b/src/modules/ecore/system/systemd/ecore_system_systemd.c
@@ -11,6 +11,7 @@ static Eldbus_Connection *_conn = NULL;
 
 static Eina_List *_objs = NULL;
 static Eina_List *_proxies = NULL;
+static Eina_Bool _eldbus_initialized = EINA_FALSE;
 
 #ifdef CRI
 #undef CRI
@@ -249,7 +250,22 @@ static void _ecore_system_systemd_shutdown(void);
 static Eina_Bool
 _ecore_system_systemd_init(void)
 {
-   eldbus_init();
+   int ref;
+
+   ref = eldbus_init();
+   if (!ref) return EINA_FALSE;
+   if (ref > 1)
+     {
+        // remove extra ref here, otherwise we have a loop like this:
+        // eldbus -> ecore -> (this module) -> eldbus
+        // and neither eldbus nor ecore can't be shutdown
+        _eldbus_initialized = EINA_FALSE;
+        eldbus_shutdown();
+     }
+   else
+     {
+        _eldbus_initialized = EINA_TRUE;
+     }
 
    _log_dom = eina_log_domain_register("ecore_system_systemd", NULL);
    if (_log_dom < 0)
@@ -315,7 +331,9 @@ _ecore_system_systemd_shutdown(void)
         _log_dom = -1;
      }
 
-   eldbus_shutdown();
+   if (_eldbus_initialized)
+     eldbus_shutdown();
+   _eldbus_initialized = EINA_FALSE;
 }
 
 EINA_MODULE_INIT(_ecore_system_systemd_init);

-- 


Reply via email to