From 876297c25c970da58de83245a4c3b3a9e4c1f9ed Mon Sep 17 00:00:00 2001 From: ntfreak Date: Wed, 9 Jul 2008 10:33:30 +0000 Subject: [PATCH] - target_resume is now synchronous with 5sec timeout git-svn-id: svn://svn.berlios.de/openocd/trunk@775 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/target/target.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/target/target.c b/src/target/target.c index 082b5cb56..1d6c4d360 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -264,6 +264,11 @@ int target_halt(struct target_s *target) int target_resume(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution) { + int retval; + int timeout_ms = 5000; + + enum target_state resume_state = debug_execution ? TARGET_DEBUG_RUNNING : TARGET_RUNNING; + /* We can't poll until after examine */ if (!target->type->examined) { @@ -271,7 +276,24 @@ int target_resume(struct target_s *target, int current, u32 address, int handle_ return ERROR_FAIL; } - return target->type->resume(target, current, address, handle_breakpoints, debug_execution); + if ((retval = target->type->resume(target, current, address, handle_breakpoints, debug_execution)) != ERROR_OK) + return retval; + + /* wait for target to exit halted mode */ + target_poll(target); + + while (target->state != resume_state) + { + usleep(10000); + target_poll(target); + if ((timeout_ms -= 10) <= 0) + { + LOG_ERROR("timeout waiting for target resume"); + return ERROR_TARGET_TIMEOUT; + } + } + + return retval; } int target_process_reset(struct command_context_s *cmd_ctx)