audio: make public get_type() functions thread-safe
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 8 Oct 2010 08:48:50 +0000 (09:48 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 8 Oct 2010 10:34:58 +0000 (11:34 +0100)
gst-libs/gst/audio/gstaudioclock.c
gst-libs/gst/audio/gstbaseaudiosink.c
gst-libs/gst/audio/gstbaseaudiosrc.c

index 95a8a0d..9d6e485 100644 (file)
@@ -56,28 +56,28 @@ static GstSystemClockClass *parent_class = NULL;
 GType
 gst_audio_clock_get_type (void)
 {
-  static GType clock_type = 0;
-
-  if (!clock_type) {
-    static const GTypeInfo clock_info = {
-      sizeof (GstAudioClockClass),
-      NULL,
-      NULL,
-      (GClassInitFunc) gst_audio_clock_class_init,
-      NULL,
-      NULL,
-      sizeof (GstAudioClock),
-      4,
-      (GInstanceInitFunc) gst_audio_clock_init,
-      NULL
-    };
-
-    clock_type = g_type_register_static (GST_TYPE_SYSTEM_CLOCK, "GstAudioClock",
+  static volatile gsize clock_type = 0;
+  static const GTypeInfo clock_info = {
+    sizeof (GstAudioClockClass),
+    NULL,
+    NULL,
+    (GClassInitFunc) gst_audio_clock_class_init,
+    NULL,
+    NULL,
+    sizeof (GstAudioClock),
+    4,
+    (GInstanceInitFunc) gst_audio_clock_init,
+    NULL
+  };
+
+  if (g_once_init_enter (&clock_type)) {
+    GType tmp = g_type_register_static (GST_TYPE_SYSTEM_CLOCK, "GstAudioClock",
         &clock_info, 0);
+    g_once_init_leave (&clock_type, tmp);
   }
-  return clock_type;
-}
 
+  return (GType) clock_type;
+}
 
 static void
 gst_audio_clock_class_init (GstAudioClockClass * klass)
index 21117f2..8e7760b 100644 (file)
@@ -110,7 +110,7 @@ enum
 GType
 gst_base_audio_sink_slave_method_get_type (void)
 {
-  static GType slave_method_type = 0;
+  static volatile gsize slave_method_type = 0;
   static const GEnumValue slave_method[] = {
     {GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE, "GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE",
         "resample"},
@@ -119,11 +119,13 @@ gst_base_audio_sink_slave_method_get_type (void)
     {0, NULL, NULL},
   };
 
-  if (!slave_method_type) {
-    slave_method_type =
+  if (g_once_init_enter (&slave_method_type)) {
+    GType tmp =
         g_enum_register_static ("GstBaseAudioSinkSlaveMethod", slave_method);
+    g_once_init_leave (&slave_method_type, tmp);
   }
-  return slave_method_type;
+
+  return (GType) slave_method_type;
 }
 
 
index 1eb0a89..8953370 100644 (file)
@@ -48,7 +48,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_base_audio_src_debug);
 GType
 gst_base_audio_src_slave_method_get_type (void)
 {
-  static GType slave_method_type = 0;
+  static volatile gsize slave_method_type = 0;
   /* FIXME 0.11: nick should be "retimestamp" not "re-timestamp" */
   static const GEnumValue slave_method[] = {
     {GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE,
@@ -60,11 +60,12 @@ gst_base_audio_src_slave_method_get_type (void)
     {0, NULL, NULL},
   };
 
-  if (!slave_method_type) {
-    slave_method_type =
+  if (g_once_init_enter (&slave_method_type)) {
+    GType tmp =
         g_enum_register_static ("GstBaseAudioSrcSlaveMethod", slave_method);
+    g_once_init_leave (&slave_method_type, tmp);
   }
-  return slave_method_type;
+  return (GType) slave_method_type;
 }
 
 #define GST_BASE_AUDIO_SRC_GET_PRIVATE(obj)  \