[gst-debugger: 17/17] debugserver: lock mutex on modifying clients hash table



commit ff24c0ef2fe14af851382df1851b57d4d8fe6f66
Author: Marcin Kolny <marcin kolny gmail com>
Date:   Sun Oct 4 14:32:17 2015 +0200

    debugserver: lock mutex on modifying clients hash table

 src/debugserver/gstdebugserverbuffer.c  |    2 +-
 src/debugserver/gstdebugserverhooks.c   |   36 +++++++++++++++++++++++-------
 src/debugserver/gstdebugserverhooks.h   |    2 +
 src/debugserver/gstdebugserverlog.c     |    2 +-
 src/debugserver/gstdebugservermessage.c |    2 +-
 src/debugserver/gstdebugserverqe.c      |    2 +-
 6 files changed, 33 insertions(+), 13 deletions(-)
---
diff --git a/src/debugserver/gstdebugserverbuffer.c b/src/debugserver/gstdebugserverbuffer.c
index a86eadb..a557a46 100644
--- a/src/debugserver/gstdebugserverbuffer.c
+++ b/src/debugserver/gstdebugserverbuffer.c
@@ -153,7 +153,7 @@ void gst_debugserver_buffer_send_buffer (GstDebugserverBuffer * buffer,
 
 void gst_debugserver_buffer_remove_client (GstDebugserverBuffer * buf, TcpClient * client)
 {
-  g_hash_table_remove (buf->hooks.clients, client);
+  gst_debugserver_hooks_remove_client (&buf->hooks, client);
 }
 
 void gst_debugserver_buffer_clean (GstDebugserverBuffer * buf)
diff --git a/src/debugserver/gstdebugserverhooks.c b/src/debugserver/gstdebugserverhooks.c
index b971099..86c2a25 100644
--- a/src/debugserver/gstdebugserverhooks.c
+++ b/src/debugserver/gstdebugserverhooks.c
@@ -22,7 +22,7 @@
 void gst_debugserver_hooks_init (GstDebugserverHooks * hooks, OkFunction ok_function,
   GDestroyNotify hash_destroy, GCompareFunc cmp_func)
 {
-       hooks->clients = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, hash_destroy);
+  hooks->clients = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, hash_destroy);
   g_mutex_init (&hooks->mutex);
   hooks->ok_function = ok_function;
   hooks->cmp_function = cmp_func;
@@ -58,38 +58,56 @@ void gst_debugserver_hooks_send_data (GstDebugserverHooks * hooks, GstDebugserve
 
 gboolean gst_debugserver_hooks_add_hook (GstDebugserverHooks * hooks, gpointer data, TcpClient * client)
 {
-  GSList *listeners =
-      (GSList *) g_hash_table_lookup (hooks->clients, client);
+  GSList *listeners;
+  gboolean ret = FALSE;
+
+  g_mutex_lock (&hooks->mutex);
+  listeners = (GSList *) g_hash_table_lookup (hooks->clients, client);
 
   if (listeners == NULL) {
     listeners = g_slist_append (listeners, data);
     g_hash_table_insert (hooks->clients, client, listeners);
-    return TRUE;
+    ret = TRUE;
+    goto finalize;
   }
 
   if (g_slist_find_custom (listeners, data, hooks->cmp_function) == NULL) {
     listeners = g_slist_append (listeners, data);
     g_hash_table_steal (hooks->clients, client);
     g_hash_table_insert (hooks->clients, client, listeners);
-    return TRUE;
-  } else {
-    return FALSE;
+    ret = TRUE;
+    goto finalize;
   }
+
+finalize:
+  g_mutex_unlock (&hooks->mutex);
+  return ret;
 }
 
 gboolean gst_debugserver_hooks_remove_hook (GstDebugserverHooks * hooks,
   gpointer data, TcpClient * client)
 {
-  GSList *listeners =
-      (GSList *) g_hash_table_lookup (hooks->clients, client);
+  GSList *listeners;
+
+  g_mutex_lock (&hooks->mutex);
+  listeners = (GSList *) g_hash_table_lookup (hooks->clients, client);
 
   GSList *l = g_slist_find_custom (listeners, data, hooks->cmp_function);
   if (l == NULL) {
+    g_mutex_unlock (&hooks->mutex);
     return FALSE;
   } else {
     listeners = g_slist_remove_link (listeners, l);
     g_hash_table_steal (hooks->clients, client);
     g_hash_table_insert (hooks->clients, client, listeners);
+    g_mutex_unlock (&hooks->mutex);
     return TRUE;
   }
 }
+
+void gst_debugserver_hooks_remove_client (GstDebugserverHooks * hooks, TcpClient * client)
+{
+  g_mutex_lock (&hooks->mutex);
+  g_hash_table_remove (hooks->clients, client);
+  g_mutex_unlock (&hooks->mutex);
+}
diff --git a/src/debugserver/gstdebugserverhooks.h b/src/debugserver/gstdebugserverhooks.h
index 1796d5f..0f3b0f9 100644
--- a/src/debugserver/gstdebugserverhooks.h
+++ b/src/debugserver/gstdebugserverhooks.h
@@ -47,6 +47,8 @@ gboolean gst_debugserver_hooks_add_hook (GstDebugserverHooks * hooks,
 gboolean gst_debugserver_hooks_remove_hook (GstDebugserverHooks * hooks,
   gpointer data, TcpClient * client);
 
+void gst_debugserver_hooks_remove_client (GstDebugserverHooks * hooks, TcpClient * client);
+
 G_END_DECLS
 
 #endif
diff --git a/src/debugserver/gstdebugserverlog.c b/src/debugserver/gstdebugserverlog.c
index df91040..48564b4 100644
--- a/src/debugserver/gstdebugserverlog.c
+++ b/src/debugserver/gstdebugserverlog.c
@@ -185,5 +185,5 @@ void gst_debugserver_log_set_threshold (const gchar * threshold)
 void gst_debugserver_log_remove_client (GstDebugserverLog * log,
   TcpClient * client)
 {
-  g_hash_table_remove (log->hooks.clients, client);
+  gst_debugserver_hooks_remove_client (&log->hooks, client);
 }
diff --git a/src/debugserver/gstdebugservermessage.c b/src/debugserver/gstdebugservermessage.c
index 40e0543..0503678 100644
--- a/src/debugserver/gstdebugservermessage.c
+++ b/src/debugserver/gstdebugservermessage.c
@@ -76,7 +76,7 @@ gboolean gst_debugserver_message_set_hook (GstDebugserverMessage * msg,
 void gst_debugserver_message_remove_client (GstDebugserverMessage * msg,
   TcpClient * client)
 {
-  g_hash_table_remove (msg->hooks.clients, client);
+  gst_debugserver_hooks_remove_client (&msg->hooks, client);
 }
 
 
diff --git a/src/debugserver/gstdebugserverqe.c b/src/debugserver/gstdebugserverqe.c
index 7295e94..554ab09 100644
--- a/src/debugserver/gstdebugserverqe.c
+++ b/src/debugserver/gstdebugserverqe.c
@@ -162,5 +162,5 @@ void gst_debugserver_qe_clean (GstDebugserverQE * qe)
 
 void gst_debugserver_qe_remove_client (GstDebugserverQE * qe, TcpClient * client)
 {
-  g_hash_table_remove (qe->hooks.clients, client);
+  gst_debugserver_hooks_remove_client (&qe->hooks, client);
 }


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