From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2680 invoked by alias); 2 Oct 2014 16:21:46 -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 2593 invoked by uid 89); 2 Oct 2014 16:21:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 02 Oct 2014 16:21:44 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s92GLg8p020671 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 2 Oct 2014 12:21:43 -0400 Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s92GLaVO026041 for ; Thu, 2 Oct 2014 12:21:41 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 4/4] DEC threads: Simplify updating the thread list Date: Thu, 02 Oct 2014 16:21:00 -0000 Message-Id: <1412266896-28210-5-git-send-email-palves@redhat.com> In-Reply-To: <1412266896-28210-1-git-send-email-palves@redhat.com> References: <1412266896-28210-1-git-send-email-palves@redhat.com> X-SW-Source: 2014-10/txt/msg00035.txt.bz2 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. 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