From patchwork Thu Oct 12 18:18:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 23504 Received: (qmail 83063 invoked by alias); 12 Oct 2017 18:19:14 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 82774 invoked by uid 89); 12 Oct 2017 18:19:13 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.2 spammy=leaders, consisting, Hx-spam-relays-external:sk:sesbmg2, H*RU:193.180.251.37 X-HELO: sesbmg23.ericsson.net Received: from sesbmg23.ericsson.net (HELO sesbmg23.ericsson.net) (193.180.251.37) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 12 Oct 2017 18:19:11 +0000 Received: from ESESSHC021.ericsson.se (Unknown_Domain [153.88.183.81]) by sesbmg23.ericsson.net (Symantec Mail Security) with SMTP id E4.82.03220.C12BFD95; Thu, 12 Oct 2017 20:19:08 +0200 (CEST) Received: from EUR02-AM5-obe.outbound.protection.outlook.com (153.88.183.145) by oa.msg.ericsson.com (153.88.183.81) with Microsoft SMTP Server (TLS) id 14.3.352.0; Thu, 12 Oct 2017 20:19:08 +0200 Received: from elxacz23q12.ca.am.ericsson.se (192.75.88.130) by DB4PR07MB313.eurprd07.prod.outlook.com (2a01:111:e400:982f::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.5; Thu, 12 Oct 2017 18:19:05 +0000 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH] Use std::vector in linux_xfer_osdata_processgroups Date: Thu, 12 Oct 2017 14:18:48 -0400 Message-ID: <1507832328-23618-1-git-send-email-simon.marchi@ericsson.com> MIME-Version: 1.0 X-ClientProxiedBy: DM5PR1101CA0003.namprd11.prod.outlook.com (2603:10b6:4:4c::13) To DB4PR07MB313.eurprd07.prod.outlook.com (2a01:111:e400:982f::13) X-MS-Office365-Filtering-Correlation-Id: 0b88c6eb-d5d5-4163-7ee9-08d5119db940 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075); SRVR:DB4PR07MB313; X-Microsoft-Exchange-Diagnostics: 1; DB4PR07MB313; 3:Dz+zH6GfeUnm97MbQEBYwycTdqgxSwpwszRPSRdJgO55YpO8f59xw6wQ2Fc8DOdkyPKfPc/egX9b8JoCOq/Aeq21CLO/9mTTtW8gylxWV08t4GoxFXWX00lpkQ9IlJjHr8aF1a2H5kxrtmZmNU6QN3vw0WEBHItcBdb5ihgX9l3XZCiFwzPGjF8Fg8SOmy6Reb5U4mAoWcYhtiOsachaC1WNmJs2KEDw64onrrf+gphBk2q+Z7PVufzp/oYnktKh; 25:LQmI0QiHI6f52lRxd/HFP7LX4gDDik2p4wf/R9ML3cZ0FwXH6+IWCcVbVEYL58cMPup9GDroaCtBmSd+74syb7Kn1GuSmeuoC8lWISOC6J6TROFAyiEp2Fu4amE1BW0f9zWtUN5u6iNa8vOVeDhiDvuJW3fF8tiKlkCDcNAfHUtEJ2Gr3iLXCaJMxXHM2xoguxC7PKhC9DaGCTLu3rOfJ4pWDAbIRfCmQxeyPSy1q+YDqb/9pYXdHet1d+eP1AubWiji7u6oN6HCset/NnPnH9sMPY9mo1fCW6U6QSX5WcWkfMkiV1iYv2DwzJicKMC9tbHQ6B688LA5E1gVW1OGJ6nUBcd9xf0cc8j5M9smjqM=; 31:SV1thPhaz9eI/uYQMbWw508AQqNY76S1p0q+gatbMHcZaaAWBdeor0VxKITxUCb6LtUNdjklWUrGCCF9kh4LZRxtjVwOxVREv1xT5zWx9qEHEn98ywi7mYMR+Q5JI8x8pgXs/EV725X4yra/qrFIHdIyeoY30qjc06rSXOKr+QYwkNIabm6esR1cktQgMjxDn4IDDmTvRP1RHJpeKslqb0jLGmxONiurqzuRYKwTuhc= X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DB4PR07MB313: Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=simon.marchi@ericsson.com; X-Microsoft-Exchange-Diagnostics: 1; DB4PR07MB313; 20:7tn7WKljUA04d/dMHntzyyvz/i86lp3GDiG9GF69j66TZkBQxGL/oFwQw0fZommaD9SYjYBFZSl2E0wYo613P9VsA+JEEqcrqYlIOVseBplf36nHrjbaoFm6r0D4GASeA1CLZu9Q7zFvJWTDwGdunCWkGvp1th4o9x9fiCaCtKmq/wv48rhZo/qz0ENSCHYpsP/qMf/L//rTfl7CjY5GVNWXvvp1KFAuy2sjj8gKetLfmkxywUCXpJFdQQeXLdaVtDMs6CVOy7+4of5zNqgvkaViDS3VwJvf4dgn2DODv95muMA7ODbj+S2sv4Ik06XSPMSm+NDp/LLJQA5uyrCXt3jWIU096OdF523/KWm0QNTv9c89L+gTiHjoR7s1RwrSWvjpLP0vbYyjCLGg3v0ouiUaUR/jydA9AcR/QJDNs8Rvi1WPX3XtKKbGWojQrSvv6+Ca4OQ8I3ikc/YYfS6thFQIhlCRxjqbQM6d7hbgcg/uuaa9dtQDEOnvHpsbxqJ4; 4:o+H5sWZOD5/sLmifpHXksAgD4RMSVUmJOkVOy46/uM5bmvgymBGr8GNrXflQUZS3xHvB4tQ7IB2RYADd9XtLtr5Hx9Jotc3ubzpkCxK9BGIoYIS98S6FI+2MToNbWYUknKLFq+AhZMKMCQfGY6BiVheGSKpz4Mm6F4K8EwWonT888O2J4QLRJsZ2fGIH5nw5MLhetloiITGKQfedmqcxl0f0ccHsybi4G5WGffLFrrE8azNajCUNHJ7SMRiuABUK X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(100000703101)(100105400095)(10201501046)(93006095)(93001095)(3002001)(6041248)(20161123562025)(20161123560025)(20161123555025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DB4PR07MB313; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DB4PR07MB313; X-Forefront-PRVS: 04583CED1A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(376002)(346002)(39860400002)(189002)(199003)(54534003)(7736002)(36756003)(5660300001)(53936002)(305945005)(2906002)(3846002)(6116002)(66066001)(50986999)(5003940100001)(101416001)(478600001)(6506006)(6486002)(47776003)(50226002)(81156014)(16526018)(81166006)(316002)(16586007)(8936002)(25786009)(33646002)(105586002)(106356001)(8676002)(86362001)(6666003)(6916009)(4326008)(97736004)(2361001)(68736007)(107886003)(48376002)(6512007)(189998001)(2351001)(50466002); DIR:OUT; SFP:1101; SCL:1; SRVR:DB4PR07MB313; H:elxacz23q12.ca.am.ericsson.se; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: ericsson.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB4PR07MB313; 23:AhN6ie83jkyVLezEFjGz1wOCz6UYCn/vIEzmRzyDp4?= =?us-ascii?Q?ksNuznBXOAS0VD38rKAzxyDG1wu4VPOJTptINbrDtzxmdsulkm2g1YsHcIo5?= =?us-ascii?Q?E4fPhCsT9wousYS/4SsZmhTwdJ866paQGmciwNwFVPoraVemKaepnxpiutyQ?= =?us-ascii?Q?m2uP8nDPIUECKoqni8kzlYYcDvTBU27h4DY0Ci9CA/A8XmKT/ZTG9f2jvzPq?= =?us-ascii?Q?spIDw4oneFq0O3vI/2M13Yfkw0L1p3KOwBjjax7hK0KX4w7bevw9iKKoCVZe?= =?us-ascii?Q?27FW8rQPwvpb41p+PFFnUBRSjiGIjtyPK9+JCuhCTKujKLzwjtsIlokbGlTD?= =?us-ascii?Q?x/lZwPtA8reJLaKca/Np0Gu7fGZEjDrSxmaxHD3LWyGm9uyq/G7fxp/4Hsbx?= =?us-ascii?Q?P+ywIqnVQuRMPFjAcg/M69D8WKIny5NtnbW9apJyl0Q+OAE0opTtvL26jI+d?= =?us-ascii?Q?yxBtPrZA1xvF6/ta8ioOR7LcdLRShS6UlvAh7+gUV9uypusJV6Sgjb7ed71r?= =?us-ascii?Q?3hmAqRxs0pT7Pl29VIS9DRWvvyPWHVRIHWv1FTXm6CtR1Ji22KLz83BaI8AG?= =?us-ascii?Q?R1YIeTi6C/y7XMUaju0iUY1ixhslXt/Bg43CojJEdrBgsELoIxbyBdO7gvnG?= =?us-ascii?Q?HOg6+wcbjxJlAkxtuIEximv7KZXlu7kuwPGvS1mBhvqjY3m/imeiLQE5OCZQ?= =?us-ascii?Q?hfBPAaOEkQwC5gWZTSPosJFp8O4QK/dPHqmLJsxLfnbKC5XBDyNIwKo7y01A?= =?us-ascii?Q?WuhrOIPy6UJeWRiMM8B5Jco3N8Mh8RS6PmARawc+wTpFLh8zr3cyNx5wSiZL?= =?us-ascii?Q?BQK8sBHsm2nvoYG3tIF5miLa44TI2RS/pUI59g3CpS/byVnVc4HT1aA/D4uC?= =?us-ascii?Q?Edn3GDaB0Afe21kDKSRdMsRHXd2pPb0ME8UcLDCCUvyFw9m/bmDIxBgoX9vS?= =?us-ascii?Q?q/dq/ehVeK1AD6cISa6d/M0iLmUgQcHk9lUlq5svpTUHa3/hzmaaf83rIuMB?= =?us-ascii?Q?j8mAilhi246XOlCoBCXQkaX6loDYHITRJqwogjchK0vHY2u/TXIH9IJrRzJG?= =?us-ascii?Q?yJrNFWhw1FqrCMOkPSyA33ZwX6Vu9rtiLB/Qo0tY3SiNGWq0etnD4GlPnRBP?= =?us-ascii?Q?GTcFiydB0=3D?= X-Microsoft-Exchange-Diagnostics: 1; DB4PR07MB313; 6:YCLHV1z55mBRkud+obWsjTfn2mRgAI5wsbjbed0UeIpF6/yy5UHhz9ftycWTJlx2WbmX6vevGQRiyyyrPtTMM64Jh82G4oEQc3AxKtoGltnVjYoPkxAsrcLtYOQZKEGpdBb0MmH9DoYhfuHYUPfNqFamQOTdsrevZHhAHg9Wcmr5mrR7itNpCfqYvLz1prMovqLCGLpDI7Cn3VGDrC0TFHmaXCtzmvEePnwsFp2y8mlHkfOSeEcbBjFuWUoU13S3V5NYyOUNyzy0e2qw3ZM+4YYBZdQEz7CbPOVe0CRae64Ame7N9+AUrxKrbo9mDVjObIi1uvHn4orLD6BWhrjwrg==; 5:SdriHo4A8Re/YePo5nVgtXqa+/wRD8AvfYvyrO43tDr8J9a6yPm0ch9uuSDV1UEJ6Vga+uI6C1eDFJY5sSM+7x3KDtmvhTrBOxUOYPpqh5aeGROaT+Gdk3JTNAtnCqP91Q2A6E12RpYqE6bZQg+v7RGxAqRHtucZS1TP0fw8EnY=; 24:+YKYbm3H5UU/1eCrWFAGlB6zu+IKFwleNquhjYCD1faEK/JbVxzLKaM3kbMvSMnPWn+RMrBsT1w9fBLF47F4nS+hZkMWYfIlf2WxSdemIl4=; 7:00u5z7ktjyWTm6gH2VivoOWttxI2wjw+xHI+eA6RjmgQo+U6zfAeooYj7rv+FNReLoEQSwu/ytlJlTu4kKp9gIc5ILoo6AAd9T54pgzyyPRZEz7YHf/u1oZAJE/mz5Xc/PNasbm8R1rdZXbTRajvCzu+jD1/aPW/NUx+u61Ni9NJ6fY+lNnMPKymeOgkGrl8GiR1bB4Xm+5NiCkY3AOTnD8yOIxJJv46EouxH5/GBQY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Oct 2017 18:19:05.2718 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 92e84ceb-fbfd-47ab-be52-080c6b87953f X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB4PR07MB313 X-OriginatorOrg: ericsson.com X-IsSubscribed: yes This simplifies the code quite a bit, by removing the array of PID_T that's actually an array of pairs of PID_T. This code is only used to implement "info os procgroups". I tested by hand as well as by running gdb.base/info-os.exp for unix, native-gdbserver and native-extended-gdbserver. gdb/ChangeLog: * nat/linux-osdata.c: Include algorithm. (compare_processes): Remove. (struct pid_pgid_entry): New struct. (linux_xfer_osdata_processgroups): Use std::vector instead of XNEWVEC. --- gdb/nat/linux-osdata.c | 96 +++++++++++++++++++++----------------------------- 1 file changed, 40 insertions(+), 56 deletions(-) diff --git a/gdb/nat/linux-osdata.c b/gdb/nat/linux-osdata.c index 4b40a4d..5d1a7bd 100644 --- a/gdb/nat/linux-osdata.c +++ b/gdb/nat/linux-osdata.c @@ -37,6 +37,7 @@ #include #include #include "filestuff.h" +#include #define NAMELEN(dirent) strlen ((dirent)->d_name) @@ -391,41 +392,40 @@ linux_xfer_osdata_processes (gdb_byte *readbuf, return len; } -/* Auxiliary function used by qsort to sort processes by process - group. Compares two processes with ids PROCESS1 and PROCESS2. - PROCESS1 comes before PROCESS2 if it has a lower process group id. - If they belong to the same process group, PROCESS1 comes before - PROCESS2 if it has a lower process id or is the process group - leader. */ +/* A simple PID/PGID pair. */ -static int -compare_processes (const void *process1, const void *process2) +struct pid_pgid_entry { - PID_T pid1 = *((PID_T *) process1); - PID_T pid2 = *((PID_T *) process2); - PID_T pgid1 = *((PID_T *) process1 + 1); - PID_T pgid2 = *((PID_T *) process2 + 1); + pid_pgid_entry (PID_T pid_, PID_T pgid_) + : pid (pid_), pgid (pgid_) + {} - /* Sort by PGID. */ - if (pgid1 < pgid2) - return -1; - else if (pgid1 > pgid2) - return 1; - else - { - /* Process group leaders always come first, else sort by PID. */ - if (pid1 == pgid1) - return -1; - else if (pid2 == pgid2) - return 1; - else if (pid1 < pid2) - return -1; - else if (pid1 > pid2) - return 1; - else - return 0; - } -} + /* Return true if this pid is the leader of its process group. */ + + bool is_leader () const + { + return pid == pgid; + } + + bool operator< (const pid_pgid_entry &other) + { + /* Sort by PGID. */ + if (this->pgid != other.pgid) + return this->pgid < other.pgid; + + /* Process group leaders always come first... */ + if (this->is_leader ()) + return true; + + if (other.is_leader ()) + return false; + + /* ...else sort by PID. */ + return this->pid < other.pid; + } + + PID_T pid, pgid; +}; /* Collect all process groups from /proc. */ @@ -452,11 +452,10 @@ linux_xfer_osdata_processgroups (gdb_byte *readbuf, dirp = opendir ("/proc"); if (dirp) { + std::vector process_list; struct dirent *dp; - const size_t list_block_size = 512; - PID_T *process_list = XNEWVEC (PID_T, list_block_size * 2); - size_t process_count = 0; - size_t i; + + process_list.reserve (512); /* Build list consisting of PIDs followed by their associated PGID. */ @@ -472,30 +471,18 @@ linux_xfer_osdata_processgroups (gdb_byte *readbuf, pgid = getpgid (pid); if (pgid > 0) - { - process_list[2 * process_count] = pid; - process_list[2 * process_count + 1] = pgid; - ++process_count; - - /* Increase the size of the list if necessary. */ - if (process_count % list_block_size == 0) - process_list = (PID_T *) xrealloc ( - process_list, - (process_count + list_block_size) - * 2 * sizeof (PID_T)); - } + process_list.emplace_back (pid, pgid); } closedir (dirp); /* Sort the process list. */ - qsort (process_list, process_count, 2 * sizeof (PID_T), - compare_processes); + std::sort (process_list.begin (), process_list.end ()); - for (i = 0; i < process_count; ++i) + for (const pid_pgid_entry &entry : process_list) { - PID_T pid = process_list[2 * i]; - PID_T pgid = process_list[2 * i + 1]; + PID_T pid = entry.pid; + PID_T pgid = entry.pgid; char leader_command[32]; char *command_line; @@ -517,8 +504,6 @@ linux_xfer_osdata_processgroups (gdb_byte *readbuf, xfree (command_line); } - - xfree (process_list); } buffer_grow_str0 (&buffer, "\n"); @@ -1697,4 +1682,3 @@ linux_common_xfer_osdata (const char *annex, gdb_byte *readbuf, return 0; } } -