ecore - system modules - fix eldbus interdependency and complaints

so ecore uses ecore system modules ... that use eldbus. eldbus inits
ecore. this is a vicious cycle. eldbus shouldnt init ecore. it's a
dependency but should be provided outside of initting eldbus. this all
led to hack-arounds on initting eldbus in these ecore modules that
just break things like shutting down eldbus when still in use.

this ensures any pending messages are canceled on ecore module shutdown.
this ensures every ecore module fully inits and shuts down eldbus as
they should so refcounting the inits works.
this stops eldbus from inittign ecore to avoid the circuluar dependency.

this stops lots of CRI/ERR complaints eg if you run elua with no
cmdline options.

this is just better.

@fix
This commit is contained in:
Carsten Haitzler 2016-04-12 14:11:32 +09:00
parent f54a2eb570
commit 53c66c98c2
3 changed files with 52 additions and 45 deletions

View File

@ -115,15 +115,6 @@ eldbus_init(void)
return 0;
}
if (!ecore_init())
{
ERR("Unable to initialize ecore");
eina_log_domain_unregister(_eldbus_log_dom);
_eldbus_log_dom = -1;
eina_shutdown();
return 0;
}
eina_magic_string_set(ELDBUS_CONNECTION_MAGIC, "Eldbus_Connection");
eina_magic_string_set(ELDBUS_MESSAGE_MAGIC, "Eldbus_Message");
eina_magic_string_set(ELDBUS_SIGNAL_HANDLER_MAGIC, "Eldbus_Signal_Handler");
@ -154,7 +145,6 @@ pending_failed:
signal_handler_failed:
eldbus_message_shutdown();
message_failed:
ecore_shutdown();
eina_log_domain_unregister(eldbus_model_log_dom);
eldbus_model_log_dom = -1;
eina_log_domain_unregister(_eldbus_log_dom);
@ -257,7 +247,6 @@ eldbus_shutdown(void)
eldbus_signal_handler_shutdown();
eldbus_message_shutdown();
ecore_shutdown();
eina_log_domain_unregister(eldbus_model_log_dom);
eldbus_model_log_dom = -1;
eina_log_domain_unregister(_eldbus_log_dom);

View File

@ -11,7 +11,7 @@ static Eldbus_Connection *_conn = NULL;
static Eina_List *_objs = NULL;
static Eina_List *_proxies = NULL;
static Eina_Bool _eldbus_initialized = EINA_FALSE;
static Eina_List *_eldbus_pending = NULL;
#ifdef CRI
#undef CRI
@ -122,11 +122,12 @@ static void _locale_envs_unset(void)
}
static void _locale_get(void *data EINA_UNUSED, const Eldbus_Message *msg,
Eldbus_Pending *pending EINA_UNUSED)
Eldbus_Pending *pending)
{
Eldbus_Message_Iter *variant, *array;
const char *errname, *errmsg, *val;
_eldbus_pending = eina_list_remove(_eldbus_pending, pending);
if (eldbus_message_error_get(msg, &errname, &errmsg))
{
ERR("Message error %s - %s", errname, errmsg);
@ -174,6 +175,7 @@ _props_changed_locale(void *data, const Eldbus_Message *msg)
Eldbus_Proxy *proxy = data;
Eldbus_Message_Iter *changed, *entry, *invalidated;
const char *iface, *prop;
Eldbus_Pending *pend;
if (!eldbus_message_arguments_get(msg, "sa{sv}as",
&iface, &changed, &invalidated))
@ -201,7 +203,8 @@ _props_changed_locale(void *data, const Eldbus_Message *msg)
return;
changed_locale:
eldbus_proxy_property_get(proxy, "Locale", _locale_get, NULL);
pend = eldbus_proxy_property_get(proxy, "Locale", _locale_get, NULL);
_eldbus_pending = eina_list_append(_eldbus_pending, pend);
}
static Eina_Bool
@ -250,22 +253,7 @@ static void _ecore_system_systemd_shutdown(void);
static Eina_Bool
_ecore_system_systemd_init(void)
{
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;
}
eldbus_init();
_log_dom = eina_log_domain_register("ecore_system_systemd", NULL);
if (_log_dom < 0)
@ -305,6 +293,8 @@ _ecore_system_systemd_init(void)
static void
_ecore_system_systemd_shutdown(void)
{
Eldbus_Pending *pend;
DBG("ecore system 'systemd' unloaded");
while (_proxies)
@ -331,9 +321,12 @@ _ecore_system_systemd_shutdown(void)
_log_dom = -1;
}
if (_eldbus_initialized)
eldbus_shutdown();
_eldbus_initialized = EINA_FALSE;
EINA_LIST_FREE(_eldbus_pending, pend)
{
eldbus_pending_cancel(pend);
}
eldbus_shutdown();
}
EINA_MODULE_INIT(_ecore_system_systemd_init);

View File

