summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-05-07 21:13:00 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-05-07 21:13:00 (GMT)
commit13be5aa2ac44f7bfc70ee25e7ba20ae2adf58ad5 (patch)
treeff0ac2eb2b4be1774329603ccd3c6bc307789237 /src/format
parent11e76cece91707f1910d3b1fa56464e261757a52 (diff)
Made the preloading process work as intended.
Diffstat (limited to 'src/format')
-rw-r--r--src/format/format.c27
-rw-r--r--src/format/format.h7
-rw-r--r--src/format/preload.c81
-rw-r--r--src/format/preload.h8
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 *);