summaryrefslogtreecommitdiff
path: root/src/arch/context.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/context.c')
-rw-r--r--src/arch/context.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/arch/context.c b/src/arch/context.c
index 979a403..dacd5ed 100644
--- a/src/arch/context.c
+++ b/src/arch/context.c
@@ -33,12 +33,22 @@
+/* Taille des blocs d'allocations */
+#define DB_ALLOC_SIZE 20
+
+
/* Initialise la classe des contextes de processeur. */
static void g_proc_context_class_init(GProcContextClass *);
/* Initialise une instance de contexte de processeur. */
static void g_proc_context_init(GProcContext *);
+/* Supprime toutes les références externes. */
+static void g_proc_context_dispose(GProcContext *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_proc_context_finalize(GProcContext *);
+
/* Ajoute une adresse virtuelle comme point de départ de code. */
static void _g_proc_context_push_drop_point(GProcContext *, DisassPriorityLevel, virt_t, va_list);
@@ -63,6 +73,13 @@ G_DEFINE_TYPE(GProcContext, g_proc_context, G_TYPE_OBJECT);
static void g_proc_context_class_init(GProcContextClass *klass)
{
+ GObjectClass *object; /* Autre version de la classe */
+
+ object = G_OBJECT_CLASS(klass);
+
+ object->dispose = (GObjectFinalizeFunc/* ! */)g_proc_context_dispose;
+ object->finalize = (GObjectFinalizeFunc)g_proc_context_finalize;
+
klass->push_point = (push_drop_point_fc)_g_proc_context_push_drop_point;
g_signal_new("drop-point-pushed",
@@ -105,6 +122,56 @@ static void g_proc_context_init(GProcContext *ctx)
ctx->esyms_count = 0;
g_mutex_init(&ctx->es_access);
+ g_mutex_init(&ctx->items_mutex);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_proc_context_dispose(GProcContext *ctx)
+{
+ size_t i; /* Boucle de parcours */
+
+ for (i = 0; i < ctx->items_count; i++)
+ g_object_unref(G_OBJECT(ctx->items[i]));
+
+ g_mutex_clear(&ctx->items_mutex);
+
+ G_OBJECT_CLASS(g_proc_context_parent_class)->dispose(G_OBJECT(ctx));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_proc_context_finalize(GProcContext *ctx)
+{
+ if (ctx->items != NULL)
+ free(ctx->items);
+
+ G_OBJECT_CLASS(g_proc_context_parent_class)->finalize(G_OBJECT(ctx));
+
}
@@ -304,3 +371,63 @@ bool g_proc_context_pop_new_symbol_at(GProcContext *ctx, vmpa2t *addr)
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = contexte de désassemblage générique à consulter. *
+* item = élément pour base de données à conserver. *
+* *
+* Description : Note la mise en place d'un élément pendant le désassemblage. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_proc_context_add_db_item(GProcContext *ctx, GDbItem *item)
+{
+ g_mutex_lock(&ctx->items_mutex);
+
+ if ((ctx->items_count + 1) > ctx->items_allocated)
+ {
+ ctx->items_allocated += DB_ALLOC_SIZE;
+
+ ctx->items = (GDbItem **)realloc(ctx->items, sizeof(GDbItem *) * ctx->items_allocated);
+
+ }
+
+ ctx->items[ctx->items_count++] = item;
+
+ g_mutex_unlock(&ctx->items_mutex);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = contexte de désassemblage générique à consulter. *
+* func = fonction à appeler pour chaque élément. *
+* data = éventuelles données à associer à l'appel. *
+* *
+* Description : Effectue un traitement sur chaque élement de base de données.*
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_proc_context_foreach_db_item(GProcContext *ctx, GFunc func, void *data)
+{
+ size_t i; /* Boucle de parcours */
+
+ g_mutex_lock(&ctx->items_mutex);
+
+ for (i = 0; i < ctx->items_count; i++)
+ func(ctx->items[i], data);
+
+ g_mutex_unlock(&ctx->items_mutex);
+
+}