aboutsummaryrefslogtreecommitdiff
path: root/gdb/nat/linux-osdata.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@ericsson.com>2017-10-14 08:38:02 -0400
committerSimon Marchi <simon.marchi@ericsson.com>2017-10-14 08:38:02 -0400
commitb129dcac882da87767cb863ad8b2572f90e9e5bc (patch)
tree4bd370e3cbfdcac3c20bd62d6391f118663a2874 /gdb/nat/linux-osdata.c
parentaf5bf4ada48ff65b6658be1fab8f9c8f8ab5f319 (diff)
downloadgdb-b129dcac882da87767cb863ad8b2572f90e9e5bc.zip
gdb-b129dcac882da87767cb863ad8b2572f90e9e5bc.tar.gz
gdb-b129dcac882da87767cb863ad8b2572f90e9e5bc.tar.bz2
Use std::vector in linux_xfer_osdata_processgroups
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.
Diffstat (limited to 'gdb/nat/linux-osdata.c')
-rw-r--r--gdb/nat/linux-osdata.c96
1 files 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 <dirent.h>
#include <sys/stat.h>
#include "filestuff.h"
+#include <algorithm>
#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<pid_pgid_entry> 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, "</osdata>\n");
@@ -1697,4 +1682,3 @@ linux_common_xfer_osdata (const char *annex, gdb_byte *readbuf,
return 0;
}
}
-