diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-04-20 18:52:01 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-04-20 18:52:01 (GMT) |
commit | 8e5c8417e8ef79c1b475cb1b86a1754b24f9af78 (patch) | |
tree | 650a39bde7a5367995b471a562aa766febd505bc /src/arch/sharing/manager.c | |
parent | c177597d6da5dedb32aa176e8370db8ffb7f87aa (diff) |
Shared immediate operands in order to avoid useless allocations.
Diffstat (limited to 'src/arch/sharing/manager.c')
-rw-r--r-- | src/arch/sharing/manager.c | 101 |
1 files changed, 92 insertions, 9 deletions
diff --git a/src/arch/sharing/manager.c b/src/arch/sharing/manager.c index 43e7e25..952fc33 100644 --- a/src/arch/sharing/manager.c +++ b/src/arch/sharing/manager.c @@ -235,8 +235,8 @@ GSharedInstance *g_share_manager_get(GShareManager *manager, GSharedInstance *te { g_shared_instance_inc_references(result); - manager->instances = (GSharedInstance **)_qinsert(manager->instances, &manager->count, - sizeof(GSharedInstance *), &result, index); + manager->instances = _qinsert(manager->instances, &manager->count, + sizeof(GSharedInstance *), &result, index); } @@ -276,13 +276,96 @@ GSharedInstance *g_share_manager_get(GShareManager *manager, GSharedInstance *te GSharedInstance *g_share_manager_update(GShareManager *manager, GSharedInstance *old, GSharedInstance *template, GShareContainer *container) { GSharedInstance *result; /* Nouvelle instance à renvoyer*/ + bool replaced; /* Remplacement effectué ? */ result = g_share_manager_get(manager, template); if (container != NULL) - g_share_container_replace(container, old, result); + replaced = g_share_container_replace(container, old, result); + else + replaced = false; + + if (replaced) + g_share_manager_put(manager, old); - g_share_manager_put(manager, old); + else + { + g_share_manager_put(manager, result); + result = old; + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : manager = gestionnaire d'instance à consulter. * +* instance = instance partagée vouée à évoluer. * +* * +* Description : Prépare une modification légère et locale d'un élément. * +* * +* Retour : Indice de l'élément prêt à être modifié. * +* * +* Remarques : - * +* * +******************************************************************************/ + +size_t g_share_manager_prepare_light_update(GShareManager *manager, GSharedInstance *instance) +{ + size_t result; /* Indice courant à retourner */ +#ifndef NDEBUG + bool found; /* Validation de présence */ +#endif + + g_mutex_lock(&manager->access); + +#ifndef NDEBUG + + found = bsearch_index(&instance, manager->instances, manager->count,sizeof(GSharedInstance *), + (__compar_fn_t)g_shared_instance_quickly_compare, &result); + + assert(found); + +#else + + bsearch_index(&instance, manager->instances, manager->count,sizeof(GSharedInstance *), + (__compar_fn_t)g_shared_instance_quickly_compare, &result); + +#endif + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : manager = gestionnaire d'instance à consulter. * +* instance = instance partagée vouée à évoluer. * +* index = indice de la place de l'élément avant modifcation.* +* * +* Description : Conclut une modification légère et locale d'un élément. * +* * +* Retour : Indice de l'élément prêt à être modifié. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GSharedInstance *g_share_manager_complete_light_update(GShareManager *manager, GSharedInstance *instance, size_t index) +{ + GSharedInstance *result; /* Nouvelle instance à renvoyer*/ + + manager->instances = _qdelete(manager->instances, &manager->count, + sizeof(GSharedInstance *), index); + + g_mutex_unlock(&manager->access); + + result = g_share_manager_get(manager, instance); + + g_object_unref(G_OBJECT(instance)); return result; @@ -310,12 +393,12 @@ void g_share_manager_put(GShareManager *manager, GSharedInstance *shared) if (g_shared_instance_get_references(shared) == 1) { - g_object_unref(G_OBJECT(shared)); + manager->instances = qdelete(manager->instances, &manager->count, + sizeof(GSharedInstance *), + (__compar_fn_t)g_shared_instance_quickly_compare, + &shared); - manager->instances = (GSharedInstance **)qdelete(manager->instances, &manager->count, - sizeof(GSharedInstance *), - (__compar_fn_t)g_shared_instance_quickly_compare, - &shared); + g_object_unref(G_OBJECT(shared)); } |