@ -45,6 +45,8 @@ static Eina_Bool _ecore_on_battery = EINA_FALSE;
static Eina_Bool _ecore_low_battery = EINA_FALSE;
static int _ecore_battery_level = -1;
static Eina_List *_eldbus_pending = NULL;
static Eina_Bool _ecore_system_upower_display_device_init(void);
static void _ecore_system_upower_shutdown(void);
@ -89,11 +91,12 @@ _warning_level_from_variant(Eldbus_Message_Iter *variant)
static void
_warning_level_get_cb(void *data EINA_UNUSED,
const Eldbus_Message *msg,
Eldbus_Pending *pending EINA_UNUSED)
Eldbus_Pending *pending)
{
Eldbus_Message_Iter *variant;
const char *errname, *errmsg;
_eldbus_pending = eina_list_remove(_eldbus_pending, pending);
if (eldbus_message_error_get(msg, &errname, &errmsg))
{
// don't print errors because this results in complaints about upower not
@ -113,8 +116,11 @@ _warning_level_get_cb(void *data EINA_UNUSED,
static void
_warning_level_get(Eldbus_Proxy *proxy)
{
eldbus_proxy_property_get(proxy, "WarningLevel",
_warning_level_get_cb, NULL);
Eldbus_Pending *pend;
pend = eldbus_proxy_property_get(proxy, "WarningLevel",
_warning_level_get_cb, NULL);
_eldbus_pending = eina_list_append(_eldbus_pending, pend);
}
static void
@ -135,11 +141,12 @@ _on_low_battery_from_variant(Eldbus_Message_Iter *variant)
static void
_on_low_battery_get_cb(void *data EINA_UNUSED, const Eldbus_Message *msg,
Eldbus_Pending *pending EINA_UNUSED)
Eldbus_Pending *pending)
{
Eldbus_Message_Iter *variant;
const char *errname, *errmsg;
_eldbus_pending = eina_list_remove(_eldbus_pending, pending);
if (eldbus_message_error_get(msg, &errname, &errmsg))
{
ERR("Message error %s - %s", errname, errmsg);
@ -157,8 +164,11 @@ _on_low_battery_get_cb(void *data EINA_UNUSED, const Eldbus_Message *msg,
static void
_on_low_battery_get(Eldbus_Proxy *proxy)
{
eldbus_proxy_property_get(proxy, "OnLowBattery",
_on_low_battery_get_cb, NULL);
Eldbus_Pending *pend;
pend = eldbus_proxy_property_get(proxy, "OnLowBattery",
_on_low_battery_get_cb, NULL);
_eldbus_pending = eina_list_append(_eldbus_pending, pend);
}
static void
@ -179,11 +189,12 @@ _on_battery_from_variant(Eldbus_Message_Iter *variant)
static void
_on_battery_get_cb(void *data EINA_UNUSED, const Eldbus_Message *msg,
Eldbus_Pending *pending EINA_UNUSED)
Eldbus_Pending *pending)
{
Eldbus_Message_Iter *variant;
const char *errname, *errmsg;
_eldbus_pending = eina_list_remove(_eldbus_pending, pending);
if (eldbus_message_error_get(msg, &errname, &errmsg))
{
ERR("Message error %s - %s", errname, errmsg);
@ -201,8 +212,11 @@ _on_battery_get_cb(void *data EINA_UNUSED, const Eldbus_Message *msg,
static void
_on_battery_get(Eldbus_Proxy *proxy)
{
eldbus_proxy_property_get(proxy, "OnBattery",
_on_battery_get_cb, NULL);
Eldbus_Pending *pend;
pend = eldbus_proxy_property_get(proxy, "OnBattery",
_on_battery_get_cb, NULL);
_eldbus_pending = eina_list_append(_eldbus_pending, pend);
}
static void
@ -263,11 +277,12 @@ _daemon_version_from_variant(Eldbus_Message_Iter *variant)
static void
_daemon_version_get_cb(void *data EINA_UNUSED, const Eldbus_Message *msg,
Eldbus_Pending *pending EINA_UNUSED)
Eldbus_Pending *pending)
{
Eldbus_Message_Iter *variant;
const char *errname, *errmsg;
_eldbus_pending = eina_list_remove(_eldbus_pending, pending);
if (eldbus_message_error_get(msg, &errname, &errmsg))
{
ERR("Message error %s - %s", errname, errmsg);
@ -285,8 +300,11 @@ _daemon_version_get_cb(void *data EINA_UNUSED, const Eldbus_Message *msg,
static void
_daemon_version_get(Eldbus_Proxy *proxy)
{
eldbus_proxy_property_get(proxy, "DaemonVersion",
_daemon_version_get_cb, NULL);
Eldbus_Pending *pend;
pend = eldbus_proxy_property_get(proxy, "DaemonVersion",
_daemon_version_get_cb, NULL);
_eldbus_pending = eina_list_append(_eldbus_pending, pend);
}
static void
@ -445,6 +463,8 @@ _ecore_system_upower_init(void)
static void
_ecore_system_upower_shutdown(void)
{
Eldbus_Pending *pend;
DBG("ecore system 'upower' unloaded");
eldbus_name_owner_changed_callback_del(_conn, "org.freedesktop.UPower",
@ -486,6 +506,11 @@ _ecore_system_upower_shutdown(void)
_log_dom = -1;
}
EINA_LIST_FREE(_eldbus_pending, pend)
{
eldbus_pending_cancel(pend);
}
eldbus_shutdown();
}