From 87e06783d17b3a00a0bfb1a002009c7994f4e004 Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Sat, 10 Apr 2021 18:10:37 +0300 Subject: [PATCH] bluez5: more cleanup on impl_clear Remove dbus filters and close the dbus connection. Closing the connection lets BlueZ to clean up, so we don't call its unregistration API. --- spa/plugins/bluez5/backend-hsphfpd.c | 5 +++++ spa/plugins/bluez5/backend-native.c | 2 ++ spa/plugins/bluez5/backend-ofono.c | 5 +++++ spa/plugins/bluez5/bluez5-dbus.c | 27 +++++++++++++++++++++++++-- 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/spa/plugins/bluez5/backend-hsphfpd.c b/spa/plugins/bluez5/backend-hsphfpd.c index df9538569..a18c94e44 100644 --- a/spa/plugins/bluez5/backend-hsphfpd.c +++ b/spa/plugins/bluez5/backend-hsphfpd.c @@ -1449,6 +1449,11 @@ static int backend_hsphfpd_free(void *data) struct impl *backend = data; struct hsphfpd_endpoint *endpoint; + if (backend->filters_added) { + dbus_connection_remove_filter(backend->conn, hsphfpd_filter_cb, backend); + backend->filters_added = false; + } + if (backend->msbc_supported) dbus_connection_unregister_object_path(backend->conn, HSPHFP_AUDIO_CLIENT_MSBC); dbus_connection_unregister_object_path(backend->conn, HSPHFP_AUDIO_CLIENT_PCM_S16LE_8KHZ); diff --git a/spa/plugins/bluez5/backend-native.c b/spa/plugins/bluez5/backend-native.c index 1e6b6ecc7..f6d49a518 100644 --- a/spa/plugins/bluez5/backend-native.c +++ b/spa/plugins/bluez5/backend-native.c @@ -1629,6 +1629,8 @@ static int backend_native_free(void *data) sco_close(backend); + backend_native_unregister_profiles(backend); + #ifdef HAVE_BLUEZ_5_BACKEND_HSP_NATIVE dbus_connection_unregister_object_path(backend->conn, PROFILE_HSP_AG); dbus_connection_unregister_object_path(backend->conn, PROFILE_HSP_HS); diff --git a/spa/plugins/bluez5/backend-ofono.c b/spa/plugins/bluez5/backend-ofono.c index 0604a94d5..4ff40b735 100644 --- a/spa/plugins/bluez5/backend-ofono.c +++ b/spa/plugins/bluez5/backend-ofono.c @@ -745,6 +745,11 @@ static int backend_ofono_free(void *data) { struct impl *backend = data; + if (backend->filters_added) { + dbus_connection_remove_filter(backend->conn, ofono_filter_cb, backend); + backend->filters_added = false; + } + dbus_connection_unregister_object_path(backend->conn, OFONO_AUDIO_CLIENT); free(backend); diff --git a/spa/plugins/bluez5/bluez5-dbus.c b/spa/plugins/bluez5/bluez5-dbus.c index 0253b9d4e..277f81d66 100644 --- a/spa/plugins/bluez5/bluez5-dbus.c +++ b/spa/plugins/bluez5/bluez5-dbus.c @@ -66,7 +66,6 @@ struct spa_bt_monitor { struct spa_hook_list hooks; - uint32_t count; uint32_t id; /* @@ -2824,7 +2823,6 @@ static void unregister_media_application(struct spa_bt_monitor * monitor) { int ret; char *object_path = NULL; - dbus_connection_unregister_object_path(monitor->conn, A2DP_OBJECT_MANAGER_PATH); for (int i = 0; a2dp_codecs[i]; i++) { const struct a2dp_codec *codec = a2dp_codecs[i]; @@ -2844,6 +2842,8 @@ static void unregister_media_application(struct spa_bt_monitor * monitor) free(object_path); } } + + dbus_connection_unregister_object_path(monitor->conn, A2DP_OBJECT_MANAGER_PATH); } static int adapter_register_application(struct spa_bt_adapter *a) { @@ -3408,8 +3408,19 @@ static int impl_clear(struct spa_handle *handle) monitor = (struct spa_bt_monitor *) handle; + /* + * We don't call BlueZ API unregister methods here, since BlueZ generally does the + * unregistration when the DBus connection is closed below. We'll unregister DBus + * object managers and filter callbacks though. + */ + unregister_media_application(monitor); + if (monitor->filters_added) { + dbus_connection_remove_filter(monitor->conn, filter_cb, monitor); + monitor->filters_added = false; + } + spa_list_consume(t, &monitor->transport_list, link) spa_bt_transport_free(t); spa_list_consume(ep, &monitor->remote_endpoint_list, link) @@ -3437,6 +3448,18 @@ static int impl_clear(struct spa_handle *handle) free((void*)monitor->enabled_codecs.items); spa_zero(monitor->enabled_codecs); + spa_dbus_connection_destroy(monitor->dbus_connection); + monitor->dbus_connection = NULL; + monitor->conn = NULL; + + monitor->objects_listed = false; + + monitor->connection_info_supported = false; + monitor->enable_sbc_xq = false; + monitor->backend_native_registered = false; + monitor->backend_ofono_registered = false; + monitor->backend_hsphfpd_registered = false; + return 0; }