summaryrefslogtreecommitdiff
path: root/src/arch/sharing/manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/sharing/manager.c')
-rw-r--r--src/arch/sharing/manager.c101
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));
}