diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-05-21 16:48:11 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-05-21 16:48:11 (GMT) |
commit | acd355c4c5ae25fb9cac64b8dc17407a2bcc979b (patch) | |
tree | d5b43201049116cd9734ff554e61ed8a7e0084cc /src/arch/sharing/manager.c | |
parent | 4691a434a34a19317156a761967f719e408b73bb (diff) |
Refined the whole share system for operands.
Diffstat (limited to 'src/arch/sharing/manager.c')
-rw-r--r-- | src/arch/sharing/manager.c | 77 |
1 files changed, 67 insertions, 10 deletions
diff --git a/src/arch/sharing/manager.c b/src/arch/sharing/manager.c index 3b7cd01..379c342 100644 --- a/src/arch/sharing/manager.c +++ b/src/arch/sharing/manager.c @@ -69,6 +69,9 @@ static void g_share_manager_dispose(GShareManager *); /* Procède à la libération totale de la mémoire. */ static void g_share_manager_finalize(GShareManager *); +/* Note une augmentation des utilisations d'un élément partagé. */ +static void _g_share_manager_get(GShareManager *, GSharedInstance *); + /* Détermine le type du gestionnaire d'instances partagées. */ @@ -207,7 +210,7 @@ GShareManager *g_share_manager_new(GType type) * * ******************************************************************************/ -GSharedInstance *g_share_manager_get(GShareManager *manager, GSharedInstance *template) +GSharedInstance *g_share_manager_build(GShareManager *manager, GSharedInstance *template) { GSharedInstance *result; /* Trouvaille à retourner */ size_t index; /* Indice d'une instance idéale*/ @@ -217,13 +220,13 @@ GSharedInstance *g_share_manager_get(GShareManager *manager, GSharedInstance *te g_mutex_lock(&manager->access); found = bsearch_index(&template, manager->instances, manager->count, sizeof(GSharedInstance *), - (__compar_fn_t)g_shared_instance_quickly_compare, &index); + (__compar_fn_t)g_shared_instance_compare, &index); if (!found) { result = g_object_new(manager->managed, NULL); - status = g_shared_instance_init(result, template); + status = g_shared_instance_apply_template(result, template); if (!status) { @@ -245,11 +248,7 @@ GSharedInstance *g_share_manager_get(GShareManager *manager, GSharedInstance *te else result = manager->instances[index]; - if (result != NULL) - { - g_object_ref(G_OBJECT(result)); - g_shared_instance_inc_references(result); - } + _g_share_manager_get(manager, result); g_mutex_unlock(&manager->access); @@ -278,7 +277,7 @@ GSharedInstance *g_share_manager_update(GShareManager *manager, GSharedInstance GSharedInstance *result; /* Nouvelle instance à renvoyer*/ bool replaced; /* Remplacement effectué ? */ - result = g_share_manager_get(manager, template); + result = g_share_manager_build(manager, template); if (container != NULL) replaced = g_share_container_replace(container, old, result); @@ -301,6 +300,64 @@ GSharedInstance *g_share_manager_update(GShareManager *manager, GSharedInstance /****************************************************************************** * * +* Paramètres : manager = gestionnaire d'instance à consulter. * +* instance = élément partagé à manipuler. * +* * +* Description : Note une augmentation des utilisations d'un élément partagé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void _g_share_manager_get(GShareManager *manager, GSharedInstance *instance) +{ +#ifndef NDEBUG + bool found; /* Existence de cette instance */ +#endif + +#ifndef NDEBUG + + found = bsearch_index(&instance, manager->instances, manager->count, sizeof(GSharedInstance *), + (__compar_fn_t)g_shared_instance_compare, (size_t []) { 0 }); + + assert(found); + +#endif + + g_object_ref(G_OBJECT(instance)); + g_shared_instance_inc_references(instance); + +} + + +/****************************************************************************** +* * +* Paramètres : manager = gestionnaire d'instance à consulter. * +* instance = élément partagé à manipuler. * +* * +* Description : Note une augmentation des utilisations d'un élément partagé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_share_manager_get(GShareManager *manager, GSharedInstance *instance) +{ + g_mutex_lock(&manager->access); + + _g_share_manager_get(manager, instance); + + g_mutex_unlock(&manager->access); + +} + + +/****************************************************************************** +* * * Paramètres : manager = gestionnaire d'instance à consulter. * * shared = instance partagée à libérer. * * * @@ -322,7 +379,7 @@ void g_share_manager_put(GShareManager *manager, GSharedInstance *shared) { manager->instances = qdelete(manager->instances, &manager->count, sizeof(GSharedInstance *), - (__compar_fn_t)g_shared_instance_quickly_compare, + (__compar_fn_t)g_shared_instance_compare, &shared); g_object_unref(G_OBJECT(shared)); |