ScreenCastPortal: Improve D-Bus signal unsubscription
Add a helper function for signal unsubscription to avoid duplicating the
code for every signal. Also make sure we unsubscribe from SessionClosed
signal by calling it when destructing ScreenCastPortal object and not
only when it gets called.
Bug: webrtc:420959042
Change-Id: I6e81e08b526ab07b8ae65a5a206675d6e5052b2e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/393900
Commit-Queue: Jan Grulich <grulja@gmail.com>
Reviewed-by: Alexander Cooper <alcooper@chromium.org>
Cr-Commit-Position: refs/heads/main@{#44799}
diff --git a/modules/desktop_capture/linux/wayland/screencast_portal.cc b/modules/desktop_capture/linux/wayland/screencast_portal.cc
index 61ed84e..958b4d0 100644
--- a/modules/desktop_capture/linux/wayland/screencast_portal.cc
+++ b/modules/desktop_capture/linux/wayland/screencast_portal.cc
@@ -88,23 +88,19 @@
}
}
+// static
+void UnsubscribeSignalHandler(GDBusConnection* connection, guint* signal_id) {
+ if (signal_id && *signal_id) {
+ g_dbus_connection_signal_unsubscribe(connection, *signal_id);
+ *signal_id = 0;
+ }
+}
+
void ScreenCastPortal::UnsubscribeSignalHandlers() {
- if (start_request_signal_id_) {
- g_dbus_connection_signal_unsubscribe(connection_, start_request_signal_id_);
- start_request_signal_id_ = 0;
- }
-
- if (sources_request_signal_id_) {
- g_dbus_connection_signal_unsubscribe(connection_,
- sources_request_signal_id_);
- sources_request_signal_id_ = 0;
- }
-
- if (session_request_signal_id_) {
- g_dbus_connection_signal_unsubscribe(connection_,
- session_request_signal_id_);
- session_request_signal_id_ = 0;
- }
+ UnsubscribeSignalHandler(connection_, &session_request_signal_id_);
+ UnsubscribeSignalHandler(connection_, &sources_request_signal_id_);
+ UnsubscribeSignalHandler(connection_, &start_request_signal_id_);
+ UnsubscribeSignalHandler(connection_, &session_closed_signal_id_);
}
void ScreenCastPortal::SetSessionDetails(
@@ -200,12 +196,11 @@
RTC_LOG(LS_INFO) << "Received closed signal from session.";
- that->notifier_->OnScreenCastSessionClosed();
+ // Clear the session handle to avoid calling Session::Close from the destructor
+ // since it's already closed
+ that->session_handle_ = "";
- // Unsubscribe from the signal and free the session handle to avoid calling
- // Session::Close from the destructor since it's already closed
- g_dbus_connection_signal_unsubscribe(that->connection_,
- that->session_closed_signal_id_);
+ that->notifier_->OnScreenCastSessionClosed();
}
void ScreenCastPortal::SourcesRequest() {
@@ -293,11 +288,8 @@
g_variant_get_child(variant.get(), 0, "o", handle.receive());
if (!handle) {
RTC_LOG(LS_ERROR) << "Failed to initialize the screen cast session.";
- if (that->sources_request_signal_id_) {
- g_dbus_connection_signal_unsubscribe(that->connection_,
- that->sources_request_signal_id_);
- that->sources_request_signal_id_ = 0;
- }
+ UnsubscribeSignalHandler(that->connection_,
+ &that->sources_request_signal_id_);
that->OnPortalDone(RequestResponse::kError);
return;
}