[mutter] sound-player: Don't deadlock in finish_cb



commit 8856a396fdf4f82d74f65d4037c1946d0d2eb5e1
Author: Andrea Azzarone <andrea azzarone canonical com>
Date:   Mon Mar 4 19:37:09 2019 +0000

    sound-player: Don't deadlock in finish_cb
    
    The function finish_cb can be called as a result of a call to ca_context_cancel
    in cancelled_cb. This will result in a deadlock because, as per documentation,
    g_cancellable_disconnect cannot be called inside the cancellable handler.
    
    It is possible to detect if the call to finish_cb is caused by ca_context_cancel
    checking if error_code == CA_ERROR_CANCELED. To avoid the deadlock we should
    call g_signal_handler_disconnect instead g_cancellable_disconnect if this is the
    case.
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/474

 src/core/meta-sound-player.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
---
diff --git a/src/core/meta-sound-player.c b/src/core/meta-sound-player.c
index ab934781a..8ef403936 100644
--- a/src/core/meta-sound-player.c
+++ b/src/core/meta-sound-player.c
@@ -117,7 +117,11 @@ finish_cb (ca_context *context,
 {
   MetaPlayRequest *req = user_data;
 
-  g_cancellable_disconnect (req->cancellable, req->cancel_id);
+  if (error_code != CA_ERROR_CANCELED)
+    g_cancellable_disconnect (req->cancellable, req->cancel_id);
+  else if (req->cancellable != NULL && req->cancel_id != 0)
+    g_signal_handler_disconnect (req->cancellable, req->cancel_id);
+
   meta_play_request_free (req);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]