diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2009-05-28 18:21:27 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2009-06-09 16:15:00 +0100 |
commit | f550c492a10922795099166db34d8ccf5dbe63a7 (patch) | |
tree | 26c288147e945715b9811f79542d84544a2689bb /dbus/dbus-gtype-specialized.c | |
parent | a0124a5ecc829b73e2293cd7b23bf0cf0eb0a87c (diff) | |
download | dbus-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.c | 64 |
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); |