rfbsrc: Add a internal method to disconnect
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 24 Mar 2016 22:14:17 +0000 (18:14 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 5 Apr 2016 17:35:11 +0000 (13:35 -0400)
This also removes the disconnected boolean hack.

gst/librfb/gstrfbsrc.c
gst/librfb/rfbdecoder.c
gst/librfb/rfbdecoder.h

index 2f51142..f078025 100644 (file)
@@ -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);
index b22db3a..038f604 100644 (file)
@@ -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;
index 4a9e9ae..0f3f5af 100644 (file)
@@ -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);