summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-05-29 15:48:48 +0200
committerHans de Goede <hdegoede@redhat.com>2013-05-29 15:52:19 +0200
commitee2546c6da6ac4ff4042daf8ddc9da074b970fcc (patch)
tree6bb260c2091968fc8e02e9cd0240ffed52c32123
parent4e42727c18abe6e406e1c90fb6da312f04d8285f (diff)
Make sure our foo_get_type functions are thread-safe
While debugging: https://bugzilla.redhat.com/show_bug.cgi?id=866718 I found a thread-safeness issue with a couple of foo_get_type functions in polkit causing this crash. After this I decided to check if spice-gtk has the same issue, and it does, since foo_get_type can be called from different threads, it is important to make them thread-safe. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r--gtk/Makefile.am18
-rw-r--r--gtk/spice-grabsequence.c5
2 files changed, 16 insertions, 7 deletions
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index 17544fb..d31a396 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -455,9 +455,12 @@ spice-glib-enums.c: spice-channel.h channel-inputs.h spice-session.h
--vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
--vtail " { 0, NULL, NULL }\n};\n\n" \
--vtail "GType\n@enum_name@_get_type (void)\n{\n" \
- --vtail " static GType type = 0;\n\n" \
- --vtail " if (!type)\n" \
- --vtail " type = g_@type@_register_static (\"@EnumName@\", _@enum_name@_values);\n\n" \
+ --vtail " static GType type = 0;\n" \
+ --vtail " static volatile gsize type_volatile = 0;\n\n" \
+ --vtail " if (g_once_init_enter(&type_volatile)) {\n" \
+ --vtail " type = g_@type@_register_static (\"@EnumName@\", _@enum_name@_values);\n" \
+ --vtail " g_once_init_leave(&type_volatile, type);\n" \
+ --vtail " }\n\n" \
--vtail " return type;\n}\n\n" \
$^ > $@
@@ -479,9 +482,12 @@ spice-widget-enums.c: spice-widget.h
--vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
--vtail " { 0, NULL, NULL }\n};\n\n" \
--vtail "GType\n@enum_name@_get_type (void)\n{\n" \
- --vtail " static GType type = 0;\n\n" \
- --vtail " if (!type)\n" \
- --vtail " type = g_@type@_register_static (\"@EnumName@\", _@enum_name@_values);\n\n" \
+ --vtail " static GType type = 0;\n" \
+ --vtail " static volatile gsize type_volatile = 0;\n\n" \
+ --vtail " if (g_once_init_enter(&type_volatile)) {\n" \
+ --vtail " type = g_@type@_register_static (\"@EnumName@\", _@enum_name@_values);\n" \
+ --vtail " g_once_init_leave(&type_volatile, type);\n" \
+ --vtail " }\n\n" \
--vtail " return type;\n}\n\n" \
$< > $@
diff --git a/gtk/spice-grabsequence.c b/gtk/spice-grabsequence.c
index dab438c..5d6fa9f 100644
--- a/gtk/spice-grabsequence.c
+++ b/gtk/spice-grabsequence.c
@@ -28,12 +28,15 @@
GType spice_grab_sequence_get_type(void)
{
static GType grab_sequence_type = 0;
+ static volatile gsize grab_sequence_type_volatile;
- if (G_UNLIKELY(grab_sequence_type == 0)) {
+ if (g_once_init_enter(&grab_sequence_type_volatile)) {
grab_sequence_type = g_boxed_type_register_static
("SpiceGrabSequence",
(GBoxedCopyFunc)spice_grab_sequence_copy,
(GBoxedFreeFunc)spice_grab_sequence_free);
+ g_once_init_leave(&grab_sequence_type_volatile,
+ grab_sequence_type);
}
return grab_sequence_type;