From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32425 invoked by alias); 22 Jan 2015 00:26:53 -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 32405 invoked by uid 89); 22 Jan 2015 00:26:52 -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,RCVD_IN_DNSWL_LOW,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mail-yh0-f73.google.com Received: from mail-yh0-f73.google.com (HELO mail-yh0-f73.google.com) (209.85.213.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Thu, 22 Jan 2015 00:26:49 +0000 Received: by mail-yh0-f73.google.com with SMTP id a41so455936yho.0 for ; Wed, 21 Jan 2015 16:26:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:mime-version:content-type :content-transfer-encoding:message-id:date:to:cc:subject:in-reply-to :references; bh=8Hjn/3l4tf6lFghT7K83FmdnzZ8/EGaoUv2i5d46828=; b=a3mkyBkL5pJ116Z/bO8iYs78tnLMkvQOk5+MIGqrVrA17R8AxEGlQvMX+cwgBt5GBk 0Dhn0uLIFNhHWS/es9Gt/l+ePFq68mWOueJ4JzhqQH2Q2rujuKV/Ur3db+Og6jN6Pnm0 dzcs4w1NTiAerfCmC+SUnUxdD1ss7mp3yjpW8t09v97xzyjsXPTE8UoHaAhOKUtJrRbA zJV3fd1HD4itYke6uZOcw5897Wru0DlH1Jm/Vu0oTF6vo6REG65O1Ma89IKfA8cqhSMW aagHYaJ5yspOEMlzWCxhNZhXHOqSFlTayLqjKp6bVdd7cUWsfMS3PzH5tYUuVOjVTHVE KHpw== X-Gm-Message-State: ALoCoQlj5V204FXn0wumsbW1+W+nqsCewZfb9BJa9YNUbgHe/9Mhz5lKnHrVR/HcxQcoI70QdjMpsKUTSHZ3AU66Owjgb0GYOqPfK6hCJSs8I516MSYqVX/M0Dn8petQIBf1wwg02pGFqatzPLPmWuHjJ0cXhnqOYissdyaZp6CFOXHEKrNh8CM= X-Received: by 10.236.43.146 with SMTP id l18mr19215455yhb.23.1421886407599; Wed, 21 Jan 2015 16:26:47 -0800 (PST) Received: from corpmail-nozzle1-2.hot.corp.google.com ([100.108.1.103]) by gmr-mx.google.com with ESMTPS id v10si878475qcf.3.2015.01.21.16.26.46 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Jan 2015 16:26:47 -0800 (PST) Received: from ruffy2.mtv.corp.google.com ([172.17.128.107]) by corpmail-nozzle1-2.hot.corp.google.com with ESMTP id QVJoaanq.1; Wed, 21 Jan 2015 16:26:47 -0800 From: Doug Evans MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <21696.17350.451535.337528@ruffy2.mtv.corp.google.com> Date: Thu, 22 Jan 2015 00:26:00 -0000 To: Jan Kratochvil Cc: gdb-patches Subject: Re: [patchv2] Sort threads for thread apply all (bt) In-Reply-To: <20150116233802.GA8732@host2.jankratochvil.net> References: <20150115183316.GA16405@host2.jankratochvil.net> <20150116233802.GA8732@host2.jankratochvil.net> X-IsSubscribed: yes X-SW-Source: 2015-01/txt/msg00579.txt.bz2 Jan Kratochvil writes: > On Thu, 15 Jan 2015 20:29:07 +0100, Doug Evans wrote: > > On Thu, Jan 15, 2015 at 10:33 AM, Jan Kratochvil wrote: > > > I find maybe as good enough and with no risk of UI change flamewar to just > > > sort the threads by their number. Currently they are printed as they happen > > > in the internal GDB list which has no advantage. Printing thread #1 as the > > > first one with assumed 'thread apply all bt' (after the core file is loaded) > > > should make the complaint resolved I guess. > > > > > > No regressions on {x86_64,x86_64-m32,i686}-fedora22pre-linux-gnu. > > > > No objection to sorting the list, but if thread #1 is the important one, > > then a concern could be it'll have scrolled off the screen (such a > > concern has been voiced in another thread in another context), > > and if not lost (say it's in an emacs buffer) one would still have > > to scroll back to see it. > > So one *could* still want #1 to be last. > > Do we want an option to choose the sort direction? > > [I wouldn't make it a global parameter, just an option to > > thread apply.] > > Done. > > > Thanks, > Jan > gdb/ChangeLog > 2015-01-16 Jan Kratochvil > > * thread.c (tp_array_compar_asc, tp_array_compar): New. > (thread_apply_all_command): Parse CMD for tp_array_compar_asc. Sort > tp_array using tp_array_compar. > (_initialize_thread): Extend thread_apply_all_command help. > > gdb/doc/ChangeLog > 2015-01-16 Jan Kratochvil > > * gdb.texinfo (Threads): Describe -asc for thread apply all. Hi. Just some nits, no need to resubmit for review. > > diff --git a/gdb/thread.c b/gdb/thread.c > index ed20fbe..9685351 100644 > --- a/gdb/thread.c > +++ b/gdb/thread.c > @@ -1382,6 +1382,20 @@ make_cleanup_restore_current_thread (void) > restore_current_thread_cleanup_dtor); > } > > +static int tp_array_compar_asc; This should probably have a comment. > + > +/* Sort an array for struct thread_info pointers by their ascending NUM. */ > + > +static int > +tp_array_compar (const void *ap_voidp, const void *bp_voidp) > +{ > + const struct thread_info *const *ap = ap_voidp; > + const struct thread_info *const *bp = bp_voidp; > + > + return ((((*ap)->num > (*bp)->num) - ((*ap)->num < (*bp)->num)) > + * (tp_array_compar_asc ? +1 : -1)); > +} This triggers my "passing parameters as global variables" alarm, and while one could instead have two different functions, this is ok, at least for now. > + > /* Apply a GDB command to a list of threads. List syntax is a whitespace > seperated list of numbers, or ranges, or the keyword `all'. Ranges consist > of two numbers seperated by a hyphen. Examples: > @@ -1398,6 +1412,13 @@ thread_apply_all_command (char *cmd, int from_tty) > int tc; > struct thread_array_cleanup ta_cleanup; > > + tp_array_compar_asc = 0; > + if (cmd && (check_for_argument (&cmd, "-asc", strlen ("-asc")))) cmd != NULL > + { > + cmd = skip_spaces (cmd); > + tp_array_compar_asc = 1; > + } > + > if (cmd == NULL || *cmd == '\000') > error (_("Please specify a command following the thread ID list")); > > @@ -1431,6 +1452,8 @@ thread_apply_all_command (char *cmd, int from_tty) > i++; > } > > + qsort (tp_array, i, sizeof (*tp_array), tp_array_compar); > + > make_cleanup (set_thread_refcount, &ta_cleanup); > > for (k = 0; k != i; k++) > @@ -1739,7 +1762,14 @@ The new thread ID must be currently known."), > &thread_apply_list, "thread apply ", 1, &thread_cmd_list); > > add_cmd ("all", class_run, thread_apply_all_command, > - _("Apply a command to all threads."), &thread_apply_list); > + _("\ > +Apply a command to all threads.\n\ > +\n\ > +Usage: thread apply all [-asc] \n\ > +-asc: Call for all threads in ascending order.\n\ > + The default is descending order.\n\ No final trailing newline. > +"), > + &thread_apply_list); > > add_cmd ("name", class_run, thread_name_command, > _("Set the current thread's name.\n\ > diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo > index f413e23..2207ce4 100644 > --- a/gdb/doc/gdb.texinfo > +++ b/gdb/doc/gdb.texinfo > @@ -2959,14 +2959,17 @@ information on convenience variables. > > @kindex thread apply > @cindex apply command to several threads > -@item thread apply [@var{threadno} | all] @var{command} > +@item thread apply [@var{threadno} | all [-asc]] @var{command} > The @code{thread apply} command allows you to apply the named > @var{command} to one or more threads. Specify the numbers of the > threads that you want affected with the command argument > @var{threadno}. It can be a single thread number, one of the numbers > shown in the first field of the @samp{info threads} display; or it > -could be a range of thread numbers, as in @code{2-4}. To apply a > -command to all threads, type @kbd{thread apply all @var{command}}. > +could be a range of thread numbers, as in @code{2-4}. To apply > +a command to all threads in descending order, type @kbd{thread apply all > +@var{command}}. To apply a command to all threads in ascending order, > +type @kbd{thread apply all -asc @var{command}}. > + > > @kindex thread name > @cindex name a thread