From 7a14ec065b88c2b797e60d7e96fd819ed14f691c Mon Sep 17 00:00:00 2001 From: Johan Bilien Date: Wed, 10 Dec 2008 17:53:09 +0000 Subject: =?UTF-8?q?Bug=20563998=20=E2=80=93=20Cache=20the=20GIBaseInfo=20f?= =?UTF-8?q?or=20GTypes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2008-12-10 Johan Bilien Bug 563998 – Cache the GIBaseInfo for GTypes * girepository/girepository.c (g_irepository_find_by_gtype): add a cache of GType -> GIBaseInfo. svn path=/trunk/; revision=991 --- ChangeLog | 7 +++++++ girepository/girepository.c | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/ChangeLog b/ChangeLog index b5c7d5d3..b8fcee95 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-12-10 Johan Bilien + + Bug 563998 – Cache the GIBaseInfo for GTypes + + * girepository/girepository.c (g_irepository_find_by_gtype): + add a cache of GType -> GIBaseInfo. + 2008-12-09 Johan Bilien Bug 562545 – Add function taking / returning GValue diff --git a/girepository/girepository.c b/girepository/girepository.c index 40fba52c..56c1e995 100644 --- a/girepository/girepository.c +++ b/girepository/girepository.c @@ -42,6 +42,7 @@ struct _GIRepositoryPrivate { GHashTable *typelibs; /* (string) namespace -> GTypelib */ GHashTable *lazy_typelibs; /* (string) namespace-version -> GTypelib */ + GHashTable *info_by_gtype; /* GType -> GIBaseInfo */ }; G_DEFINE_TYPE (GIRepository, g_irepository, G_TYPE_OBJECT); @@ -57,6 +58,10 @@ g_irepository_init (GIRepository *repository) (GDestroyNotify) g_typelib_free); repository->priv->lazy_typelibs = g_hash_table_new (g_str_hash, g_str_equal); + repository->priv->info_by_gtype + = g_hash_table_new_full (g_direct_hash, g_direct_equal, + (GDestroyNotify) NULL, + (GDestroyNotify) g_base_info_unref); } static void @@ -66,6 +71,7 @@ g_irepository_finalize (GObject *object) g_hash_table_destroy (repository->priv->typelibs); g_hash_table_destroy (repository->priv->lazy_typelibs); + g_hash_table_destroy (repository->priv->info_by_gtype); (* G_OBJECT_CLASS (g_irepository_parent_class)->finalize) (G_OBJECT (repository)); } @@ -625,6 +631,12 @@ g_irepository_find_by_gtype (GIRepository *repository, repository = get_repository (repository); + data.iface = g_hash_table_lookup (repository->priv->info_by_gtype, + (gpointer)type); + + if (data.iface) + return g_base_info_ref (data.iface); + data.repo = repository; data.name = NULL; data.type = g_type_name (type); @@ -634,6 +646,12 @@ g_irepository_find_by_gtype (GIRepository *repository, g_hash_table_foreach (repository->priv->typelibs, find_interface, &data); g_hash_table_foreach (repository->priv->lazy_typelibs, find_interface, &data); + if (data.iface) + g_hash_table_insert (repository->priv->info_by_gtype, + (gpointer) type, + g_base_info_ref (data.iface)); + + return data.iface; } -- cgit v1.2.1