[evolution] Bug #681837 - Make enum type registration thread safe



commit 1c5f6313c58187ce7682058057b63e14ae6f70e5
Author: Milan Crha <mcrha redhat com>
Date:   Fri Apr 12 09:50:06 2013 +0200

    Bug #681837 - Make enum type registration thread safe

 Makefile.am                                        |    2 +
 e-util/Makefile.am                                 |   15 +++++---
 ...il-enumtypes.c.template => enumtypes.c.template |   13 +++----
 ...il-enumtypes.h.template => enumtypes.h.template |   11 ++----
 libemail-engine/Makefile.am                        |   18 +++++-----
 libemail-engine/e-mail-enumtypes.c.template        |   38 --------------------
 libemail-engine/e-mail-enumtypes.h.template        |   27 --------------
 shell/Makefile.am                                  |   15 +++++---
 shell/e-shell-enumtypes.c.template                 |   38 --------------------
 shell/e-shell-enumtypes.h.template                 |   27 --------------
 10 files changed, 39 insertions(+), 165 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 888734a..856e459 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -25,6 +25,8 @@ EXTRA_DIST =                  \
        MAINTAINERS             \
        NEWS                    \
        NEWS-1.0                \
+       enumtypes.c.template    \
+       enumtypes.h.template    \
        marshal.mk              \
        iconv-detect.c          \
        plugin.mk               \
diff --git a/e-util/Makefile.am b/e-util/Makefile.am
index 5e974f2..367add5 100644
--- a/e-util/Makefile.am
+++ b/e-util/Makefile.am
@@ -6,11 +6,16 @@ ruledir = $(privdatadir)
 
 ENUM_TYPES = e-util-enums.h
 
-e-util-enumtypes.h: e-util-enumtypes.h.template $(ENUM_TYPES)
-       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template e-util-enumtypes.h.template $(ENUM_TYPES)) > 
$@
+e-util-enumtypes.h: $(top_srcdir)/enumtypes.h.template $(ENUM_TYPES)
+       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template $(top_srcdir)/enumtypes.h.template \
+               --fhead "#ifndef E_UTIL_ENUMTYPES_H\n#define E_UTIL_ENUMTYPES_H\n" \
+               --ftail "#endif /* E_UTIL_ENUMTYPES_H */\n" \
+               $(ENUM_TYPES)) > $@
 
-e-util-enumtypes.c: e-util-enumtypes.c.template $(ENUM_TYPES)
-       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template e-util-enumtypes.c.template $(ENUM_TYPES)) > 
$@
+e-util-enumtypes.c: $(top_srcdir)/enumtypes.c.template $(ENUM_TYPES)
+       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template $(top_srcdir)/enumtypes.c.template \
+               --fhead "#include \"e-util-enumtypes.h\"" \
+               $(ENUM_TYPES)) > $@
 
 e-marshal.h: e-marshal.list
        $(AM_V_GEN) $(GLIB_GENMARSHAL) --header --prefix=e_marshal $^ > e-marshal.h.tmp && \
@@ -648,8 +653,6 @@ test_source_selector_SOURCES = test-source-selector.c
 test_source_selector_LDADD = $(TEST_LDADD)
 
 EXTRA_DIST = \
-       e-util-enumtypes.h.template \
-       e-util-enumtypes.c.template \
        e-system.error.xml \
        filter.error.xml \
        widgets.error.xml \
diff --git a/e-util/e-util-enumtypes.c.template b/enumtypes.c.template
similarity index 72%
rename from e-util/e-util-enumtypes.c.template
rename to enumtypes.c.template
index cb26347..0a99121 100644
--- a/e-util/e-util-enumtypes.c.template
+++ b/enumtypes.c.template
@@ -1,6 +1,4 @@
 /*** BEGIN file-header ***/
-#include "e-util-enumtypes.h"
-
 /*** END file-header ***/
 
 /*** BEGIN file-production ***/
