diff options
author | David Zeuthen <davidz@redhat.com> | 2011-04-08 12:03:36 -0400 |
---|---|---|
committer | David Zeuthen <davidz@redhat.com> | 2011-04-08 12:05:11 -0400 |
commit | ecdebfd86b40eb7d2ed49ecbacce229f82027531 (patch) | |
tree | 793e698eb2b62cff48f7beaeb3fcd74c69edf523 | |
parent | a26f6084d22213f685b6d8419d443bdc6db5baac (diff) |
Make the generated GDBusProxyTypeFunc O(1)
Signed-off-by: David Zeuthen <davidz@redhat.com>
-rw-r--r-- | src/codegen.py | 20 |
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') |