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.c69
1 files changed, 57 insertions, 12 deletions
diff --git a/src/arch/context.c b/src/arch/context.c
index 5427e4a..968a6ea 100644
--- a/src/arch/context.c
+++ b/src/arch/context.c
@@ -65,6 +65,14 @@ static void g_proc_context_class_init(GProcContextClass *klass)
{
klass->push_point = (push_drop_point_fc)_g_proc_context_push_drop_point;
+ g_signal_new("drop-point-pushed",
+ G_TYPE_PROC_CONTEXT,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(GProcContextClass, drop_point_pushed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
}
@@ -83,7 +91,9 @@ static void g_proc_context_class_init(GProcContextClass *klass)
static void g_proc_context_init(GProcContext *ctx)
{
ctx->drop_points = NULL;
+ ctx->dp_allocated = 0;
ctx->dp_count = 0;
+ g_mutex_init(&ctx->dp_access);
ctx->extra_symbols = NULL;
ctx->esyms_count = 0;
@@ -106,9 +116,15 @@ static void g_proc_context_init(GProcContext *ctx)
static void _g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr)
{
- ctx->drop_points = (virt_t *)realloc(ctx->drop_points, ++ctx->dp_count * sizeof(virt_t));
+ if (ctx->dp_count >= ctx->dp_allocated)
+ {
+ ctx->dp_allocated += DP_ALLOC_BLOCK;
+
+ ctx->drop_points = (virt_t *)realloc(ctx->drop_points, ctx->dp_allocated * sizeof(virt_t));
+
+ }
- ctx->drop_points[ctx->dp_count - 1] = addr;
+ ctx->drop_points[ctx->dp_count++] = addr;
}
@@ -128,7 +144,13 @@ static void _g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr)
void g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr)
{
- return G_PROC_CONTEXT_GET_CLASS(ctx)->push_point(ctx, addr);
+ g_mutex_lock(&ctx->dp_access);
+
+ G_PROC_CONTEXT_GET_CLASS(ctx)->push_point(ctx, addr);
+
+ g_mutex_unlock(&ctx->dp_access);
+
+ g_signal_emit_by_name(ctx, "drop-point-pushed");
}
@@ -147,7 +169,15 @@ void g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr)
bool g_proc_context_has_drop_points(const GProcContext *ctx)
{
- return ctx->dp_count > 0;
+ bool result; /* Etat à retourner */
+
+ g_mutex_lock(&ctx->dp_access);
+
+ result = (ctx->dp_count > 0);
+
+ g_mutex_unlock(&ctx->dp_access);
+
+ return result;
}
@@ -172,9 +202,13 @@ bool g_proc_context_has_addr_as_drop_points(const GProcContext *ctx, virt_t addr
result = false;
+ g_mutex_lock(&ctx->dp_access);
+
for (i = 0; i < ctx->dp_count && !result; i++)
result = (ctx->drop_points[i] == addr);
+ g_mutex_unlock(&ctx->dp_access);
+
return result;
}
@@ -183,27 +217,38 @@ bool g_proc_context_has_addr_as_drop_points(const GProcContext *ctx, virt_t addr
/******************************************************************************
* *
* Paramètres : ctx = contexte de désassemblage à compléter. *
+* virt = adresse d'un point de départ de code à traiter. *
* *
* Description : Fournit une adresse virtuelle comme point de départ de code. *
* *
-* Retour : Adresse d'un point de départ de code à traiter. *
+* Retour : true si une adresse a pu être dépilée, false sinon. *
* *
* Remarques : - *
* *
******************************************************************************/
-virt_t g_proc_context_pop_drop_point(GProcContext *ctx)
+bool g_proc_context_pop_drop_point(GProcContext *ctx, virt_t *virt)
{
- virt_t result; /* Adresse à retourner */
+ bool result; /* Bilan d'accès à retourner */
- assert(ctx->dp_count > 0);
+ g_mutex_lock(&ctx->dp_access);
- result = ctx->drop_points[0];
+ if (ctx->dp_count > 0)
+ {
+ result = true;
+
+ *virt = ctx->drop_points[0];
+
+ if (ctx->dp_count > 1)
+ memmove(&ctx->drop_points[0], &ctx->drop_points[1], (ctx->dp_count - 1) * sizeof(virt_t));
- if (ctx->dp_count > 1)
- memmove(&ctx->drop_points[0], &ctx->drop_points[1], (ctx->dp_count - 1) * sizeof(virt_t));
+ ctx->dp_count--;
+
+ }
+ else
+ result = false;
- ctx->drop_points = (virt_t *)realloc(ctx->drop_points, --ctx->dp_count * sizeof(virt_t));
+ g_mutex_unlock(&ctx->dp_access);
return result;