trace: use proper locking in GstTrace
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 23 Jun 2009 11:44:50 +0000 (13:44 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 23 Jun 2009 11:46:28 +0000 (13:46 +0200)
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
gst/gsttrace.h
win32/common/libgstreamer.def

index 8198860..b276220 100644 (file)
@@ -65,6 +65,8 @@
 
 #include "gsttrace.h"
 
+GStaticMutex _gst_trace_mutex = G_STATIC_MUTEX_INIT;
+
 static
 #ifdef __inline__
   __inline__
index 45b5b07..8ef3376 100644 (file)
@@ -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
index ecfd130..070c64f 100644 (file)
@@ -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