]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - io/getrusage.c
Update copyright/license notices to match SGI legal prefered boilerplate.
[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 <xfs/libxfs.h>
20 #include <xfs/command.h>
21 #include <xfs/input.h>
22 #include <sys/time.h>
23 #include <sys/resource.h>
24 #include "init.h"
25
26 static cmdinfo_t getrusage_cmd;
27
28 /*
29 * Report process resource utilisation. Formatting options:
30 * "Shell" format: 0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 0pf+0w
31 * Verbose format:
32 * 0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k
33 * 0inputs+0outputs (0major+0minor)pagefaults 0swaps
34 * Comma Separated Value format: 0.000,0.000,00:00:00.00,0.0,0,0,0,0,0,0
35 */
36 static int
37 getrusage_f(
38 int argc,
39 char **argv)
40 {
41 struct timeval wallclk, timenow;
42 struct rusage rusage;
43 double usrtime, systime, elapsed, pct_cpu;
44 char ts[64];
45 int Cflag, vflag;
46 int c;
47
48 Cflag = vflag = 0;
49 while ((c = getopt(argc, argv, "Cv")) != EOF) {
50 switch (c) {
51 case 'C':
52 Cflag = 1;
53 break;
54 case 'v':
55 vflag = 1;
56 break;
57 default:
58 return command_usage(&getrusage_cmd);
59 }
60 }
61 if (optind != argc)
62 return command_usage(&getrusage_cmd);
63
64 if (getrusage(RUSAGE_SELF, &rusage) < 0) {
65 perror("getrusage");
66 return 0;
67 }
68
69 gettimeofday(&timenow, NULL);
70 wallclk = tsub(timenow, stopwatch);
71 elapsed = (double)wallclk.tv_sec +
72 ((double)wallclk.tv_usec / 1000000.0);
73 usrtime = (double)rusage.ru_utime.tv_sec +
74 ((double)rusage.ru_utime.tv_usec / 1000000.0);
75 systime = (double)rusage.ru_stime.tv_sec +
76 ((double)rusage.ru_stime.tv_usec / 1000000.0);
77 if (elapsed < usrtime + systime)
78 pct_cpu = 100.0;
79 else
80 pct_cpu = ((usrtime + systime) / elapsed) * 100;
81 c = Cflag ? VERBOSE_FIXED_TIME : TERSE_FIXED_TIME;
82 timestr(&wallclk, ts, sizeof(ts), c);
83
84 if (Cflag)
85 printf("%.3f,%.3f,%s,%.1f,%ld,%ld,%ld,%ld,%ld,%ld,%ld\n",
86 usrtime, systime, ts, pct_cpu,
87 rusage.ru_majflt, rusage.ru_minflt, rusage.ru_nswap,
88 rusage.ru_inblock, rusage.ru_oublock,
89 rusage.ru_nvcsw, rusage.ru_nivcsw);
90 else if (vflag)
91 printf("%.2fuser %.2fsystem %selapsed %.0f%%CPU "
92 "(%ldavgtext+%ldavgdata %ldmaxresident)k\n"
93 "%ldinputs+%ldoutputs "
94 "(%ldmajor+%ldminor)pagefaults %ldswaps\n",
95 usrtime, systime, ts, pct_cpu,
96 rusage.ru_ixrss, rusage.ru_idrss, rusage.ru_maxrss,
97 rusage.ru_inblock, rusage.ru_oublock,
98 rusage.ru_majflt, rusage.ru_minflt, rusage.ru_nswap);
99 else
100 printf("%.3fu %.3fs %s %.1f%%\t"
101 "%ld+%ldk %ld+%ldio %ldpf+%ldw\n",
102 usrtime, systime, ts, pct_cpu,
103 rusage.ru_maxrss, rusage.ru_ixrss,
104 rusage.ru_inblock, rusage.ru_oublock,
105 rusage.ru_majflt, rusage.ru_nswap);
106 return 0;
107 }
108
109 void
110 getrusage_init(void)
111 {
112 getrusage_cmd.name = _("getrusage");
113 getrusage_cmd.altname = _("g");
114 getrusage_cmd.argmin = 0;
115 getrusage_cmd.argmax = -1;
116 getrusage_cmd.cfunc = getrusage_f;
117 getrusage_cmd.flags = CMD_NOFILE_OK | CMD_NOMAP_OK | CMD_FOREIGN_OK;
118 getrusage_cmd.oneline = _("report process resource usage");
119
120 if (expert)
121 add_command(&getrusage_cmd);
122 }