From: Ryan Lortie Date: Sun, 18 Sep 2011 06:16:07 +0000 (-0400) Subject: Add glib-ctor functionality X-Git-Tag: 2.31.0~439 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8f74c927f609139c51b0a0c067ad63c60ac9139b;p=platform%2Fupstream%2Fglib.git Add glib-ctor functionality A pair of macros to define a constructor function (on compilers that support such a concept) and to ensure that the function is run exactly once (on compilers that lack such support). Presently only GCC is implemented. --- diff --git a/glib/Makefile.am b/glib/Makefile.am index 8134132..d24bb87 100644 --- a/glib/Makefile.am +++ b/glib/Makefile.am @@ -147,6 +147,7 @@ libglib_2_0_la_SOURCES = \ gkeyfile.c \ glibintl.h \ glib_trace.h \ + glib-ctor.h \ glib-private.h \ glib-private.c \ glist.c \ diff --git a/glib/glib-ctor.h b/glib/glib-ctor.h new file mode 100644 index 0000000..12df4dd --- /dev/null +++ b/glib/glib-ctor.h @@ -0,0 +1,25 @@ +#ifndef __GLIB_CTOR_H__ + +#ifdef __GNUC__ +#define GLIB_CTOR(func) \ + __attribute__((constructor)) static void func (void) +#define GLIB_ENSURE_CTOR(func) G_STMT_START { } G_STMT_END +#else +/* could be vastly improved... */ +#define GLIB_CTOR(func) \ + static GMutex g__##func##_mutex = G_MUTEX_INIT; \ + static gboolean g__##func##_initialised; \ + static void func (void) +#define GLIB_ENSURE_CTOR(func) \ + G_STMT_START { \ + g_mutex_lock (&g__##func##_mutex); \ + if (!g__##func##_initialised) \ + { \ + g__##func##_initialised = TRUE; \ + func (); \ + } \ + g_mutex_unlock (&g__##func##_mutex); \ + } G_STMT_END +#endif + +#endif /* __GLIB_CTOR_H__ */