bz5 - ensure we unref bluez dbus objects to free them

This commit is contained in:
Carsten Haitzler 2019-10-08 14:54:52 +01:00
parent a0fc5a7c30
commit acee84c8eb
3 changed files with 43 additions and 28 deletions

View File

@ -13,6 +13,7 @@ typedef struct _Obj Obj;
struct _Obj {
//// internal object data
Eldbus_Object *obj;
Eldbus_Proxy *proxy;
Eldbus_Proxy *prop_proxy;
Eldbus_Signal_Handler *prop_sig;

View File

@ -2,6 +2,7 @@
#include "e.h"
static Eldbus_Service_Interface *agent_iface = NULL;
static Eldbus_Object *agent_obj = NULL;
static Eldbus_Proxy *agent_proxy = NULL;
static void (*fn_release) (void) = NULL;
static void (*fn_cancel) (void) = NULL;
@ -149,6 +150,11 @@ cb_unregister(void *data EINA_UNUSED, const Eldbus_Message *msg,
eldbus_proxy_unref(agent_proxy);
agent_proxy = NULL;
}
if (agent_obj)
{
eldbus_object_unref(agent_obj);
agent_obj = NULL;
}
if (agent_iface)
{
eldbus_service_object_unregister(agent_iface);
@ -266,10 +272,8 @@ bz_agent_msg_u32_add(Eldbus_Message *msg, unsigned int u32)
void
bz_agent_init(void)
{
Eldbus_Object *obj;
obj = eldbus_object_get(bz_conn, "org.bluez", "/org/bluez");
agent_proxy = eldbus_proxy_get(obj, "org.bluez.AgentManager1");
agent_obj = eldbus_object_get(bz_conn, "org.bluez", "/org/bluez");
agent_proxy = eldbus_proxy_get(agent_obj, "org.bluez.AgentManager1");
agent_iface = eldbus_service_interface_register
(bz_conn, "/org/enlightenment/bluez5/agent", &agent_desc);
if (agent_proxy)

View File

@ -1,6 +1,7 @@
#include "bz.h"
#include "e_mod_main.h"
static Eldbus_Object *objman_obj = NULL;
static Eldbus_Proxy *objman_proxy = NULL;
static Eldbus_Signal_Handler *sig_ifadd = NULL;
static Eldbus_Signal_Handler *sig_ifdel = NULL;
@ -295,18 +296,16 @@ cb_obj_prop_changed(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSE
Obj *
bz_obj_add(const char *path)
{
Eldbus_Object *obj;
Obj *o = calloc(1, sizeof(Obj));
o->ref = 1;
o->path = eina_stringshare_add(path);
obj = eldbus_object_get(bz_conn, "org.bluez", o->path);
o->obj = eldbus_object_get(bz_conn, "org.bluez", o->path);
o->type = BZ_OBJ_UNKNOWN;
o->in_table = EINA_TRUE;
eina_hash_add(obj_table, o->path, o);
if (!strcmp(o->path, "/org/bluez"))
{
o->proxy = eldbus_proxy_get(obj, "org.bluez.AgentManager1");
o->proxy = eldbus_proxy_get(o->obj, "org.bluez.AgentManager1");
o->type = BZ_OBJ_BLUEZ;
o->add_called = EINA_TRUE;
bz_obj_ref(o);
@ -317,12 +316,12 @@ bz_obj_add(const char *path)
// all devices are /org/bluez/XXX/dev_XXX so look for /dev_
else if (strstr(o->path, "/dev_"))
{
o->proxy = eldbus_proxy_get(obj, "org.bluez.Device1");
o->proxy = eldbus_proxy_get(o->obj, "org.bluez.Device1");
o->type = BZ_OBJ_DEVICE;
if (o->proxy)
{
eldbus_proxy_property_get_all(o->proxy, cb_obj_prop, o);
o->prop_proxy = eldbus_proxy_get(obj,
o->prop_proxy = eldbus_proxy_get(o->obj,
"org.freedesktop.DBus.Properties");
if (o->prop_proxy)
o->prop_sig = eldbus_proxy_signal_handler_add(o->prop_proxy,
@ -334,12 +333,12 @@ bz_obj_add(const char *path)
// all dadapters begin with /org/bluez/
else if (!strncmp(o->path, "/org/bluez/", 11))
{
o->proxy = eldbus_proxy_get(obj, "org.bluez.Adapter1");
o->proxy = eldbus_proxy_get(o->obj, "org.bluez.Adapter1");
o->type = BZ_OBJ_ADAPTER;
if (o->proxy)
{
eldbus_proxy_property_get_all(o->proxy, cb_obj_prop, o);
o->prop_proxy = eldbus_proxy_get(obj,
o->prop_proxy = eldbus_proxy_get(o->obj,
"org.freedesktop.DBus.Properties");
if (o->prop_proxy)
o->prop_sig = eldbus_proxy_signal_handler_add(o->prop_proxy,
@ -742,16 +741,6 @@ bz_obj_unref(Obj *o)
eldbus_signal_handler_del(o->prop_sig);
o->prop_sig = NULL;
}
if (o->proxy)
{
eldbus_proxy_unref(o->proxy);
o->proxy = NULL;
}
if (o->prop_proxy)
{
eldbus_proxy_unref(o->prop_proxy);
o->prop_proxy = NULL;
}
if (o->path)
{
eina_stringshare_del(o->path);
@ -787,6 +776,21 @@ bz_obj_unref(Obj *o)
ecore_exe_free(o->ping_exe);
o->ping_exe = NULL;
}
if (o->proxy)
{
eldbus_proxy_unref(o->proxy);
o->proxy = NULL;
}
if (o->prop_proxy)
{
eldbus_proxy_unref(o->prop_proxy);
o->prop_proxy = NULL;
}
if (o->obj)
{
eldbus_object_unref(o->obj);
o->obj = NULL;
}
free(o);
}
@ -894,12 +898,10 @@ _obj_hash_free(Obj *o)
void
bz_obj_init(void)
{
Eldbus_Object *obj;
obj_table = eina_hash_string_superfast_new((void *)_obj_hash_free);
obj = eldbus_object_get(bz_conn, "org.bluez", "/");
objman_proxy = eldbus_proxy_get(obj, "org.freedesktop.DBus.ObjectManager");
objman_obj = eldbus_object_get(bz_conn, "org.bluez", "/");
objman_proxy = eldbus_proxy_get(objman_obj, "org.freedesktop.DBus.ObjectManager");
sig_ifadd = eldbus_proxy_signal_handler_add(objman_proxy, "InterfacesAdded",
cb_obj_add, NULL);
sig_ifdel = eldbus_proxy_signal_handler_add(objman_proxy, "InterfacesRemoved",
@ -928,8 +930,16 @@ bz_obj_shutdown(void)
eldbus_signal_handler_del(sig_ifdel);
sig_ifdel = NULL;
}
eldbus_proxy_unref(objman_proxy);
objman_proxy = NULL;
if (objman_proxy)
{
eldbus_proxy_unref(objman_proxy);
objman_proxy = NULL;
}
if (objman_obj)
{
eldbus_object_unref(objman_obj);
objman_obj = NULL;
}
}
void