summaryrefslogtreecommitdiffstats
path: root/toolbox
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2015-03-10 15:03:40 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-03-10 15:03:40 +0000
commit8576aa055ca9278d454ef5261032ecfd542badd4 (patch)
treee3a00c600dd9aede8afb27c7d65115b32c15e6c5 /toolbox
parent4c37448f79ec0dba9634ef037a7217bd60799766 (diff)
parent9cce837d025d05a07a3b91cf23337a7b688c3eb9 (diff)
downloadsystem_core-8576aa055ca9278d454ef5261032ecfd542badd4.zip
system_core-8576aa055ca9278d454ef5261032ecfd542badd4.tar.gz
system_core-8576aa055ca9278d454ef5261032ecfd542badd4.tar.bz2
am 9cce837d: Merge "Increase output width for wchan and pc on 64 bit targets."
* commit '9cce837d025d05a07a3b91cf23337a7b688c3eb9': Increase output width for wchan and pc on 64 bit targets.
Diffstat (limited to 'toolbox')
-rw-r--r--toolbox/ps.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/toolbox/ps.c b/toolbox/ps.c
index d0a8db3..18129ff 100644
--- a/toolbox/ps.c
+++ b/toolbox/ps.c
@@ -29,6 +29,12 @@ static char *nexttok(char **strp)
#define SHOW_NUMERIC_UID 32
#define SHOW_ABI 64
+#if __LP64__
+#define PC_WIDTH 10 /* Realistically, the top bits will be 0, so don't waste space. */
+#else
+#define PC_WIDTH (2*sizeof(uintptr_t))
+#endif
+
static int display_flags = 0;
static int ppid_filter = 0;
@@ -44,7 +50,8 @@ static int ps_line(int pid, int tid, char *namefilter)
int fd, r;
char *ptr, *name, *state;
int ppid;
- unsigned wchan, rss, vss, eip;
+ unsigned rss, vss;
+ uintptr_t eip;
unsigned utime, stime;
int prio, nice, rtprio, sched, psr;
struct passwd *pw;
@@ -124,7 +131,7 @@ static int ps_line(int pid, int tid, char *namefilter)
nexttok(&ptr); // blocked
nexttok(&ptr); // sigignore
nexttok(&ptr); // sigcatch
- wchan = strtoul(nexttok(&ptr), 0, 10); // wchan
+ nexttok(&ptr); // wchan
nexttok(&ptr); // nswap
nexttok(&ptr); // cnswap
nexttok(&ptr); // exit signal
@@ -176,7 +183,16 @@ static int ps_line(int pid, int tid, char *namefilter)
else
printf(" %.2s ", get_sched_policy_name(p));
}
- printf(" %08x %08x %s ", wchan, eip, state);
+ char path[PATH_MAX];
+ snprintf(path, sizeof(path), "/proc/%d/wchan", pid);
+ char wchan[10];
+ int fd = open(path, O_RDONLY);
+ ssize_t wchan_len = read(fd, wchan, sizeof(wchan));
+ if (wchan_len == -1) {
+ wchan[wchan_len = 0] = '\0';
+ }
+ close(fd);
+ printf(" %10.*s %0*lx %s ", (int) wchan_len, wchan, (int) PC_WIDTH, eip, state);
if (display_flags & SHOW_ABI) {
print_exe_abi(pid);
}
@@ -285,12 +301,13 @@ int ps_main(int argc, char **argv)
}
if (display_flags & SHOW_MACLABEL) {
- printf("LABEL USER PID PPID NAME\n");
+ printf("LABEL USER PID PPID NAME\n");
} else {
- printf("USER PID PPID VSIZE RSS %s%s %s WCHAN PC %sNAME\n",
+ printf("USER PID PPID VSIZE RSS %s%s %sWCHAN %*s %sNAME\n",
(display_flags&SHOW_CPU)?"CPU ":"",
(display_flags&SHOW_PRIO)?"PRIO NICE RTPRI SCHED ":"",
(display_flags&SHOW_POLICY)?"PCY " : "",
+ (int) PC_WIDTH, "PC",
(display_flags&SHOW_ABI)?"ABI " : "");
}
while((de = readdir(d)) != 0){