target: use correct target in target-prefixed commands and event handlers
This change contains an alternative to Matthias Welwarsky's #4130 (target-prefixed commands) and to #4293 (event handlers). get_current_target() must retrieve the target associated to the current command. If no target associated, the current target of the command context is used as a fallback. Many Tcl event handlers work with the current target as if it were the target issuing the event. current_target in command_context is a number and has to be converted to a pointer in every get_current_target() call. The solution: - Replace current_target in command_context by a target pointer - Add another target pointer current_target_override - get_current_target() returns current_target_override if set, otherwise current_target - Save, set and restore current_target_override to the current prefix in run_command() - Save, set and restore current_target_override to the event invoking target in target_handle_event() While on it use calloc when allocating a new command_context. Change-Id: I9a82102e94dcac063743834a1d28da861b2e74ea Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Suggested-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com> Reviewed-on: http://openocd.zylin.com/4295 Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
This commit is contained in:
committed by
Matthias Welwarsky
parent
eaeb4191e5
commit
bb9d9c6026
@@ -510,7 +510,9 @@ struct target *get_target_by_num(int num)
|
||||
|
||||
struct target *get_current_target(struct command_context *cmd_ctx)
|
||||
{
|
||||
struct target *target = get_target_by_num(cmd_ctx->current_target);
|
||||
struct target *target = cmd_ctx->current_target_override
|
||||
? cmd_ctx->current_target_override
|
||||
: cmd_ctx->current_target;
|
||||
|
||||
if (target == NULL) {
|
||||
LOG_ERROR("BUG: current_target out of bounds");
|
||||
@@ -2505,7 +2507,10 @@ static int find_target(struct command_context *cmd_ctx, const char *name)
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
|
||||
cmd_ctx->current_target = target->target_number;
|
||||
cmd_ctx->current_target = target;
|
||||
if (cmd_ctx->current_target_override)
|
||||
cmd_ctx->current_target_override = target;
|
||||
|
||||
return ERROR_OK;
|
||||
}
|
||||
|
||||
@@ -2533,7 +2538,7 @@ COMMAND_HANDLER(handle_targets_command)
|
||||
else
|
||||
state = "tap-disabled";
|
||||
|
||||
if (CMD_CTX->current_target == target->target_number)
|
||||
if (CMD_CTX->current_target == target)
|
||||
marker = '*';
|
||||
|
||||
/* keep columns lined up to match the headers above */
|
||||
@@ -4441,17 +4446,28 @@ void target_handle_event(struct target *target, enum target_event e)
|
||||
|
||||
for (teap = target->event_action; teap != NULL; teap = teap->next) {
|
||||
if (teap->event == e) {
|
||||
LOG_DEBUG("target: (%d) %s (%s) event: %d (%s) action: %s",
|
||||
LOG_DEBUG("target(%d): %s (%s) event: %d (%s) action: %s",
|
||||
target->target_number,
|
||||
target_name(target),
|
||||
target_type_name(target),
|
||||
e,
|
||||
Jim_Nvp_value2name_simple(nvp_target_event, e)->name,
|
||||
Jim_GetString(teap->body, NULL));
|
||||
|
||||
/* Override current target by the target an event
|
||||
* is issued from (lot of scripts need it).
|
||||
* Return back to previous override as soon
|
||||
* as the handler processing is done */
|
||||
struct command_context *cmd_ctx = current_command_context(teap->interp);
|
||||
struct target *saved_target_override = cmd_ctx->current_target_override;
|
||||
cmd_ctx->current_target_override = target;
|
||||
|
||||
if (Jim_EvalObj(teap->interp, teap->body) != JIM_OK) {
|
||||
Jim_MakeErrorMessage(teap->interp);
|
||||
command_print(NULL, "%s\n", Jim_GetString(Jim_GetResult(teap->interp), NULL));
|
||||
}
|
||||
|
||||
cmd_ctx->current_target_override = saved_target_override;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5529,7 +5545,7 @@ static int target_create(Jim_GetOptInfo *goi)
|
||||
target = calloc(1, sizeof(struct target));
|
||||
/* set target number */
|
||||
target->target_number = new_target_number();
|
||||
cmd_ctx->current_target = target->target_number;
|
||||
cmd_ctx->current_target = target;
|
||||
|
||||
/* allocate memory for each unique target type */
|
||||
target->type = calloc(1, sizeof(struct target_type));
|
||||
|
||||
Reference in New Issue
Block a user