From ba93b860119b444ac1f6b4646b6f57a1b8221e66 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Thu, 24 Mar 2016 18:14:17 -0400 Subject: [PATCH] rfbsrc: Add a internal method to disconnect This also removes the disconnected boolean hack. --- gst/librfb/gstrfbsrc.c | 5 +---- gst/librfb/rfbdecoder.c | 39 ++++++++++++++++++++++++++------------- gst/librfb/rfbdecoder.h | 2 +- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/gst/librfb/gstrfbsrc.c b/gst/librfb/gstrfbsrc.c index 2f51142306..f0780253fd 100644 --- a/gst/librfb/gstrfbsrc.c +++ b/gst/librfb/gstrfbsrc.c @@ -516,10 +516,7 @@ gst_rfb_src_stop (GstBaseSrc * bsrc) { GstRfbSrc *src = GST_RFB_SRC (bsrc); - if (src->decoder->connection) { - g_object_unref (src->decoder->connection); - src->decoder->connection = NULL; - } + rfb_decoder_disconnect (src->decoder); if (src->decoder->frame) { g_free (src->decoder->frame); diff --git a/gst/librfb/rfbdecoder.c b/gst/librfb/rfbdecoder.c index b22db3aa88..038f6046ad 100644 --- a/gst/librfb/rfbdecoder.c +++ b/gst/librfb/rfbdecoder.c @@ -64,7 +64,6 @@ rfb_decoder_new (void) decoder->rect_width = 0; decoder->rect_height = 0; decoder->shared_flag = TRUE; - decoder->disconnected = FALSE; decoder->data = NULL; decoder->data_len = 0; decoder->error = NULL; @@ -79,16 +78,10 @@ rfb_decoder_free (RfbDecoder * decoder) { g_return_if_fail (decoder != NULL); - if (decoder->cancellable) { - g_cancellable_cancel (decoder->cancellable); - g_object_unref (decoder->cancellable); - decoder->cancellable = NULL; - } + rfb_decoder_disconnect (decoder); - g_clear_object (&decoder->connection); g_clear_object (&decoder->socket_client); - g_clear_error (&decoder->error); - g_free (decoder->data); + g_clear_object (&decoder->cancellable); g_mutex_clear (&decoder->write_lock); g_free (decoder); } @@ -105,6 +98,8 @@ rfb_decoder_connect_tcp (RfbDecoder * decoder, gchar * host, guint port) g_return_val_if_fail (decoder->connection == NULL, FALSE); g_return_val_if_fail (host != NULL, FALSE); + g_cancellable_reset (decoder->cancellable); + connection = g_socket_client_connect_to_host (decoder->socket_client, host, port, decoder->cancellable, &err); @@ -113,7 +108,6 @@ rfb_decoder_connect_tcp (RfbDecoder * decoder, gchar * host, guint port) goto connect_failed; decoder->connection = connection; - decoder->disconnected = FALSE; return TRUE; @@ -134,6 +128,27 @@ connect_failed: } } +void +rfb_decoder_disconnect (RfbDecoder * decoder) +{ + GST_DEBUG ("Disconnecting from the rfb server"); + + g_return_if_fail (decoder); + g_return_if_fail (decoder->cancellable); + + g_cancellable_cancel (decoder->cancellable); + + /* Make sure threaded write a done first, this avoids race condition, + * specially when the decoder is freed */ + g_mutex_lock (&decoder->write_lock); + + g_clear_object (&decoder->connection); + g_clear_error (&decoder->error); + g_clear_pointer (&decoder->data, g_free); + + g_mutex_unlock (&decoder->write_lock); +} + /** * rfb_decoder_iterate: * @decoder: The rfb context @@ -205,7 +220,6 @@ recv_error: } } g_clear_error (&err); - decoder->disconnected = TRUE; return NULL; } } @@ -761,7 +775,6 @@ rfb_decoder_state_framebuffer_update_rectangle (RfbDecoder * decoder) if (((w * h) + (x * y)) > (decoder->width * decoder->height)) { GST_ERROR ("Desktop resize is unsupported."); decoder->state = NULL; - decoder->disconnected = TRUE; return TRUE; } @@ -786,7 +799,7 @@ rfb_decoder_state_framebuffer_update_rectangle (RfbDecoder * decoder) break; } decoder->n_rects--; - if (decoder->n_rects == 0 || decoder->disconnected) { + if (decoder->n_rects == 0) { decoder->state = NULL; } else { decoder->state = rfb_decoder_state_framebuffer_update_rectangle; diff --git a/gst/librfb/rfbdecoder.h b/gst/librfb/rfbdecoder.h index 4a9e9aebae..0f3f5af146 100644 --- a/gst/librfb/rfbdecoder.h +++ b/gst/librfb/rfbdecoder.h @@ -56,7 +56,6 @@ struct _RfbDecoder /* settable properties */ gboolean shared_flag; - gboolean disconnected; /* readable properties */ gboolean inited; @@ -103,6 +102,7 @@ RfbDecoder *rfb_decoder_new (void); void rfb_decoder_free (RfbDecoder * decoder); gboolean rfb_decoder_connect_tcp (RfbDecoder * decoder, gchar * host, guint port); +void rfb_decoder_disconnect (RfbDecoder * decoder); gboolean rfb_decoder_iterate (RfbDecoder * decoder); void rfb_decoder_send_update_request (RfbDecoder * decoder, gboolean incremental, gint x, gint y, gint width, gint height);