jack: make get_type functions thread-safe
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Sun, 2 Jan 2011 17:07:19 +0000 (17:07 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Sun, 2 Jan 2011 17:27:35 +0000 (17:27 +0000)
Because we can (shouldn't be needed with other workarounds still there).

ext/jack/gstjack.c
ext/jack/gstjackaudiosink.c
ext/jack/gstjackaudiosrc.c

index 371a9e9..74b8ddf 100644 (file)
 GType
 gst_jack_connect_get_type (void)
 {
-  static GType jack_connect_type = 0;
-  static const GEnumValue jack_connect[] = {
-    {GST_JACK_CONNECT_NONE,
-        "Don't automatically connect ports to physical ports", "none"},
-    {GST_JACK_CONNECT_AUTO,
-        "Automatically connect ports to physical ports", "auto"},
-    {GST_JACK_CONNECT_AUTO_FORCED,
-          "Automatically connect ports to as many physical ports as possible",
-        "auto-forced"},
-    {0, NULL, NULL},
-  };
+  static volatile gsize jack_connect_type = 0;
 
-  if (!jack_connect_type) {
-    jack_connect_type = g_enum_register_static ("GstJackConnect", jack_connect);
+  if (g_once_init_enter (&jack_connect_type)) {
+    static const GEnumValue jack_connect_enums[] = {
+      {GST_JACK_CONNECT_NONE,
+          "Don't automatically connect ports to physical ports", "none"},
+      {GST_JACK_CONNECT_AUTO,
+          "Automatically connect ports to physical ports", "auto"},
+      {GST_JACK_CONNECT_AUTO_FORCED,
+            "Automatically connect ports to as many physical ports as possible",
+          "auto-forced"},
+      {0, NULL, NULL},
+    };
+    GType tmp = g_enum_register_static ("GstJackConnect", jack_connect_enums);
+    g_once_init_leave (&jack_connect_type, tmp);
   }
-  return jack_connect_type;
+  return (GType) jack_connect_type;
 }
 
 
@@ -63,16 +64,17 @@ gst_jack_client_free (gpointer jclient)
 GType
 gst_jack_client_get_type (void)
 {
-  static GType type;            /* 0 */
+  static volatile gsize jack_client_type = 0;
 
-  if (type == 0) {
+  if (g_once_init_enter (&jack_client_type)) {
     /* hackish, but makes it show up nicely in gst-inspect */
-    type = g_boxed_type_register_static ("JackClient",
+    GType tmp = g_boxed_type_register_static ("JackClient",
         (GBoxedCopyFunc) gst_jack_client_copy,
         (GBoxedFreeFunc) gst_jack_client_free);
+    g_once_init_leave (&jack_client_type, tmp);
   }
 
-  return type;
+  return (GType) jack_client_type;
 }
 
 static gboolean
index 32bf1af..ea75b9c 100644 (file)
@@ -129,9 +129,9 @@ gst_jack_audio_sink_free_channels (GstJackAudioSink * sink)
 static GType
 gst_jack_ring_buffer_get_type (void)
 {
-  static GType ringbuffer_type = 0;
+  static volatile gsize ringbuffer_type = 0;
 
-  if (!ringbuffer_type) {
+  if (g_once_init_enter (&ringbuffer_type)) {
     static const GTypeInfo ringbuffer_info = {
       sizeof (GstJackRingBufferClass),
       NULL,
@@ -144,12 +144,12 @@ gst_jack_ring_buffer_get_type (void)
       (GInstanceInitFunc) gst_jack_ring_buffer_init,
       NULL
     };
-
-    ringbuffer_type =
-        g_type_register_static (GST_TYPE_RING_BUFFER,
+    GType tmp = g_type_register_static (GST_TYPE_RING_BUFFER,
         "GstJackAudioSinkRingBuffer", &ringbuffer_info, 0);
+    g_once_init_leave (&ringbuffer_type, tmp);
   }
-  return ringbuffer_type;
+
+  return (GType) ringbuffer_type;
 }
 
 static void
index 0ffdb23..57ec66a 100644 (file)
@@ -151,9 +151,9 @@ gst_jack_audio_src_free_channels (GstJackAudioSrc * src)
 static GType
 gst_jack_ring_buffer_get_type (void)
 {
-  static GType ringbuffer_type = 0;
+  static volatile gsize ringbuffer_type = 0;
 
-  if (!ringbuffer_type) {
+  if (g_once_init_enter (&ringbuffer_type)) {
     static const GTypeInfo ringbuffer_info = { sizeof (GstJackRingBufferClass),
       NULL,
       NULL,
@@ -165,12 +165,12 @@ gst_jack_ring_buffer_get_type (void)
       (GInstanceInitFunc) gst_jack_ring_buffer_init,
       NULL
     };
-
-    ringbuffer_type =
-        g_type_register_static (GST_TYPE_RING_BUFFER,
+    GType tmp = g_type_register_static (GST_TYPE_RING_BUFFER,
         "GstJackAudioSrcRingBuffer", &ringbuffer_info, 0);
+    g_once_init_leave (&ringbuffer_type, tmp);
   }
-  return ringbuffer_type;
+
+  return (GType) ringbuffer_type;
 }
 
 static void