rfbsrc: Serialize write operations
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 24 Mar 2016 20:46:49 +0000 (16:46 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 5 Apr 2016 17:34:38 +0000 (13:34 -0400)
Currently we send key events from seperate threads. IOStream does not
allow concurrent write operations, so protect this operation using a
mutex.

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

index 1a6cf49..b22db3a 100644 (file)
@@ -69,6 +69,8 @@ rfb_decoder_new (void)
   decoder->data_len = 0;
   decoder->error = NULL;
 
+  g_mutex_init (&decoder->write_lock);
+
   return decoder;
 }
 
@@ -87,6 +89,7 @@ rfb_decoder_free (RfbDecoder * decoder)
   g_clear_object (&decoder->socket_client);
   g_clear_error (&decoder->error);
   g_free (decoder->data);
+  g_mutex_clear (&decoder->write_lock);
   g_free (decoder);
 }
 
@@ -217,12 +220,16 @@ rfb_decoder_send (RfbDecoder * decoder, guint8 * buffer, guint len)
   g_return_val_if_fail (buffer != NULL, 0);
   g_return_val_if_fail (len > 0, 0);
 
+  g_mutex_lock (&decoder->write_lock);
+
   out = g_io_stream_get_output_stream (G_IO_STREAM (decoder->connection));
 
   if (!g_output_stream_write_all (out, buffer, len, NULL, decoder->cancellable,
           &err))
     goto send_error;
 
+  g_mutex_unlock (&decoder->write_lock);
+
   return TRUE;
 
 send_error:
@@ -237,6 +244,7 @@ send_error:
       }
     }
     g_clear_error (&err);
+    g_mutex_unlock (&decoder->write_lock);
     return FALSE;
   }
 }
index 2277d23..4a9e9ae 100644 (file)
@@ -94,6 +94,9 @@ struct _RfbDecoder
   /* some many used values */
   guint bytespp;
   guint line_size;
+
+  /* Seriliaze writes operations */
+  GMutex write_lock;
 };
 
 RfbDecoder *rfb_decoder_new (void);