summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Zeuthen <davidz@redhat.com>2011-04-08 12:03:36 -0400
committerDavid Zeuthen <davidz@redhat.com>2011-04-08 12:05:11 -0400
commitecdebfd86b40eb7d2ed49ecbacce229f82027531 (patch)
tree793e698eb2b62cff48f7beaeb3fcd74c69edf523
parenta26f6084d22213f685b6d8419d443bdc6db5baac (diff)
Make the generated GDBusProxyTypeFunc O(1)
Signed-off-by: David Zeuthen <davidz@redhat.com>
-rw-r--r--src/codegen.py20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/codegen.py b/src/codegen.py
index 34a8b39..8b388b7 100644
--- a/src/codegen.py
+++ b/src/codegen.py
@@ -1957,19 +1957,25 @@ class CodeGenerator:
'}\n'
'\n'%(self.ns_lower, self.namespace))
- # TODO: this is probably (too) slow
self.c.write('static GType\n'
'_%sobject_manager_client_get_proxy_type_func (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data)\n'
'{\n'
%(self.ns_lower))
- self.c.write(' GType ret;\n'
- ' ret = G_TYPE_DBUS_PROXY;\n'
- ' if (FALSE)\n'
- ' ;\n')
+ self.c.write(' static gsize once_init_value = 0;\n'
+ ' static GHashTable *lookup_hash;\n'
+ ' GType ret;\n'
+ '\n'
+ ' if (g_once_init_enter (&once_init_value))\n'
+ ' {\n'
+ ' lookup_hash = g_hash_table_new (g_str_hash, g_str_equal);\n')
for i in self.ifaces:
- self.c.write(' else if (g_strcmp0 (interface_name, "%s") == 0)\n'
- ' ret = %sTYPE_%s_PROXY;\n'
+ self.c.write(' g_hash_table_insert (lookup_hash, "%s", GSIZE_TO_POINTER (%sTYPE_%s_PROXY));\n'
%(i.name, i.ns_upper, i.name_upper))
+ self.c.write(' g_once_init_leave (&once_init_value, 1);\n'
+ ' }\n')
+ self.c.write(' ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name));\n'
+ ' if (ret == (GType) 0)\n'
+ ' ret = G_TYPE_DBUS_PROXY;\n')
self.c.write(' return ret;\n'
'}\n'
'\n')