inputselector: make pad's get_type function thread-safe
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 31 Dec 2010 12:08:19 +0000 (12:08 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 31 Dec 2010 12:08:19 +0000 (12:08 +0000)
plugins/elements/gstinputselector.c

index 4dc7dc6..e64aa1c 100644 (file)
@@ -157,26 +157,26 @@ static GstFlowReturn gst_selector_pad_bufferalloc (GstPad * pad,
 static GType
 gst_selector_pad_get_type (void)
 {
-  static GType selector_pad_type = 0;
-
-  if (!selector_pad_type) {
-    static const GTypeInfo selector_pad_info = {
-      sizeof (GstSelectorPadClass),
-      NULL,
-      NULL,
-      (GClassInitFunc) gst_selector_pad_class_init,
-      NULL,
-      NULL,
-      sizeof (GstSelectorPad),
-      0,
-      (GInstanceInitFunc) gst_selector_pad_init,
-    };
-
-    selector_pad_type =
-        g_type_register_static (GST_TYPE_PAD, "GstSelectorPad",
+  static volatile gsize selector_pad_type = 0;
+  static const GTypeInfo selector_pad_info = {
+    sizeof (GstSelectorPadClass),
+    NULL,
+    NULL,
+    (GClassInitFunc) gst_selector_pad_class_init,
+    NULL,
+    NULL,
+    sizeof (GstSelectorPad),
+    0,
+    (GInstanceInitFunc) gst_selector_pad_init,
+  };
+
+  if (g_once_init_enter (&selector_pad_type)) {
+    GType tmp = g_type_register_static (GST_TYPE_PAD, "GstSelectorPad",
         &selector_pad_info, 0);
+    g_once_init_leave (&selector_pad_type, tmp);
   }
-  return selector_pad_type;
+
+  return (GType) selector_pad_type;
 }
 
 static void