X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=lib%2Ftypes%2Ftypes.c;h=f6e9317cb1eb33c80534ea382432873551cf35b5;hp=1b9a3dfb5956544310051c6d5090ca045d75ee98;hb=d17081340c79b300d190d39f29447b9002cf0673;hpb=dd617f8ac309ea811019b6be7edc8b700435662b 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); +}