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.
This commit is contained in:
Ryan Lortie 2011-09-18 02:16:07 -04:00
parent 0e604ef0b5
commit 8f74c927f6
2 changed files with 26 additions and 0 deletions

View File

@ -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 \

25
glib/glib-ctor.h Normal file
View File

@ -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__ */