]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - io/getrusage.c
xfs_io: refactor inode command
[thirdparty/xfsprogs-dev.git] / io / getrusage.c
1 /*
2 * Copyright (c) 2005 Silicon Graphics, Inc.
3 * All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include "command.h"
20 #include "input.h"
21 #include <sys/time.h>
22 #include <sys/resource.h>
23 #include "init.h"
24
25 static cmdinfo_t getrusage_cmd;
26
27 /*
28 * Report process resource utilisation. Formatting options:
29 * "Shell" format: 0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 0pf+0w
30 * Verbose format:
31 * 0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k
32 * 0inputs+0outputs (0major+0minor)pagefaults 0swaps
33 * Comma Separated Value format: 0.000,0.000,00:00:00.00,0.0,0,0,0,0,0,0
34 */
35 static int
36 getrusage_f(
37 int argc,
38 char **argv)
39 {
40 struct timeval wallclk, timenow;
41 struct rusage rusage;
42 double usrtime, systime, elapsed, pct_cpu;
43 char ts[64];
44 int Cflag, vflag;
45 int c;
46
47 Cflag = vflag = 0;
48 while ((c = getopt(argc, argv, "Cv")) != EOF) {
49 switch (c) {
50 case 'C':
51 Cflag = 1;
52 break;
53 case 'v':
54 vflag = 1;
55 break;
56 default:
57 return command_usage(&getrusage_cmd);
58 }
59 }
60 if (optind != argc)
61 return command_usage(&getrusage_cmd);
62
63 if (getrusage(RUSAGE_SELF, &rusage) < 0) {
64 perror("getrusage");
65 return 0;
66 }
67
68 gettimeofday(&timenow, NULL);
69 wallclk = tsub(timenow, stopwatch);
70 elapsed = (double)wallclk.tv_sec +
71 ((double)wallclk.tv_usec / 1000000.0);
72 usrtime = (double)rusage.ru_utime.tv_sec +
73 ((double)rusage.ru_utime.tv_usec / 1000000.0);
74 systime = (double)rusage.ru_stime.tv_sec +
75 ((double)rusage.ru_stime.tv_usec / 1000000.0);
76 if (elapsed < usrtime + systime)
77 pct_cpu = 100.0;
78 else
79 pct_cpu = ((usrtime + systime) / elapsed) * 100;
80 c = Cflag ? VERBOSE_FIXED_TIME : TERSE_FIXED_TIME;
81 timestr(&wallclk, ts, sizeof(ts), c);
82
83 if (Cflag)
84 printf("%.3f,%.3f,%s,%.1f,%ld,%ld,%ld,%ld,%ld,%ld,%ld\n",
85 usrtime, systime, ts, pct_cpu,
86 rusage.ru_majflt, rusage.ru_minflt, rusage.ru_nswap,
87 rusage.ru_inblock, rusage.ru_oublock,
88 rusage.ru_nvcsw, rusage.ru_nivcsw);
89 else if (vflag)
90 printf("%.2fuser %.2fsystem %selapsed %.0f%%CPU "
91 "(%ldavgtext+%ldavgdata %ldmaxresident)k\n"
92 "%ldinputs+%ldoutputs "
93 "(%ldmajor+%ldminor)pagefaults %ldswaps\n",
94 usrtime, systime, ts, pct_cpu,
95 rusage.ru_ixrss, rusage.ru_idrss, rusage.ru_maxrss,
96 rusage.ru_inblock, rusage.ru_oublock,
97 rusage.ru_majflt, rusage.ru_minflt, rusage.ru_nswap);
98 else
99 printf("%.3fu %.3fs %s %.1f%%\t"
100 "%ld+%ldk %ld+%ldio %ldpf+%ldw\n",
101 usrtime, systime, ts, pct_cpu,
102 rusage.ru_maxrss, rusage.ru_ixrss,
103 rusage.ru_inblock, rusage.ru_oublock,
104 rusage.ru_majflt, rusage.ru_nswap);
105 return 0;
106 }
107
108 void
109 getrusage_init(void)
110 {
111 getrusage_cmd.name = "getrusage";
112 getrusage_cmd.altname = "g";
113 getrusage_cmd.argmin = 0;
114 getrusage_cmd.argmax = -1;
115 getrusage_cmd.cfunc = getrusage_f;
116 getrusage_cmd.flags = CMD_NOFILE_OK | CMD_NOMAP_OK | CMD_FOREIGN_OK;
117 getrusage_cmd.oneline = _("report process resource usage");
118
119 if (expert)
120 add_command(&getrusage_cmd);
121 }