From 459bdaae3ff26fabdafe13bd22851e89d66f2928 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Thu, 24 Mar 2016 16:46:49 -0400 Subject: [PATCH] rfbsrc: Serialize write operations 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 | 8 ++++++++ gst/librfb/rfbdecoder.h | 3 +++ 2 files changed, 11 insertions(+) diff --git a/gst/librfb/rfbdecoder.c b/gst/librfb/rfbdecoder.c index 1a6cf49..b22db3a 100644 --- a/gst/librfb/rfbdecoder.c +++ b/gst/librfb/rfbdecoder.c @@ -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; } } diff --git a/gst/librfb/rfbdecoder.h b/gst/librfb/rfbdecoder.h index 2277d23..4a9e9ae 100644 --- a/gst/librfb/rfbdecoder.h +++ b/gst/librfb/rfbdecoder.h @@ -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); -- 2.7.4