mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2026-08-27 00:26:02 -04:00
gdb: use all_threads() in for_each_thread()
In for_each_thread(), we use all_threads_safe(), which allows deleting the thread. This it not needed in the cases where it is currently used and it causes the iterator to get corrupted when threads are deleted in a nested all_threads_safe() iteration. One such scenario is as follows: - remote debugging in non-stop mode - one thread has hit a breakpoint - one thread exited but GDB does not know about it, yet - resume with 'continue -a' - the continue command uses for_each_thread() to proceed threads individually - the stopped thread starts an inline step-over (displaced stepping disabled) - update_thread_list() learns about the exit and deletes the thread - the safe iterator's m_next still points to the deleted thread Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
parent
d9557c71f2
commit
f1fdd3164b
2 changed files with 9 additions and 2 deletions
|
|
@ -796,7 +796,14 @@ void thread_change_ptid (process_stratum_target *targ,
|
|||
using for_each_thread_callback_ftype
|
||||
= gdb::function_view<void (thread_info *)>;
|
||||
|
||||
/* Call CALLBACK once for each known thread. */
|
||||
/* Call CALLBACK once for each known thread.
|
||||
|
||||
CALLBACK must not delete the thread. To delete threads, use:
|
||||
|
||||
for (thread_info &t : all_threads_safe ())
|
||||
if (some_condition ())
|
||||
delete &t;
|
||||
*/
|
||||
|
||||
extern void for_each_thread (for_each_thread_callback_ftype callback);
|
||||
|
||||
|
|
|
|||
|
|
@ -605,7 +605,7 @@ find_thread_by_handle (gdb::array_view<const gdb_byte> handle,
|
|||
void
|
||||
for_each_thread (for_each_thread_callback_ftype callback)
|
||||
{
|
||||
for (thread_info &tp : all_threads_safe ())
|
||||
for (thread_info &tp : all_threads ())
|
||||
callback (&tp);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue