Add glib-ctor functionality
authorRyan Lortie <desrt@desrt.ca>
Sun, 18 Sep 2011 06:16:07 +0000 (02:16 -0400)
committerRyan Lortie <desrt@desrt.ca>
Wed, 21 Sep 2011 20:06:53 +0000 (16:06 -0400)
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.

glib/Makefile.am
glib/glib-ctor.h [new file with mode: 0644]

index 8134132..d24bb87 100644 (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                 \
diff --git a/glib/glib-ctor.h b/glib/glib-ctor.h
new file mode 100644 (file)
index 0000000..12df4dd
--- /dev/null
@@ -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__ */