diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-05-07 21:13:00 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-05-07 21:13:00 (GMT) |
commit | 13be5aa2ac44f7bfc70ee25e7ba20ae2adf58ad5 (patch) | |
tree | ff0ac2eb2b4be1774329603ccd3c6bc307789237 /src/format | |
parent | 11e76cece91707f1910d3b1fa56464e261757a52 (diff) |
Made the preloading process work as intended.
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/format.c | 27 | ||||
-rw-r--r-- | src/format/format.h | 7 | ||||
-rw-r--r-- | src/format/preload.c | 81 | ||||
-rw-r--r-- | src/format/preload.h | 8 |
4 files changed, 72 insertions, 51 deletions
diff --git a/src/format/format.c b/src/format/format.c index 11216a2..1eef759 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -250,7 +250,7 @@ void g_binary_format_register_code_point(GBinFormat *format, virt_t pt, bool ent * ctx = contexte de désassemblage à préparer. * * status = barre de statut à tenir informée. * * * -* Description : Fournit un contexte initialisé pour un désassemblage. * +* Description : Intègre dans un contexte les informations tirées d'un format.* * * * Retour : - * * * @@ -258,12 +258,31 @@ void g_binary_format_register_code_point(GBinFormat *format, virt_t pt, bool ent * * ******************************************************************************/ -void g_binary_format_setup_disassembling_context(GBinFormat *format, GProcContext *ctx, GtkStatusStack *status) +void g_binary_format_preload_disassembling_context(GBinFormat *format, GProcContext *ctx, GtkStatusStack *status) { - size_t i; /* Boucle de parcours */ - preload_binary_format(PGA_FORMAT_PRELOAD, format, G_PRELOAD_INFO(ctx), status); +} + + +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à consulter. * +* ctx = contexte de désassemblage à préparer. * +* status = barre de statut à tenir informée. * +* * +* Description : Définit les points de départ d'un contexte de désassemblage. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_format_activate_disassembling_context(GBinFormat *format, GProcContext *ctx, GtkStatusStack *status) +{ + size_t i; /* Boucle de parcours */ + g_rw_lock_reader_lock(&format->pt_lock); for (i = 0; i < format->ep_count; i++) diff --git a/src/format/format.h b/src/format/format.h index b04f11b..e1c4e37 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -65,8 +65,11 @@ SourceEndian g_binary_format_get_endianness(const GBinFormat *); /* Enregistre une adresse comme début d'une zone de code. */ void g_binary_format_register_code_point(GBinFormat *, virt_t, bool); -/* Fournit un contexte initialisé pour un désassemblage. */ -void g_binary_format_setup_disassembling_context(GBinFormat *, GProcContext *, GtkStatusStack *); +/* Intègre dans un contexte les informations tirées d'un format. */ +void g_binary_format_preload_disassembling_context(GBinFormat *, GProcContext *, GtkStatusStack *); + +/* Définit les points de départ d'un contexte de désassemblage. */ +void g_binary_format_activate_disassembling_context(GBinFormat *, GProcContext *, GtkStatusStack *); /* Ajoute un symbole à la collection du format binaire. */ bool g_binary_format_add_symbol(GBinFormat *, GBinSymbol *); diff --git a/src/format/preload.c b/src/format/preload.c index 145dfd9..750a67c 100644 --- a/src/format/preload.c +++ b/src/format/preload.c @@ -110,6 +110,12 @@ static void g_preload_info_dispose(GPreloadInfo *info) g_preload_info_lock_instructions(info); + while (_g_preload_info_count_instructions(info) > 0) + { + instr = _g_preload_info_grab_instruction(info, 0); + g_object_unref(G_OBJECT(instr)); + } + _g_preload_info_drain_instructions(info); g_preload_info_unlock_instructions(info); @@ -118,14 +124,12 @@ static void g_preload_info_dispose(GPreloadInfo *info) while (_g_preload_info_count_comments(info) > 0) { - comment = _g_preload_info_get_comment(info, 0); - - rem_item_from_flat_array(&info->comments, 0, sizeof(GDbComment *)); - + comment = _g_preload_info_grab_comment(info, 0); g_object_unref(G_OBJECT(comment)); - } + _g_preload_info_drain_comments(info); + g_preload_info_unlock_comments(info); G_OBJECT_CLASS(g_preload_info_parent_class)->dispose(G_OBJECT(info)); @@ -286,7 +290,7 @@ size_t _g_preload_info_count_instructions(const GPreloadInfo *info) * * ******************************************************************************/ -GArchInstruction *_g_preload_info_get_instruction(const GPreloadInfo *info, size_t index) +GArchInstruction *_g_preload_info_grab_instruction(const GPreloadInfo *info, size_t index) { GArchInstruction *result; /* Opérande à retourner */ GArchInstruction **ptr; /* Adresse dans le tableau */ @@ -295,7 +299,14 @@ GArchInstruction *_g_preload_info_get_instruction(const GPreloadInfo *info, size result = *ptr; - g_object_ref(G_OBJECT(result)); + /** + * La propriétée de l'élément est transmise à l'appelant. + * + * Ainsi, pour vider une liste via _g_preload_info_drain_instructions(), + * il suffit juste de libérer la mémoire occupée pour le stockage sans + * se préoccuper des références contenues ; le gain de temps est important + * puisqu'on évite là un parcours et des déplacements. + */ return result; @@ -354,17 +365,12 @@ GArchInstruction *g_preload_info_pop_instruction(GPreloadInfo *info) void _g_preload_info_drain_instructions(GPreloadInfo *info) { - GArchInstruction *instr; /* Instruction à libérer */ - - while (_g_preload_info_count_instructions(info) > 0) - { - instr = _g_preload_info_get_instruction(info, 0); - - rem_item_from_flat_array(&info->instructions, 0, sizeof(GArchInstruction *)); - - g_object_unref(G_OBJECT(instr)); + /** + * A utiliser en conjonction avec _g_preload_info_grab_instruction() + * uniquement. + */ - } + reset_flat_array(&info->instructions); } @@ -480,7 +486,7 @@ size_t _g_preload_info_count_comments(const GPreloadInfo *info) * * ******************************************************************************/ -GDbComment *_g_preload_info_get_comment(const GPreloadInfo *info, size_t index) +GDbComment *_g_preload_info_grab_comment(const GPreloadInfo *info, size_t index) { GDbComment *result; /* Opérande à retourner */ GDbComment **ptr; /* Adresse dans le tableau */ @@ -489,7 +495,14 @@ GDbComment *_g_preload_info_get_comment(const GPreloadInfo *info, size_t index) result = *ptr; - g_object_ref(G_OBJECT(result)); + /** + * La propriétée de l'élément est transmise à l'appelant. + * + * Ainsi, pour vider une liste via _g_preload_info_drain_comments(), + * il suffit juste de libérer la mémoire occupée pour le stockage sans + * se préoccuper des références contenues ; le gain de temps est important + * puisqu'on évite là un parcours et des déplacements. + */ return result; @@ -500,35 +513,21 @@ GDbComment *_g_preload_info_get_comment(const GPreloadInfo *info, size_t index) * * * Paramètres : info = instance à manipuler. * * * -* Description : Dépile un commentaire présent dans les préchargements. * +* Description : Retire des préchargements tous les commentaires. * * * -* Retour : Commentaire retiré ou NULL si aucune. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -GDbComment *g_preload_info_pop_comment(GPreloadInfo *info) +void _g_preload_info_drain_comments(GPreloadInfo *info) { - GDbComment *result; /* Instruction à retourner */ - GDbComment **ptr; /* Adresse dans le tableau */ - - g_preload_info_lock_comments(info); + /** + * A utiliser en conjonction avec _g_preload_info_grab_comment() + * uniquement. + */ - if (_g_preload_info_count_comments(info) == 0) - result = NULL; - - else - { - ptr = get_flat_array_item(info->comments, 0, sizeof(GDbComment *)); - result = *ptr; - - rem_item_from_flat_array(&info->comments, 0, sizeof(GDbComment *)); - - } - - g_preload_info_unlock_comments(info); - - return result; + reset_flat_array(&info->comments); } diff --git a/src/format/preload.h b/src/format/preload.h index a915462..d88366a 100644 --- a/src/format/preload.h +++ b/src/format/preload.h @@ -67,7 +67,7 @@ void g_preload_info_add_instruction(GPreloadInfo *, GArchInstruction *); size_t _g_preload_info_count_instructions(const GPreloadInfo *); /* Fournit une instruction préchargée donnée. */ -GArchInstruction *_g_preload_info_get_instruction(const GPreloadInfo *, size_t); +GArchInstruction *_g_preload_info_grab_instruction(const GPreloadInfo *, size_t); /* Dépile une instruction présente dans les préchargements. */ GArchInstruction *g_preload_info_pop_instruction(GPreloadInfo *); @@ -88,10 +88,10 @@ void g_preload_info_add_comment(GPreloadInfo *, GDbComment *); size_t _g_preload_info_count_comments(const GPreloadInfo *); /* Fournit un commentaire préchargé donné. */ -GDbComment *_g_preload_info_get_comment(const GPreloadInfo *, size_t); +GDbComment *_g_preload_info_grab_comment(const GPreloadInfo *, size_t); -/* Dépile un commentaire présent dans les préchargements. */ -GDbComment *g_preload_info_pop_comment(GPreloadInfo *); +/* Retire des préchargements tous les commentaires. */ +void _g_preload_info_drain_comments(GPreloadInfo *); |