- target_resume is now synchronous with 5sec timeout
authorntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 9 Jul 2008 10:33:30 +0000 (10:33 +0000)
committerntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 9 Jul 2008 10:33:30 +0000 (10:33 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@775 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/target/target.c

index 082b5cb56d2ca316588ba2b5aa4b595dad0cbc8b..1d6c4d360e26c06a94241e82d6914673e75e6c5e 100644 (file)
@@ -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)