From d17081340c79b300d190d39f29447b9002cf0673 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 27 Sep 2010 18:17:50 -0400 Subject: [PATCH] type classes: hash table Signed-off-by: Mathieu Desnoyers --- lib/types/enum.c | 8 +++---- lib/types/types.c | 55 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/lib/types/enum.c b/lib/types/enum.c index 0117dd32..507d0c35 100644 --- a/lib/types/enum.c +++ b/lib/types/enum.c @@ -160,10 +160,10 @@ struct enum_table *enum_new(void) struct enum_table *table; table = g_new(struct enum_table, 1); - table->value_to_quark = g_hash_table_new_full(enum_val_hash, - enum_val_equal, - enum_val_free, NULL); - table->quark_to_value = g_hash_table_new(g_direct_hash, g_direct_equal); + table->value_to_quark = g_hash_table(enum_val_hash, enum_val_equal); + table->quark_to_value = g_hash_table_new_full(g_direct_hash, + g_direct_equal, + NULL, enum_val_free); } void enum_destroy(struct enum_table *table) diff --git a/lib/types/types.c b/lib/types/types.c index 1b9a3dfb..f6e9317c 100644 --- a/lib/types/types.c +++ b/lib/types/types.c @@ -22,8 +22,59 @@ #include #include +#include + +struct type_class { + GQuark qname; + void (*read)(); + size_t (*write)(); +}; struct type { - GQuark name; - size_t len; /* type length, in bits */ + struct type_class *class; + size_t alignment; /* type alignment, in bits */ + ssize_t len; /* type length, in bits. -1 for dynamic size. */ }; + +/* + * Type class hash table contains the registered type classes. Type class + * registration is typically performed by a plugin. + * TODO: support plugin unload (unregistration of type classes). + */ +GHashTable *type_classes; + +struct type_class *ctf_lookup_type_class(GQuark qname) +{ + return g_hash_table_lookup(type_classes, + (gconstpointer) (unsigned long) qname) +} + +int ctf_register_type_class(const char *name, + void (*read)(), + void (*write)()) +{ + struct type_class tc = g_new(struct type_class, 1); + GQuark qname = g_quark_from_string(name); + + if (ctf_lookup_type_class(qname)) + return -EEXIST; + + g_hash_table_insert(type_classes, + (gconstpointer) (unsigned long) qname, + tc); + return 0; +} + +int ctf_init_types(void) +{ + type_classes = g_hash_table_new_full(g_direct_hash, g_direct_equal, + NULL, g_free); + if (!type_classes) + return -ENOMEM; + return 0; +} + +int ctf_finalize_types(void) +{ + g_hash_table_destroy(type_classes); +} -- 2.34.1