[gst-debugger: 17/17] debugserver: lock mutex on modifying clients hash table
- From: Marcin Kolny <mkolny src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gst-debugger: 17/17] debugserver: lock mutex on modifying clients hash table
- Date: Sun, 4 Oct 2015 12:34:13 +0000 (UTC)
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]