summaryrefslogtreecommitdiff
path: root/src/format/preload.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/preload.c')
-rw-r--r--src/format/preload.c75
1 files changed, 67 insertions, 8 deletions
diff --git a/src/format/preload.c b/src/format/preload.c
index cddc60e..14bb4b0 100644
--- a/src/format/preload.c
+++ b/src/format/preload.c
@@ -259,20 +259,24 @@ void g_preload_info_unlock_instructions(GPreloadInfo *info)
* *
* Description : Ajoute une instruction supplémentaire aux préchargements. *
* *
-* Retour : - *
+* Retour : true si l'instruction a bien été insérée, false sinon. *
* *
* Remarques : - *
* *
******************************************************************************/
-void g_preload_info_add_instruction(GPreloadInfo *info, GArchInstruction *instr)
+bool g_preload_info_add_instruction(GPreloadInfo *info, GArchInstruction *instr)
{
+ bool result; /* Bilan à retourner */
+
g_preload_info_lock_instructions(info);
- _g_preload_info_add_instruction(info, instr);
+ result = _g_preload_info_add_instruction(info, instr);
g_preload_info_unlock_instructions(info);
+ return result;
+
}
@@ -283,14 +287,16 @@ void g_preload_info_add_instruction(GPreloadInfo *info, GArchInstruction *instr)
* *
* Description : Ajoute une instruction supplémentaire aux préchargements. *
* *
-* Retour : - *
+* Retour : true si l'instruction a bien été insérée, false sinon. *
* *
* Remarques : - *
* *
******************************************************************************/
-void _g_preload_info_add_instruction(GPreloadInfo *info, GArchInstruction *instr)
+bool _g_preload_info_add_instruction(GPreloadInfo *info, GArchInstruction *instr)
{
+ bool result; /* Bilan à retourner */
+
int cmp_instr_by_addr(const GArchInstruction **a, const GArchInstruction **b)
{
const mrange_t *range_a; /* Emplacement pour l'instr. A */
@@ -303,8 +309,16 @@ void _g_preload_info_add_instruction(GPreloadInfo *info, GArchInstruction *instr
}
- insert_item_into_flat_array(&info->instructions, &instr, sizeof(GArchInstruction *),
- (__compar_fn_t)cmp_instr_by_addr);
+ result = _g_preload_info_has_instruction_for(info, g_arch_instruction_get_range(instr));
+
+ if (result)
+ insert_item_into_flat_array(&info->instructions, &instr, sizeof(GArchInstruction *),
+ (__compar_fn_t)cmp_instr_by_addr);
+
+ else
+ g_object_unref(G_OBJECT(instr));
+
+ return result;
}
@@ -312,7 +326,52 @@ void _g_preload_info_add_instruction(GPreloadInfo *info, GArchInstruction *instr
/******************************************************************************
* *
* Paramètres : info = instance à mettre à jour. *
-* addr = localisation du commentaire recherché. *
+* range = emplacement de l'instruction recherchés. *
+* *
+* Description : Détermine si une instruction existe sur un espace donné. *
+* *
+* Retour : true si une instruction existe à l'emplacement indiqué. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool _g_preload_info_has_instruction_for(GPreloadInfo *info, const mrange_t *range)
+{
+ bool result; /* Bilan à retourner */
+ GArchInstruction **ptr; /* Adresse dans le tableau */
+
+ int check_for_overlap(const mrange_t *key, const GArchInstruction **i)
+ {
+ const mrange_t *irange; /* Emplacement pour l'instr. */
+ int status; /* Bilan de la recherche */
+
+ irange = g_arch_instruction_get_range(*i);
+
+ if (mrange_intersects_mrange(irange, key))
+ status = 0;
+
+ else
+ status = cmp_vmpa(get_mrange_addr(key), get_mrange_addr(irange));
+
+ return status;
+
+ }
+
+ ptr = find_item_in_flat_array(info->instructions, sizeof(GArchInstruction *),
+ (__compar_fn_t)check_for_overlap, range);
+
+ result = (ptr != NULL);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : info = instance à mettre à jour. *
+* addr = localisation de l'instruction recherchée. *
* *
* Description : Détermine si une instruction est présente à un point donné. *
* *