diff options
Diffstat (limited to 'src/arch/context.c')
-rw-r--r-- | src/arch/context.c | 127 |
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); + +} |