From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28615 invoked by alias); 2 Oct 2014 18:46:37 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 28603 invoked by uid 89); 2 Oct 2014 18:46:35 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.7 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: glazunov.sibelius.xs4all.nl Received: from sibelius.xs4all.nl (HELO glazunov.sibelius.xs4all.nl) (83.163.83.176) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 02 Oct 2014 18:46:34 +0000 Received: from glazunov.sibelius.xs4all.nl (kettenis@localhost [127.0.0.1]) by glazunov.sibelius.xs4all.nl (8.14.5/8.14.3) with ESMTP id s92IkP2w022805; Thu, 2 Oct 2014 20:46:25 +0200 (CEST) Received: (from kettenis@localhost) by glazunov.sibelius.xs4all.nl (8.14.5/8.14.3/Submit) id s92IkOVn018154; Thu, 2 Oct 2014 20:46:24 +0200 (CEST) Date: Thu, 02 Oct 2014 18:46:00 -0000 Message-Id: <201410021846.s92IkOVn018154@glazunov.sibelius.xs4all.nl> From: Mark Kettenis To: palves@redhat.com CC: gdb-patches@sourceware.org In-reply-to: <1412266896-28210-5-git-send-email-palves@redhat.com> (message from Pedro Alves on Thu, 2 Oct 2014 17:21:36 +0100) Subject: Re: [PATCH 4/4] DEC threads: Simplify updating the thread list References: <1412266896-28210-1-git-send-email-palves@redhat.com> <1412266896-28210-5-git-send-email-palves@redhat.com> X-SW-Source: 2014-10/txt/msg00042.txt.bz2 > From: Pedro Alves > Date: Thu, 2 Oct 2014 17:21:36 +0100 > > 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. Given that Alpha True64 support is about to be removed, I don't think anyone will care. > gdb/ > 2014-10-02 Pedro Alves > > * 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. > --- > gdb/dec-thread.c | 93 +++++++++++++------------------------------------------- > 1 file changed, 21 insertions(+), 72 deletions(-) > > 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; > -- > 1.9.3 > >