summaryrefslogtreecommitdiff
path: root/dbus/dbus-gtype-specialized.c
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2009-05-28 18:21:27 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2009-06-09 16:15:00 +0100
commitf550c492a10922795099166db34d8ccf5dbe63a7 (patch)
tree26c288147e945715b9811f79542d84544a2689bb /dbus/dbus-gtype-specialized.c
parenta0124a5ecc829b73e2293cd7b23bf0cf0eb0a87c (diff)
downloaddbus-glib-f550c492a10922795099166db34d8ccf5dbe63a7.tar.gz
fd.o #13908: silently initialize specialized types whenever required
Colin Walters asks: "Is there a reason not to just do the initialization at the time someone calls one of the public API entry points that depends on it?". This turns out to be non-trivial because those public API entry points are themselves used inside the initialization.
Diffstat (limited to 'dbus/dbus-gtype-specialized.c')
-rw-r--r--dbus/dbus-gtype-specialized.c64
1 files changed, 46 insertions, 18 deletions
diff --git a/dbus/dbus-gtype-specialized.c b/dbus/dbus-gtype-specialized.c
index 220f603..408bd3c 100644
--- a/dbus/dbus-gtype-specialized.c
+++ b/dbus/dbus-gtype-specialized.c
@@ -22,7 +22,7 @@
*
*/
-#include "dbus-gtype-specialized.h"
+#include "dbus-gtype-specialized-priv.h"
#include "dbus-gvalue-utils.h"
#include <glib.h>
#include <string.h>
@@ -107,12 +107,6 @@ dbus_g_type_specialized_init (void)
g_once (&once, specialized_init, NULL);
}
-static gboolean
-specialized_types_is_initialized (void)
-{
- return specialized_containers != NULL;
-}
-
static DBusGTypeSpecializedData *
lookup_specialization_data (GType type)
{
@@ -284,7 +278,16 @@ dbus_g_type_register_collection (const char *n
const DBusGTypeSpecializedCollectionVtable *vtable,
guint flags)
{
- g_return_if_fail (specialized_types_is_initialized ());
+ dbus_g_type_specialized_init();
+
+ _dbus_g_type_register_collection (name, vtable, flags);
+}
+
+void
+_dbus_g_type_register_collection (const char *name,
+ const DBusGTypeSpecializedCollectionVtable *vtable,
+ guint flags)
+{
register_container (name, DBUS_G_SPECTYPE_COLLECTION, (const DBusGTypeSpecializedVtable*) vtable);
}
@@ -301,7 +304,16 @@ dbus_g_type_register_map (const char *name,
const DBusGTypeSpecializedMapVtable *vtable,
guint flags)
{
- g_return_if_fail (specialized_types_is_initialized ());
+ dbus_g_type_specialized_init();
+
+ _dbus_g_type_register_map (name, vtable, flags);
+}
+
+void
+_dbus_g_type_register_map (const char *name,
+ const DBusGTypeSpecializedMapVtable *vtable,
+ guint flags)
+{
register_container (name, DBUS_G_SPECTYPE_MAP, (const DBusGTypeSpecializedVtable*) vtable);
}
@@ -318,7 +330,16 @@ dbus_g_type_register_struct (const char *name,
const DBusGTypeSpecializedStructVtable *vtable,
guint flags)
{
- g_return_if_fail (specialized_types_is_initialized ());
+ dbus_g_type_specialized_init();
+
+ _dbus_g_type_register_struct (name, vtable, flags);
+}
+
+void
+_dbus_g_type_register_struct (const char *name,
+ const DBusGTypeSpecializedStructVtable *vtable,
+ guint flags)
+{
register_container (name, DBUS_G_SPECTYPE_STRUCT, (const DBusGTypeSpecializedVtable*) vtable);
}
@@ -430,7 +451,7 @@ lookup_or_register_specialized (const char *container,
char *name;
const DBusGTypeSpecializedContainer *klass;
- g_return_val_if_fail (specialized_types_is_initialized (), G_TYPE_INVALID);
+ dbus_g_type_specialized_init();
klass = g_hash_table_lookup (specialized_containers, container);
g_return_val_if_fail (klass != NULL, G_TYPE_INVALID);
@@ -705,7 +726,8 @@ gpointer
dbus_g_type_specialized_construct (GType gtype)
{
DBusGTypeSpecializedData *data;
- g_return_val_if_fail (specialized_types_is_initialized (), FALSE);
+
+ dbus_g_type_specialized_init();
data = lookup_specialization_data (gtype);
g_return_val_if_fail (data != NULL, FALSE);
@@ -729,7 +751,8 @@ dbus_g_type_collection_get_fixed (GValue *value,
DBusGTypeSpecializedData *data;
GType gtype;
- g_return_val_if_fail (specialized_types_is_initialized (), FALSE);
+ dbus_g_type_specialized_init();
+
g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), FALSE);
gtype = G_VALUE_TYPE (value);
@@ -760,7 +783,8 @@ dbus_g_type_collection_value_iterate (const GValue *va
DBusGTypeSpecializedData *data;
GType gtype;
- g_return_if_fail (specialized_types_is_initialized ());
+ dbus_g_type_specialized_init();
+
g_return_if_fail (G_VALUE_HOLDS_BOXED (value));
gtype = G_VALUE_TYPE (value);
@@ -794,7 +818,8 @@ dbus_g_type_specialized_init_append (GValue *value, DBusGTypeSpecializedAppendCo
GType gtype;
DBusGTypeSpecializedData *specdata;
- g_return_if_fail (specialized_types_is_initialized ());
+ dbus_g_type_specialized_init();
+
g_return_if_fail (G_VALUE_HOLDS_BOXED (value));
gtype = G_VALUE_TYPE (value);
specdata = lookup_specialization_data (gtype);
@@ -875,7 +900,8 @@ dbus_g_type_map_value_iterate (const GValue *value,
DBusGTypeSpecializedData *data;
GType gtype;
- g_return_if_fail (specialized_types_is_initialized ());
+ dbus_g_type_specialized_init();
+
g_return_if_fail (G_VALUE_HOLDS_BOXED (value));
gtype = G_VALUE_TYPE (value);
@@ -907,7 +933,8 @@ dbus_g_type_struct_get_member (const GValue *value,
DBusGTypeSpecializedData *data;
GType gtype;
- g_return_val_if_fail (specialized_types_is_initialized (), FALSE);
+ dbus_g_type_specialized_init();
+
g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), FALSE);
gtype = G_VALUE_TYPE (value);
@@ -938,7 +965,8 @@ dbus_g_type_struct_set_member (GValue *value,
DBusGTypeSpecializedData *data;
GType gtype;
- g_return_val_if_fail (specialized_types_is_initialized (), FALSE);
+ dbus_g_type_specialized_init();
+
g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), FALSE);
gtype = G_VALUE_TYPE (value);