Re: [PATCH 3/6] core: made plugin registry handle itself key id assignments
- From: Iago Toral Quiroga <itoral igalia com>
- To: grilo-list gnome org
- Subject: Re: [PATCH 3/6] core: made plugin registry handle itself key id assignments
- Date: Thu, 12 May 2011 12:25:21 +0200
El mié, 11-05-2011 a las 20:31 +0200, Guillaume Emont escribió:
> Instead of relying on GQuarks, a similar mechanism is implemented in the plugin
> registry. This gives more flexibility and allows to #define the values of core
> keys, which automatically give their symbols in GObject-introspection bindings.
Not sure I follow this properly, can you elaborate on the benefits we
obtain with this solution for the introspection based bindings?
> ---
> src/grl-plugin-registry.c | 229 +++++++++++++++++++++++++++++++--------------
> src/grl-plugin-registry.h | 8 ++-
> 2 files changed, 166 insertions(+), 71 deletions(-)
>
> diff --git a/src/grl-plugin-registry.c b/src/grl-plugin-registry.c
> index eca8b86..cdebebf 100644
> --- a/src/grl-plugin-registry.c
> +++ b/src/grl-plugin-registry.c
> @@ -61,6 +61,13 @@ GRL_LOG_DOMAIN(plugin_registry_log_domain);
> GRL_TYPE_PLUGIN_REGISTRY, \
> GrlPluginRegistryPrivate))
>
> +/* GQuark-like implementation, where we manually assign the first IDs. */
> +struct IDHandler {
> + GHashTable *string_to_id;
> + GArray *id_to_string;
> + gint last_id;
> +};
I'd rename IDHandler to KeyIDHandler, id alone is too generic to get its
true purpose without looking at the rest of the code (plugins also have
IDs for example).
I would rename the internal APIs to use that naming convention as well.
(...)
> +/**
> + * id_handler_add:
> + * @handler: the handler
> + * @key: a specific key for system keys, or GRL_METADATA_KEY_INVALID for it to
> + * be assigned
^^ I would add "automatically" at the end.
> + * @name: the name of the key.
> + *
> + * Add a new key<->name correspondence.
> + *
> + * Returns: the new key number, or GRL_METADATA_KEY_INVALID if the key could
> + * not be created (typically if @key or @name is already registered).
> + */
> +static GrlKeyID
> +id_handler_add (struct IDHandler *handler, GrlKeyID key, const gchar *name)
> +{
> + GrlKeyID _key = key;
> +
> + if (_key == GRL_METADATA_KEY_INVALID) {
> + /* existing keys go from 1 to (id_to_string->len - 1), so the next
> + * available key is id_to_string->len, which will be incremented by
> + * g_array_insert_val() */
> + _key = handler->id_to_string->len;
> + }
> +
> + if (NULL != id_handler_get_name (handler, _key)) {
> + GRL_WARNING ("Cannot register %d:%s because key is already defined as %s",
> + _key, name, id_handler_get_name (handler, _key));
> + return GRL_METADATA_KEY_INVALID;
> + } else if ( GRL_METADATA_KEY_INVALID != id_handler_get_key (handler, name)) {
^ blank space
> + /* _key or name is already in use! */
> + GRL_WARNING ("Cannot register %d:%s because name is already registered with key %d",
> + _key, name, id_handler_get_key (handler, name));
> + return GRL_METADATA_KEY_INVALID;
> + } else {
> + /* name_copy is shared between handler->id_to_string and
> + * handler->string_to_id */
> + gchar *name_copy = g_strdup (name);
> +
> + if (_key >= handler->id_to_string->len)
> + g_array_set_size (handler->id_to_string, _key + 1);
> +
> + /* yes, g_array_index() is a macro that give you an lvalue */
^^ missing 's'
> + g_array_index (handler->id_to_string, const gchar *, _key) = name_copy;
> + g_hash_table_insert (handler->string_to_id,
> + name_copy, GRLKEYID_TO_POINTER (_key));
> + }
> +
> + return _key;
> +
> +}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]