From 3afa91d7aaf4f26b928185a71df4190cab285f28 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 23 Jun 2009 13:44:50 +0200 Subject: [PATCH] trace: use proper locking in GstTrace Protect the allocated list of objects with a lock so that trace actually works reliably. Shortcut the alloc trace sooner when disabled. --- gst/gsttrace.c | 2 ++ gst/gsttrace.h | 32 ++++++++++++++++++++------------ win32/common/libgstreamer.def | 1 + 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/gst/gsttrace.c b/gst/gsttrace.c index 8198860..b276220 100644 --- a/gst/gsttrace.c +++ b/gst/gsttrace.c @@ -65,6 +65,8 @@ #include "gsttrace.h" +GStaticMutex _gst_trace_mutex = G_STATIC_MUTEX_INIT; + static #ifdef __inline__ __inline__ diff --git a/gst/gsttrace.h b/gst/gsttrace.h index 45b5b07..8ef3376 100644 --- a/gst/gsttrace.h +++ b/gst/gsttrace.h @@ -88,8 +88,6 @@ struct _GstTraceEntry { gchar message[112]; }; - - GstTrace* gst_trace_new (gchar *filename, gint size); void gst_trace_destroy (GstTrace *trace); @@ -124,6 +122,8 @@ void _gst_trace_add_entry (GstTrace *trace, guint32 seq, void gst_trace_read_tsc (gint64 *dst); +extern GStaticMutex _gst_trace_mutex; + gboolean gst_alloc_trace_available (void); G_CONST_RETURN GList* gst_alloc_trace_list (void); GstAllocTrace* _gst_alloc_trace_register (const gchar *name); @@ -156,11 +156,15 @@ void gst_alloc_trace_set_flags (GstAllocTrace *trace, GstAllocTraceFlags flags */ #define gst_alloc_trace_new(trace, mem) \ G_STMT_START { \ - if ((trace)->flags & GST_ALLOC_TRACE_LIVE) \ - (trace)->live++; \ - if ((trace)->flags & GST_ALLOC_TRACE_MEM_LIVE) \ - (trace)->mem_live = \ - g_slist_prepend ((trace)->mem_live, mem); \ + if (G_UNLIKELY ((trace)->flags)) { \ + g_static_mutex_lock (&_gst_trace_mutex); \ + if ((trace)->flags & GST_ALLOC_TRACE_LIVE) \ + (trace)->live++; \ + if ((trace)->flags & GST_ALLOC_TRACE_MEM_LIVE) \ + (trace)->mem_live = \ + g_slist_prepend ((trace)->mem_live, mem); \ + g_static_mutex_unlock (&_gst_trace_mutex); \ + } \ } G_STMT_END /** @@ -172,11 +176,15 @@ G_STMT_START { \ */ #define gst_alloc_trace_free(trace, mem) \ G_STMT_START { \ - if ((trace)->flags & GST_ALLOC_TRACE_LIVE) \ - (trace)->live--; \ - if ((trace)->flags & GST_ALLOC_TRACE_MEM_LIVE) \ - (trace)->mem_live = \ - g_slist_remove ((trace)->mem_live, mem); \ + if (G_UNLIKELY ((trace)->flags)) { \ + g_static_mutex_lock (&_gst_trace_mutex); \ + if ((trace)->flags & GST_ALLOC_TRACE_LIVE) \ + (trace)->live--; \ + if ((trace)->flags & GST_ALLOC_TRACE_MEM_LIVE) \ + (trace)->mem_live = \ + g_slist_remove ((trace)->mem_live, mem); \ + g_static_mutex_unlock (&_gst_trace_mutex); \ + } \ } G_STMT_END #else diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index ecfd130..070c64f 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -44,6 +44,7 @@ EXPORTS _gst_elementclass_factory DATA _gst_plugin_register_static _gst_trace_add_entry + _gst_trace_mutex DATA _gst_trace_on DATA gst_activate_mode_get_type gst_alloc_trace_available -- 2.7.4