fix: cancel and free battery register pending call

This commit is contained in:
Dmitry Sharshakov 2021-03-11 18:09:51 +03:00 committed by Wim Taymans
parent 5c9028a94d
commit a0ac3ac8dd
2 changed files with 17 additions and 6 deletions

View file

@ -292,6 +292,8 @@ static void on_battery_provider_registered(DBusPendingCall *pending_call,
reply = dbus_pending_call_steal_reply(pending_call);
dbus_pending_call_unref(pending_call);
device->battery_pending_call = NULL;
if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
spa_log_error(device->monitor->log, NAME": Failed to register battery provider. Error: %s", dbus_message_get_error_name(reply));
spa_log_error(device->monitor->log, NAME": BlueZ Battery Provider is not available, won't retry to register it. Make sure you are running BlueZ 5.56+ with experimental features to use Battery Provider.");
@ -315,7 +317,6 @@ static void register_battery_provider(struct spa_bt_device *device)
{
DBusMessage *method_call;
DBusMessageIter message_iter;
DBusPendingCall *pending_call;
method_call = dbus_message_new_method_call(
BLUEZ_SERVICE, device->adapter_path,
@ -332,7 +333,7 @@ static void register_battery_provider(struct spa_bt_device *device)
dbus_message_iter_append_basic(&message_iter, DBUS_TYPE_OBJECT_PATH,
&object_path);
if (!dbus_connection_send_with_reply(device->monitor->conn, method_call, &pending_call,
if (!dbus_connection_send_with_reply(device->monitor->conn, method_call, &device->battery_pending_call,
DBUS_TIMEOUT_USE_DEFAULT)) {
dbus_message_unref(method_call);
spa_log_error(device->monitor->log, NAME": Failed to register battery provider");
@ -341,17 +342,17 @@ static void register_battery_provider(struct spa_bt_device *device)
dbus_message_unref(method_call);
if (!pending_call) {
if (!device->battery_pending_call) {
spa_log_error(device->monitor->log, NAME": Failed to register battery provider");
return;
}
if (!dbus_pending_call_set_notify(
pending_call, on_battery_provider_registered,
device->battery_pending_call, on_battery_provider_registered,
device, NULL)) {
spa_log_error(device->monitor->log, "Failed to register battery provider");
dbus_pending_call_cancel(pending_call);
dbus_pending_call_unref(pending_call);
dbus_pending_call_cancel(device->battery_pending_call);
dbus_pending_call_unref(device->battery_pending_call);
}
}
@ -651,6 +652,14 @@ static void device_free(struct spa_bt_device *device)
struct spa_bt_monitor *monitor = device->monitor;
spa_log_debug(monitor->log, "%p", device);
if (device->battery_pending_call) {
spa_log_debug(monitor->log, "Cancelling and freeing pending battery provider register call");
dbus_pending_call_cancel(device->battery_pending_call);
dbus_pending_call_unref(device->battery_pending_call);
device->battery_pending_call = NULL;
}
battery_remove(device);
device_stop_timer(device);
device_remove(monitor, device);

View file

@ -411,6 +411,8 @@ struct spa_bt_device {
struct spa_hook_list listener_list;
bool added;
DBusPendingCall *battery_pending_call;
};
struct a2dp_codec;