mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-17 08:56:49 -05:00
bluez5: fix memory leak on device battery path
This commit is contained in:
parent
e9adb2844e
commit
d0636875ee
2 changed files with 19 additions and 16 deletions
|
|
@ -158,33 +158,35 @@ static int spa_bt_transport_start_release_timer(struct spa_bt_transport *transpo
|
||||||
// Developed using https://github.com/dgreid/adhd/commit/655b58f as an example of DBus calls.
|
// Developed using https://github.com/dgreid/adhd/commit/655b58f as an example of DBus calls.
|
||||||
|
|
||||||
// Name of battery, formatted as /org/freedesktop/pipewire/battery/org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX
|
// Name of battery, formatted as /org/freedesktop/pipewire/battery/org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX
|
||||||
static char *battery_get_name(struct spa_bt_device *device)
|
static char *battery_get_name(const char *device_path)
|
||||||
{
|
{
|
||||||
char *path = malloc(strlen(PIPEWIRE_BATTERY_PROVIDER) + strlen(device->path) + 1);
|
char *path = malloc(strlen(PIPEWIRE_BATTERY_PROVIDER) + strlen(device_path) + 1);
|
||||||
sprintf(path, PIPEWIRE_BATTERY_PROVIDER "%s", device->path);
|
sprintf(path, PIPEWIRE_BATTERY_PROVIDER "%s", device_path);
|
||||||
|
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unregister virtual battery of device
|
// Unregister virtual battery of device
|
||||||
static void battery_remove(struct spa_bt_device *device) {
|
static void battery_remove(struct spa_bt_device *device) {
|
||||||
if (!device->adapter->has_battery_provider) return;
|
DBusMessageIter i, entry;
|
||||||
|
DBusMessage *m;
|
||||||
|
const char *interface;
|
||||||
|
|
||||||
spa_log_debug(device->monitor->log, NAME": Removing virtual battery: %s", battery_get_name(device));
|
if (!device->adapter->has_battery_provider || !device->has_battery)
|
||||||
|
return;
|
||||||
|
|
||||||
DBusMessage *m = dbus_message_new_signal(PIPEWIRE_BATTERY_PROVIDER,
|
spa_log_debug(device->monitor->log, NAME": Removing virtual battery: %s", device->battery_path);
|
||||||
|
|
||||||
|
m = dbus_message_new_signal(PIPEWIRE_BATTERY_PROVIDER,
|
||||||
DBUS_INTERFACE_OBJECT_MANAGER,
|
DBUS_INTERFACE_OBJECT_MANAGER,
|
||||||
DBUS_SIGNAL_INTERFACES_REMOVED);
|
DBUS_SIGNAL_INTERFACES_REMOVED);
|
||||||
|
|
||||||
DBusMessageIter i, entry;
|
|
||||||
|
|
||||||
dbus_message_iter_init_append(m, &i);
|
dbus_message_iter_init_append(m, &i);
|
||||||
const char *bat_name = battery_get_name(device);
|
|
||||||
dbus_message_iter_append_basic(&i, DBUS_TYPE_OBJECT_PATH,
|
dbus_message_iter_append_basic(&i, DBUS_TYPE_OBJECT_PATH,
|
||||||
&bat_name);
|
&device->battery_path);
|
||||||
dbus_message_iter_open_container(&i, DBUS_TYPE_ARRAY,
|
dbus_message_iter_open_container(&i, DBUS_TYPE_ARRAY,
|
||||||
DBUS_TYPE_STRING_AS_STRING, &entry);
|
DBUS_TYPE_STRING_AS_STRING, &entry);
|
||||||
const char *interface = BLUEZ_INTERFACE_BATTERY_PROVIDER;
|
interface = BLUEZ_INTERFACE_BATTERY_PROVIDER;
|
||||||
dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
|
dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
|
||||||
&interface);
|
&interface);
|
||||||
dbus_message_iter_close_container(&i, &entry);
|
dbus_message_iter_close_container(&i, &entry);
|
||||||
|
|
@ -231,13 +233,12 @@ static void battery_write_properties(DBusMessageIter *iter, struct spa_bt_device
|
||||||
// Send current percentage to BlueZ
|
// Send current percentage to BlueZ
|
||||||
static void battery_update(struct spa_bt_device *device)
|
static void battery_update(struct spa_bt_device *device)
|
||||||
{
|
{
|
||||||
const char *name = battery_get_name(device);
|
spa_log_debug(device->monitor->log, NAME": updating battery: %s", device->battery_path);
|
||||||
spa_log_debug(device->monitor->log, NAME": updating battery: %s", name);
|
|
||||||
|
|
||||||
DBusMessage *msg;
|
DBusMessage *msg;
|
||||||
DBusMessageIter iter;
|
DBusMessageIter iter;
|
||||||
|
|
||||||
msg = dbus_message_new_signal(name,
|
msg = dbus_message_new_signal(device->battery_path,
|
||||||
DBUS_INTERFACE_PROPERTIES,
|
DBUS_INTERFACE_PROPERTIES,
|
||||||
DBUS_SIGNAL_PROPERTIES_CHANGED);
|
DBUS_SIGNAL_PROPERTIES_CHANGED);
|
||||||
|
|
||||||
|
|
@ -263,9 +264,8 @@ static void battery_create(struct spa_bt_device *device) {
|
||||||
DBUS_SIGNAL_INTERFACES_ADDED);
|
DBUS_SIGNAL_INTERFACES_ADDED);
|
||||||
|
|
||||||
dbus_message_iter_init_append(msg, &iter);
|
dbus_message_iter_init_append(msg, &iter);
|
||||||
const char *bat_name = battery_get_name(device);
|
|
||||||
dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
|
dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
|
||||||
&bat_name);
|
&device->battery_path);
|
||||||
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}", &dict);
|
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}", &dict);
|
||||||
dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL, &entry);
|
dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, NULL, &entry);
|
||||||
const char *interface = BLUEZ_INTERFACE_BATTERY_PROVIDER;
|
const char *interface = BLUEZ_INTERFACE_BATTERY_PROVIDER;
|
||||||
|
|
@ -637,6 +637,7 @@ static struct spa_bt_device *device_create(struct spa_bt_monitor *monitor, const
|
||||||
d->id = monitor->id++;
|
d->id = monitor->id++;
|
||||||
d->monitor = monitor;
|
d->monitor = monitor;
|
||||||
d->path = strdup(path);
|
d->path = strdup(path);
|
||||||
|
d->battery_path = battery_get_name(d->path);
|
||||||
spa_list_init(&d->remote_endpoint_list);
|
spa_list_init(&d->remote_endpoint_list);
|
||||||
spa_list_init(&d->transport_list);
|
spa_list_init(&d->transport_list);
|
||||||
spa_list_init(&d->codec_switch_list);
|
spa_list_init(&d->codec_switch_list);
|
||||||
|
|
@ -697,6 +698,7 @@ static void device_free(struct spa_bt_device *device)
|
||||||
free(device->alias);
|
free(device->alias);
|
||||||
free(device->address);
|
free(device->address);
|
||||||
free(device->adapter_path);
|
free(device->adapter_path);
|
||||||
|
free(device->battery_path);
|
||||||
free(device->name);
|
free(device->name);
|
||||||
free(device->icon);
|
free(device->icon);
|
||||||
free(device);
|
free(device);
|
||||||
|
|
|
||||||
|
|
@ -394,6 +394,7 @@ struct spa_bt_device {
|
||||||
char *alias;
|
char *alias;
|
||||||
char *address;
|
char *address;
|
||||||
char *adapter_path;
|
char *adapter_path;
|
||||||
|
char *battery_path;
|
||||||
char *name;
|
char *name;
|
||||||
char *icon;
|
char *icon;
|
||||||
uint32_t bluetooth_class;
|
uint32_t bluetooth_class;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue