int report_to_gdb;
int trace_event;
int in_step_range;
- int any_resumed;
threads_debug_printf ("[%s]", target_pid_to_str (ptid).c_str ());
in_step_range = 0;
ourstatus->set_ignore ();
- auto status_pending_p_any = [&] (thread_info *thread)
- {
- return status_pending_p_callback (thread, minus_one_ptid);
- };
-
- auto not_stopped = [&] (thread_info *thread)
- {
- return not_stopped_callback (thread, minus_one_ptid);
- };
-
- /* Find a resumed LWP, if any. */
- if (find_thread (status_pending_p_any) != NULL)
- any_resumed = 1;
- else if (find_thread (not_stopped) != NULL)
- any_resumed = 1;
- else
- any_resumed = 0;
+ bool was_any_resumed = any_resumed ();
if (step_over_bkpt == null_ptid)
pid = wait_for_event (ptid, &w, options);
pid = wait_for_event (step_over_bkpt, &w, options & ~WNOHANG);
}
- if (pid == 0 || (pid == -1 && !any_resumed))
+ if (pid == 0 || (pid == -1 && !was_any_resumed))
{
gdb_assert (target_options & TARGET_WNOHANG);
return get_thread_lwp (thread)->stopped;
}
+bool
+linux_process_target::any_resumed ()
+{
+ bool any_resumed;
+
+ auto status_pending_p_any = [&] (thread_info *thread)
+ {
+ return status_pending_p_callback (thread, minus_one_ptid);
+ };
+
+ auto not_stopped = [&] (thread_info *thread)
+ {
+ return not_stopped_callback (thread, minus_one_ptid);
+ };
+
+ /* Find a resumed LWP, if any. */
+ if (find_thread (status_pending_p_any) != NULL)
+ any_resumed = 1;
+ else if (find_thread (not_stopped) != NULL)
+ any_resumed = 1;
+ else
+ any_resumed = 0;
+
+ return any_resumed;
+}
+
/* This exposes stop-all-threads functionality to other modules. */
void
}
}
else
- push_stop_notification (cs.last_ptid, cs.last_status);
+ {
+ push_stop_notification (cs.last_ptid, cs.last_status);
+
+ if (cs.last_status.kind () == TARGET_WAITKIND_THREAD_EXITED
+ && !target_any_resumed ())
+ {
+ target_waitstatus ws;
+ ws.set_no_resumed ();
+ push_stop_notification (null_ptid, ws);
+ }
+ }
}
/* Be sure to not change the selected thread behind GDB's back.
/* Return true if THREAD is known to be stopped now. */
virtual bool thread_stopped (thread_info *thread);
+ /* Return true if any thread is known to be resumed. */
+ virtual bool any_resumed ();
+
/* Return true if the get_tib_address op is supported. */
virtual bool supports_get_tib_address ();
#define target_supports_software_single_step() \
the_target->supports_software_single_step ()
+#define target_any_resumed() \
+ the_target->any_resumed ()
+
ptid_t mywait (ptid_t ptid, struct target_waitstatus *ourstatus,
target_wait_flags options, int connected_wait);