From: Rob C. <ro...@ti...> - 2010-03-07 23:03:59
|
Reading and writing an int is not sufficient synchronization without barrier instructions. Using g_once_init_enter() (which uses g_atomic_pointer_get()) provides SMP safety. --- omx/gstomx_util.h | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) diff --git a/omx/gstomx_util.h b/omx/gstomx_util.h index 593b491..6450c0d 100644 --- a/omx/gstomx_util.h +++ b/omx/gstomx_util.h @@ -169,9 +169,12 @@ static void type_class_init_trampoline (gpointer g_class, gpointer class_data)\ } \ GType type_as_function ## _get_type (void) \ { \ - static GType _type = 0; \ - if (G_UNLIKELY (_type == 0)) \ - { \ + /* The typedef for GType may be gulong or gsize, depending on the \ + * system and whether the compiler is c++ or not. The g_once_init_* \ + * functions always take a gsize * though ... */ \ + static volatile gsize gonce_data = 0; \ + if (g_once_init_enter (&gonce_data)) { \ + GType _type; \ GTypeInfo *type_info; \ type_info = g_new0 (GTypeInfo, 1); \ type_info->class_size = sizeof (type ## Class); \ @@ -182,9 +185,11 @@ GType type_as_function ## _get_type (void) \ _type = g_type_register_static (parent_type_macro, #type, type_info, 0);\ g_free (type_info); \ additional_initializations (_type); \ + g_once_init_leave (&gonce_data, (gsize) _type); \ } \ - return _type; \ + return (GType) gonce_data; \ } + #define GSTOMX_BOILERPLATE(type,type_as_function,parent_type,parent_type_macro) \ GSTOMX_BOILERPLATE_FULL (type, type_as_function, parent_type, parent_type_macro, \ __GST_DO_NOTHING) -- 1.6.3.2 |