From ab970af19746364a4f236bebc238ebb036adc898 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 15 Oct 2014 22:44:00 +0100 Subject: remote: get rid of all the T packets when syncing the thread list This commit avoids the prune_threads call in the remote target's target_update_thread_list's implementation, eliminating all the "thread alive" RSP traffic (one packet per thread) whenever we fetch the thread list. IOW, this: Sending packet: $Tp2141.2150#82...Packet received: OK Sending packet: $Tp2141.214f#b7...Packet received: OK Sending packet: $Tp2141.2141#82...Packet received: OK ... more T packets; it's one per previously known live thread ... Sending packet: $qXfer:threads:read::0,fff#03...Packet received: l\n\n\n\n\n Becomes: Sending packet: $qXfer:threads:read::0,fff#03...Packet received: l\n\n\n\n\n Tested on x86_64 Fedora 20, native gdbserver: - tests the qXfer:threads:read method. Tested on x86_64 Fedora 20, native gdbserver with qXfer:threads:read force-disabled in gdbserver: - So that GDB falls back to the qfThreadInfo/qsThreadInfo method. And also manually smoked tested force disabling both qXfer:threads:read and qfThreadInfo/qsThreadInfo in gdbserver. gdb/ 2014-10-15 Pedro Alves * gdbthread.h (ALL_NON_EXITED_THREADS_SAFE): New macro. * remote.c (remote_update_thread_list): Skip calling prune_threads if any thread listing method is supported, and instead walk over the set of remote threads listed, deleting those that are not found in GDB's thread list. --- gdb/gdbthread.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'gdb/gdbthread.h') diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index 1ed98a2..937bd55 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -354,6 +354,14 @@ extern struct thread_info *iterate_over_threads (thread_callback_func, void *); for (T = thread_list; T; T = T->next) \ if ((T)->state != THREAD_EXITED) +/* Like ALL_NON_EXITED_THREADS, but allows deleting the currently + iterated thread. */ +#define ALL_NON_EXITED_THREADS_SAFE(T, TMP) \ + for ((T) = thread_list; \ + (T) != NULL ? ((TMP) = (T)->next, 1): 0; \ + (T) = (TMP)) \ + if ((T)->state != THREAD_EXITED) + extern int thread_count (void); /* Switch from one thread to another. */ -- cgit v1.1