From ed19974e25a6bf318a3ef2c3c86afe2369f56def Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 3 Oct 2012 13:45:22 +0200 Subject: [PATCH] meta: do metadata registration threadsafe We need to use g_once to register the metadata implementations only once. See https://bugzilla.gnome.org/show_bug.cgi?id=685332 --- docs/pwg/advanced-allocation.xml | 5 +++-- libs/gst/net/gstnetaddressmeta.c | 5 +++-- tests/check/gst/gstmeta.c | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/pwg/advanced-allocation.xml b/docs/pwg/advanced-allocation.xml index a8c34be9d0..625e76ee85 100644 --- a/docs/pwg/advanced-allocation.xml +++ b/docs/pwg/advanced-allocation.xml @@ -453,13 +453,14 @@ my_example_meta_get_info (void) { static const GstMetaInfo *meta_info = NULL; - if (meta_info == NULL) { - meta_info = gst_meta_register (MY_EXAMPLE_META_API_TYPE, + if (g_once_init_enter (&meta_info)) { + const GstMetaInfo *mi = gst_meta_register (MY_EXAMPLE_META_API_TYPE, "MyExampleMeta", sizeof (MyExampleMeta), my_example_meta_init, my_example_meta_free, my_example_meta_transform); + g_once_init_leave (&meta_info, mi); } return meta_info; } diff --git a/libs/gst/net/gstnetaddressmeta.c b/libs/gst/net/gstnetaddressmeta.c index af869aea40..5b87afe085 100644 --- a/libs/gst/net/gstnetaddressmeta.c +++ b/libs/gst/net/gstnetaddressmeta.c @@ -82,12 +82,13 @@ gst_net_address_meta_get_info (void) { static const GstMetaInfo *meta_info = NULL; - if (meta_info == NULL) { - meta_info = gst_meta_register (GST_NET_ADDRESS_META_API_TYPE, + if (g_once_init_enter (&meta_info)) { + const GstMetaInfo *mi = gst_meta_register (GST_NET_ADDRESS_META_API_TYPE, "GstNetAddressMeta", sizeof (GstNetAddressMeta), net_address_meta_init, net_address_meta_free, net_address_meta_transform); + g_once_init_leave (&meta_info, mi); } return meta_info; } diff --git a/tests/check/gst/gstmeta.c b/tests/check/gst/gstmeta.c index 73b5d56c52..0f2355b8da 100644 --- a/tests/check/gst/gstmeta.c +++ b/tests/check/gst/gstmeta.c @@ -139,11 +139,12 @@ gst_meta_test_get_info (void) { static const GstMetaInfo *meta_test_info = NULL; - if (meta_test_info == NULL) { - meta_test_info = gst_meta_register (GST_META_TEST_API_TYPE, + if (g_once_init_enter (&meta_test_info)) { + const GstMetaInfo *mi = gst_meta_register (GST_META_TEST_API_TYPE, "GstMetaTest", sizeof (GstMetaTest), test_init_func, test_free_func, test_transform_func); + g_once_init_leave (&meta_test_info, mi); } return meta_test_info; }