gdb: defer commit resume until all available events are consumed
[deliverable/binutils-gdb.git] / gdb / infrun.c
index ad7ff7f1a89dd01b01586e27573bd1557c5628b9..a702940a7207eb7c07f75f59a4e921e807d3bc5a 100644 (file)
@@ -3889,9 +3889,19 @@ fetch_inferior_event ()
       = make_scoped_restore (&execution_direction,
                             target_execution_direction ());
 
+    /* Hold the resume commands until we are done consuming all immediately
+       available target events.  */
+    static gdb::optional<scoped_restore_tmpl<int>> restore_defer_commit_resume;
+    if (!restore_defer_commit_resume.has_value ())
+      restore_defer_commit_resume.emplace (make_scoped_defer_target_commit_resume ());
+
     if (!do_target_wait (minus_one_ptid, ecs, TARGET_WNOHANG))
       {
        infrun_log_debug ("do_target_wait returned false");
+
+       /* No more events to process, let the resume commands free.  */
+       restore_defer_commit_resume.reset ();
+       commit_resume_all_targets();
        return;
       }
 
@@ -3991,6 +4001,8 @@ fetch_inferior_event ()
     /* No error, don't finish the thread states yet.  */
     finish_state.release ();
 
+    mark_infrun_async_event_handler ();
+
     /* This scope is used to ensure that readline callbacks are
        reinstalled here.  */
   }
This page took 0.02408 seconds and 4 git commands to generate.