structure: Make structure abbreviations array one-time initialization threadsafe
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Sun, 28 Mar 2010 17:13:22 +0000 (19:13 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Sun, 28 Mar 2010 17:49:00 +0000 (19:49 +0200)
gst/gststructure.c

index 83eb96b..2c4e0e9 100644 (file)
@@ -1505,10 +1505,11 @@ static GstStructureAbbreviation *
 gst_structure_get_abbrs (gint * n_abbrs)
 {
   static GstStructureAbbreviation *abbrs = NULL;
-  static gint num = 0;
+  static volatile gsize num = 0;
 
-  if (abbrs == NULL) {
+  if (g_once_init_enter (&num)) {
     /* dynamically generate the array */
+    gsize _num;
     GstStructureAbbreviation dyn_abbrs[] = {
       {"int", G_TYPE_INT}
       ,
@@ -1548,10 +1549,11 @@ gst_structure_get_abbrs (gint * n_abbrs)
       ,
       {"structure", GST_TYPE_STRUCTURE}
     };
-    num = G_N_ELEMENTS (dyn_abbrs);
+    _num = G_N_ELEMENTS (dyn_abbrs);
     /* permanently allocate and copy the array now */
-    abbrs = g_new0 (GstStructureAbbreviation, num);
-    memcpy (abbrs, dyn_abbrs, sizeof (GstStructureAbbreviation) * num);
+    abbrs = g_new0 (GstStructureAbbreviation, _num);
+    memcpy (abbrs, dyn_abbrs, sizeof (GstStructureAbbreviation) * _num);
+    g_once_init_leave (&num, _num);
   }
   *n_abbrs = num;