[binutils-gdb] gdb: use all_threads() in for_each_thread()

Markus Metzger via Gdb-cvs <[email protected]>
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f1fdd3164b86d15c97204fe9eaa5de57ae33f2bd

commit f1fdd3164b86d15c97204fe9eaa5de57ae33f2bd
Author: Markus Metzger <[email protected]>
Date:   Mon May 11 08:53:21 2026 +0000

    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 <[email protected]>

Diff:
---
 gdb/gdbthread.h | 9 ++++++++-
 gdb/thread.c    | 2 +-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h
index b3052b28d1a..1bdbf621982 100644
--- a/gdb/gdbthread.h
+++ b/gdb/gdbthread.h
@@ -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);
 
diff --git a/gdb/thread.c b/gdb/thread.c
index 4f62ca280cd..110e58a70aa 100644
--- a/gdb/thread.c
+++ b/gdb/thread.c
@@ -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);
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.