diff options
Diffstat (limited to 'src/arch/sharing/manager.c')
| -rw-r--r-- | src/arch/sharing/manager.c | 431 | 
1 files changed, 0 insertions, 431 deletions
diff --git a/src/arch/sharing/manager.c b/src/arch/sharing/manager.c deleted file mode 100644 index 379c342..0000000 --- a/src/arch/sharing/manager.c +++ /dev/null @@ -1,431 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * manager.c - collecte et gestion des instances partagées - * - * Copyright (C) 2016-2017 Cyrille Bagard - * - *  This file is part of Chrysalide. - * - *  Chrysalide is free software; you can redistribute it and/or modify - *  it under the terms of the GNU General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  Chrysalide is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU General Public License for more details. - * - *  You should have received a copy of the GNU General Public License - *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>. - */ - - -#include "manager.h" - - -#include <assert.h> -#include <malloc.h> -#ifdef DEBUG_DUMP_STATS -#   include <stdio.h> -#endif -#include <string.h> - - -#include "../../common/sort.h" - - - -/* Gestionnaire d'instances de type identique partagées (instance) */ -struct _GShareManager -{ -    GObject parent;                         /* A laisser en premier        */ - -    GSharedInstance **instances;            /* Instances partagées         */ -    size_t count;                           /* Quantité de ces instances   */ -    GMutex access;                          /* Accès à la table            */ - -    GType managed;                          /* Type d'instances gérées     */ - -}; - -/* Gestionnaire d'instances de type identique partagées (classe) */ -struct _GShareManagerClass -{ -    GObjectClass parent;                    /* A laisser en premier        */ - -}; - - -/* Procède à l'initialisation d'une classe de suivi de largeurs. */ -static void g_share_manager_class_init(GShareManagerClass *); - -/* Procède à l'initialisation d'un suivi de largeurs de lignes. */ -static void g_share_manager_init(GShareManager *); - -/* Supprime toutes les références externes. */ -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. */ -G_DEFINE_TYPE(GShareManager, g_share_manager, G_TYPE_OBJECT); - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : class = classe de composant GTK à initialiser.               * -*                                                                             * -*  Description : Procède à l'initialisation d'une classe de suivi de largeurs.* -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -static void g_share_manager_class_init(GShareManagerClass *class) -{ -    GObjectClass *object;                   /* Autre version de la classe  */ - -    object = G_OBJECT_CLASS(class); - -    object->dispose = (GObjectFinalizeFunc/* ! */)g_share_manager_dispose; -    object->finalize = (GObjectFinalizeFunc)g_share_manager_finalize; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : manager = composant GLib à initialiser.                      * -*                                                                             * -*  Description : Procède à l'initialisation d'un suivi de largeurs de lignes. * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -static void g_share_manager_init(GShareManager *manager) -{ -    manager->instances = NULL; -    manager->count = 0; - -    g_mutex_init(&manager->access); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : manager = instance d'objet GLib à traiter.                   * -*                                                                             * -*  Description : Supprime toutes les références externes.                     * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -static void g_share_manager_dispose(GShareManager *manager) -{ -    size_t i;                               /* Boucle de parcours          */ - -    for (i = 0; i < manager->count; i++) -        g_object_unref(G_OBJECT(manager->instances[i])); - -    g_mutex_clear(&manager->access); - -    G_OBJECT_CLASS(g_share_manager_parent_class)->dispose(G_OBJECT(manager)); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : manager = instance d'objet GLib à traiter.                   * -*                                                                             * -*  Description : Procède à la libération totale de la mémoire.                * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -static void g_share_manager_finalize(GShareManager *manager) -{ -    if (manager->instances != NULL) -        free(manager->instances); - -    G_OBJECT_CLASS(g_share_manager_parent_class)->finalize(G_OBJECT(manager)); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : type = type d'instances encadrées ici.                       * -*                                                                             * -*  Description : Crée un nouveau gestionnaire d'instances partagées.          * -*                                                                             * -*  Retour      : Composant GLib créé.                                         * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -GShareManager *g_share_manager_new(GType type) -{ -    GShareManager *result;                  /* Gestionnaire à renvoyer     */ - -    result = g_object_new(G_TYPE_SHARE_MANAGER, NULL); - -    result->managed = type; - -    return result; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : manager  = gestionnaire d'instance à consulter.              * -*                template = informations à retrouver intégralement.           * -*                                                                             * -*  Description : Retrouve ou crée une instance partagée.                      * -*                                                                             * -*  Retour      : Instance existante déjà partagée ou nouvellement créée.      * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -GSharedInstance *g_share_manager_build(GShareManager *manager, GSharedInstance *template) -{ -    GSharedInstance *result;                /* Trouvaille à retourner      */ -    size_t index;                           /* Indice d'une instance idéale*/ -    bool found;                             /* Existence de cette instance */ -    bool status;                            /* Conclusion d'initialisation */ - -    g_mutex_lock(&manager->access); - -    found = bsearch_index(&template, manager->instances, manager->count, sizeof(GSharedInstance *), -                          (__compar_fn_t)g_shared_instance_compare, &index); - -    if (!found) -    { -        result = g_object_new(manager->managed, NULL); - -        status = g_shared_instance_apply_template(result, template); - -        if (!status) -        { -            g_object_unref(result); -            result = NULL; -        } - -        else -        { -            g_shared_instance_inc_references(result); - -            manager->instances = _qinsert(manager->instances, &manager->count, -                                          sizeof(GSharedInstance *), &result, index); - -        } - -    } - -    else -        result = manager->instances[index]; - -    _g_share_manager_get(manager, result); - -    g_mutex_unlock(&manager->access); - -    return result; - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : manager   = gestionnaire d'instance à consulter.             * -*                old       = ancienne instance partagée à faire évoluer.      * -*                template  = informations à retrouver intégralement.          * -*                container = propriétaire de l'ancienne version à contacter.  * -*                                                                             * -*  Description : Met à jour une instance partagée.                            * -*                                                                             * -*  Retour      : Instance existante déjà partagée ou nouvellement créée.      * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -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_build(manager, template); - -    if (container != NULL) -        replaced = g_share_container_replace(container, old, result); -    else -        replaced = true; - -    if (replaced) -        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 = é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.                       * -*                                                                             * -*  Description : Abandonne un usage d'une instance partagée.                  * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -void g_share_manager_put(GShareManager *manager, GSharedInstance *shared) -{ -    g_mutex_lock(&manager->access); - -    g_shared_instance_dec_references(shared); - -    if (g_shared_instance_get_references(shared) == 1) -    { -        manager->instances = qdelete(manager->instances, &manager->count, -                                     sizeof(GSharedInstance *), -                                     (__compar_fn_t)g_shared_instance_compare, -                                     &shared); - -        g_object_unref(G_OBJECT(shared)); - -    } - -    g_mutex_unlock(&manager->access); - -} - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : manager = gestionnaire d'instance à consulter.               * -*                                                                             * -*  Description : Imprime des statistiques d'utilisation du gestionnaire.      * -*                                                                             * -*  Retour      : -                                                            * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ -#ifdef DEBUG_DUMP_STATS -void g_share_manager_dump_stats(GShareManager *manager) -{ -    unsigned int counter;                   /* Quantité nécessaire         */ -    size_t i;                               /* Boucle de parcours          */ -    GTypeQuery query;                       /* Informations sur un type    */ - -    counter = 0; - -    g_mutex_lock(&manager->access); - -    for (i = 0; i < manager->count; i++) -        counter += g_shared_instance_get_references(manager->instances[i]); - -    g_mutex_unlock(&manager->access); - -    g_type_query(manager->managed, &query); - -    printf("%s: current = %zu / %zu - needed = %u / %u (size=%u, saved=%zu)\n", -           query.type_name, -           manager->count, manager->count * query.instance_size, -           counter, counter * query.instance_size, -           query.instance_size, -           (counter - manager->count) * query.instance_size); - -} -#endif  | 
