diff options
author | Pedro Alves <palves@redhat.com> | 2014-10-15 22:48:35 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2014-10-15 22:56:21 +0100 |
commit | 44ee4a526db6160b302417127e736b73fc00ee87 (patch) | |
tree | edfcce0c4556bd41f3f06ddb7c51ffc56690b0a0 /gdb | |
parent | ab970af19746364a4f236bebc238ebb036adc898 (diff) | |
download | gdb-44ee4a526db6160b302417127e736b73fc00ee87.zip gdb-44ee4a526db6160b302417127e736b73fc00ee87.tar.gz gdb-44ee4a526db6160b302417127e736b73fc00ee87.tar.bz2 |
DEC threads: Simplify updating the thread list
Seems to me that we can simplify DEC thread's
target_update_thread_list implementation, avoiding the need to build
the array of GDB threads.
I have no way to test this, but then again support for Tru64 is about
to be removed.
Pushing anyway to have the last version in git be the cleanest one
should start from, if this file turns out to be resurrected in the
future.
gdb/
2014-10-15 Pedro Alves <palves@redhat.com>
* dec-thread.c (dec_thread_count_gdb_threads)
(dec_thread_add_gdb_thread): Delete.
(dec_thread_update_thread_list): Delete.
(dec_thread_find_new_threads): Rename to ...
(dec_thread_update_thread_list): ... this. Delete GDB-size
threads that are no longer found in dec_thread_list.
(resync_thread_list): Delete.
(dec_thread_wait): Call dec_thread_update_thread_list instead of
resync_thread_list.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/dec-thread.c | 93 |
2 files changed, 33 insertions, 72 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index abad945..336a3c1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,17 @@ 2014-10-15 Pedro Alves <palves@redhat.com> + * dec-thread.c (dec_thread_count_gdb_threads) + (dec_thread_add_gdb_thread): Delete. + (dec_thread_update_thread_list): Delete. + (dec_thread_find_new_threads): Rename to ... + (dec_thread_update_thread_list): ... this. Delete GDB-size + threads that are no longer found in dec_thread_list. + (resync_thread_list): Delete. + (dec_thread_wait): Call dec_thread_update_thread_list instead of + resync_thread_list. + +2014-10-15 Pedro Alves <palves@redhat.com> + * 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 diff --git a/gdb/dec-thread.c b/gdb/dec-thread.c index fc43153..d5cfad2 100644 --- a/gdb/dec-thread.c +++ b/gdb/dec-thread.c @@ -369,40 +369,33 @@ update_dec_thread_list (void) pthreadDebugThdSeqDestroy (debug_context); } -/* A callback to count the number of threads known to GDB. */ - -static int -dec_thread_count_gdb_threads (struct thread_info *ignored, void *context) -{ - int *count = (int *) context; - - *count = *count + 1; - return 0; -} - -/* A callback that saves the given thread INFO at the end of an - array. The end of the array is given in the CONTEXT and is - incremented once the info has been added. */ - -static int -dec_thread_add_gdb_thread (struct thread_info *info, void *context) -{ - struct thread_info ***listp = (struct thread_info ***) context; - - **listp = info; - *listp = *listp + 1; - return 0; -} - -/* Find new threads. */ +/* Implement the update_thread_list target_ops method. */ static void -dec_thread_find_new_threads (struct target_ops *ops) +dec_thread_update_thread_list (struct target_ops *ops) { int i; struct dec_thread_info *info; + struct thread_info *tp, *tmp; update_dec_thread_list (); + + /* Delete GDB-side threads no longer found in dec_thread_list. */ + ALL_NON_EXITED_THREADS_SAFE (tp, tmp) + { + for (i = 0; VEC_iterate (dec_thread_info_s, dec_thread_list, i, info); i++) + { + if (ptid_equal (info->ptid, tp->ptid)) + break; + } + if (i == VEC_length (dec_thread_info_s, dec_thread_list)) + { + /* Not found. */ + delete_thread (tp->ptid); + } + } + + /* And now add new threads. */ for (i = 0; VEC_iterate (dec_thread_info_s, dec_thread_list, i, info); i++) { ptid_t ptid = ptid_build_from_info (*info); @@ -412,50 +405,6 @@ dec_thread_find_new_threads (struct target_ops *ops) } } -/* Implement the update_thread_list target_ops method. */ - -static void -dec_thread_update_thread_list (struct target_ops *ops) -{ - int i; - struct dec_thread_info *info; - - /* Delete dead threads. */ - prune_threads (); - - /* Now find new threads. */ - dec_thread_find_new_threads (ops); -} - -/* Resynchronize the list of threads known by GDB with the actual - list of threads reported by libpthread_debug. */ - -static void -resync_thread_list (struct target_ops *ops) -{ - int i; - int num_gdb_threads = 0; - struct thread_info **gdb_thread_list; - struct thread_info **next_thread_info; - - /* Add new threads. */ - dec_thread_find_new_threads (ops); - - /* Remove threads that no longer exist. To help with the search, - we build an array of GDB threads, and then iterate over this - array. */ - - iterate_over_threads (dec_thread_count_gdb_threads, - (void *) &num_gdb_threads); - gdb_thread_list = alloca (num_gdb_threads * sizeof (struct thread_info *)); - next_thread_info = gdb_thread_list; - iterate_over_threads (dec_thread_add_gdb_thread, (void *) &next_thread_info); - - for (i = 0; i < num_gdb_threads; i++) - if (!dec_thread_ptid_is_alive (gdb_thread_list[i]->ptid)) - delete_thread (gdb_thread_list[i]->ptid); -} - /* The "to_detach" method of the dec_thread_ops. */ static void @@ -502,7 +451,7 @@ dec_thread_wait (struct target_ops *ops, /* The ptid returned by the target beneath us is the ptid of the process. We need to find which thread is currently active and return its ptid. */ - resync_thread_list (ops); + dec_thread_update_thread_list (ops); active_ptid = get_active_ptid (); if (ptid_equal (active_ptid, null_ptid)) return ptid; |