@@ -13,9 +11,9 @@
 GType
 @enum_name _get_type (void)
 {
-       static GType the_type = 0;
-       
-       if (the_type == 0) {
+       static volatile gsize the_type__volatile = 0;
+
+       if (g_once_init_enter (&the_type__volatile)) {
                static const G Type@Value values[] = {
 /*** END value-header ***/
 
@@ -28,11 +26,12 @@ GType
 /*** BEGIN value-tail ***/
                        { 0, NULL, NULL }
                };
-               the_type = g_ type@_register_static (
+               GType the_type = g_ type@_register_static (
                        g_intern_static_string ("@EnumName@"),
                        values);
+               g_once_init_leave (&the_type__volatile, the_type);
        }
-       return the_type;
+       return the_type__volatile;
 }
 
 /*** END value-tail ***/
diff --git a/e-util/e-util-enumtypes.h.template b/enumtypes.h.template
similarity index 73%
rename from e-util/e-util-enumtypes.h.template
rename to enumtypes.h.template
index c5bfa9c..e421edd 100644
--- a/e-util/e-util-enumtypes.h.template
+++ b/enumtypes.h.template
@@ -1,20 +1,18 @@
 /*** BEGIN file-header ***/
-#ifndef E_UTIL_ENUMTYPES_H
-#define E_UTIL_ENUMTYPES_H
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
 
 #include <glib-object.h>
 
 G_BEGIN_DECLS
 
-/*** END file-header ***/
-
-/*** BEGIN file-production ***/
 /* Enumerations from "@filename@" */
 
 /*** END file-production ***/
 
 /*** BEGIN enumeration-production ***/
-#define E_TYPE_ ENUMSHORT@     (@enum_name _get_type())
+#define @ENUMPREFIX _TYPE_@ENUMSHORT@  (@enum_name _get_type())
 GType @enum_name _get_type     (void) G_GNUC_CONST;
 
 /*** END enumeration-production ***/
@@ -22,6 +20,5 @@ GType @enum_name _get_type    (void) G_GNUC_CONST;
 /*** BEGIN file-tail ***/
 G_END_DECLS
 
-#endif /* E_UTIL_ENUMTYPES_H */
 /*** END file-tail ***/
 
diff --git a/libemail-engine/Makefile.am b/libemail-engine/Makefile.am
index 60a8437..d8f8207 100644
--- a/libemail-engine/Makefile.am
+++ b/libemail-engine/Makefile.am
@@ -4,11 +4,16 @@ privsolib_LTLIBRARIES = libemail-engine.la
 
 ENUM_TYPES = e-mail-enums.h
 
-e-mail-enumtypes.h: e-mail-enumtypes.h.template $(ENUM_TYPES)
-       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template e-mail-enumtypes.h.template $(ENUM_TYPES)) > 
$@
+e-mail-enumtypes.h: $(top_srcdir)/enumtypes.h.template $(ENUM_TYPES)
+       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template $(top_srcdir)/enumtypes.h.template \
+               --fhead "#ifndef E_MAIL_ENUMTYPES_H\n#define E_MAIL_ENUMTYPES_H\n" \
+               --ftail "#endif /* E_MAIL_ENUMTYPES_H */\n" \
+               $(ENUM_TYPES)) > $@
 
-e-mail-enumtypes.c: e-mail-enumtypes.c.template $(ENUM_TYPES)
-       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template e-mail-enumtypes.c.template $(ENUM_TYPES)) > 
$@
+e-mail-enumtypes.c: $(top_srcdir)/enumtypes.c.template $(ENUM_TYPES)
+       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template $(top_srcdir)/enumtypes.c.template \
+               --fhead "#include \"e-mail-enumtypes.h\"" \
+               $(ENUM_TYPES)) > $@
 
 ENUM_GENERATED = e-mail-enumtypes.h e-mail-enumtypes.c
 
@@ -86,11 +91,6 @@ BUILT_SOURCES = $(ENUM_GENERATED)
 CLEANFILES = $(BUILT_SOURCES)
 DISTCLEANFILES = $(pkgconfig_DATA)
 
-EXTRA_DIST = \
-       e-mail-enumtypes.h.template \
-       e-mail-enumtypes.c.template \
-       $(NULL)
-
 dist-hook:
        cd $(distdir); rm -f $(BUILT_SOURCES)
 
diff --git a/shell/Makefile.am b/shell/Makefile.am
index 355ec69..d36547e 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -8,11 +8,16 @@ eshellincludedir = $(privincludedir)/shell
 
 ENUM_TYPES = e-shell.h
 
-e-shell-enumtypes.h: e-shell-enumtypes.h.template $(ENUM_TYPES)
-       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template e-shell-enumtypes.h.template $(ENUM_TYPES)) > 
$@
+e-shell-enumtypes.h: $(top_srcdir)/enumtypes.h.template $(ENUM_TYPES)
+       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template $(top_srcdir)/enumtypes.h.template \
+               --fhead "#ifndef E_SHELL_ENUMTYPES_H\n#define E_SHELL_ENUMTYPES_H\n" \
+               --ftail "#endif /* E_SHELL_ENUMTYPES_H */\n" \
+               $(ENUM_TYPES)) > $@
 
-e-shell-enumtypes.c: e-shell-enumtypes.c.template $(ENUM_TYPES)
-       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template e-shell-enumtypes.c.template $(ENUM_TYPES)) > 
$@
+e-shell-enumtypes.c: $(top_srcdir)/enumtypes.c.template $(ENUM_TYPES)
+       $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template $(top_srcdir)/enumtypes.c.template \
+               --fhead "#include \"e-shell-enumtypes.h\"" \
+               $(ENUM_TYPES)) > $@
 
 ENUM_GENERATED = e-shell-enumtypes.h e-shell-enumtypes.c
 
@@ -165,8 +170,6 @@ errordir = $(privdatadir)/errors
 
 EXTRA_DIST =                                   \
        evo-version.h.in                        \
-       e-shell-enumtypes.h.template            \
-       e-shell-enumtypes.c.template            \
        shell.error.xml                         \
        evolution-icon.rc                       \
        evolution.ico                           \


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]