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