xref: /aosp_15_r20/system/extras/pssbench/main.cpp (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker #include <stdio.h>
2*288bf522SAndroid Build Coastguard Worker #include <inttypes.h>
3*288bf522SAndroid Build Coastguard Worker #include <stdint.h>
4*288bf522SAndroid Build Coastguard Worker #include <stdlib.h>
5*288bf522SAndroid Build Coastguard Worker #include <getopt.h>
6*288bf522SAndroid Build Coastguard Worker #include <string.h>
7*288bf522SAndroid Build Coastguard Worker #include <errno.h>
8*288bf522SAndroid Build Coastguard Worker 
9*288bf522SAndroid Build Coastguard Worker const char* smaps_file = "smaps";
10*288bf522SAndroid Build Coastguard Worker bool verbose = false;
11*288bf522SAndroid Build Coastguard Worker int iterations = 1;
12*288bf522SAndroid Build Coastguard Worker int bufsz = -1;
13*288bf522SAndroid Build Coastguard Worker 
14*288bf522SAndroid Build Coastguard Worker int64_t
get_pss(int pid)15*288bf522SAndroid Build Coastguard Worker get_pss(int pid)
16*288bf522SAndroid Build Coastguard Worker {
17*288bf522SAndroid Build Coastguard Worker   char filename[64];
18*288bf522SAndroid Build Coastguard Worker   snprintf(filename, sizeof(filename), "/proc/%" PRId32 "/%s", pid,
19*288bf522SAndroid Build Coastguard Worker            smaps_file);
20*288bf522SAndroid Build Coastguard Worker   if (verbose)
21*288bf522SAndroid Build Coastguard Worker     fprintf(stderr, "smaps:[%s]\n", filename);
22*288bf522SAndroid Build Coastguard Worker 
23*288bf522SAndroid Build Coastguard Worker   FILE * file = fopen(filename, "r");
24*288bf522SAndroid Build Coastguard Worker   if (!file) {
25*288bf522SAndroid Build Coastguard Worker     return (int64_t) -1;
26*288bf522SAndroid Build Coastguard Worker   }
27*288bf522SAndroid Build Coastguard Worker 
28*288bf522SAndroid Build Coastguard Worker   if (bufsz >= 0) {
29*288bf522SAndroid Build Coastguard Worker     if (setvbuf(file, NULL, _IOFBF, bufsz)) {
30*288bf522SAndroid Build Coastguard Worker       fprintf(stderr, "setvbuf failed: %s\n", strerror(errno));
31*288bf522SAndroid Build Coastguard Worker       exit(1);
32*288bf522SAndroid Build Coastguard Worker     }
33*288bf522SAndroid Build Coastguard Worker   }
34*288bf522SAndroid Build Coastguard Worker 
35*288bf522SAndroid Build Coastguard Worker   // Tally up all of the Pss from the various maps
36*288bf522SAndroid Build Coastguard Worker   char line[256];
37*288bf522SAndroid Build Coastguard Worker   int64_t pss = 0;
38*288bf522SAndroid Build Coastguard Worker   while (fgets(line, sizeof(line), file)) {
39*288bf522SAndroid Build Coastguard Worker     int64_t v;
40*288bf522SAndroid Build Coastguard Worker     if (sscanf(line, "Pss: %" SCNd64 " kB", &v) == 1) {
41*288bf522SAndroid Build Coastguard Worker       if (verbose)
42*288bf522SAndroid Build Coastguard Worker         fprintf(stderr, "pss line: %llu\n", (unsigned long long) v);
43*288bf522SAndroid Build Coastguard Worker       pss += v;
44*288bf522SAndroid Build Coastguard Worker     }
45*288bf522SAndroid Build Coastguard Worker   }
46*288bf522SAndroid Build Coastguard Worker 
47*288bf522SAndroid Build Coastguard Worker   fclose(file);
48*288bf522SAndroid Build Coastguard Worker 
49*288bf522SAndroid Build Coastguard Worker   // Return the Pss value in bytes, not kilobytes
50*288bf522SAndroid Build Coastguard Worker   return pss * 1024;
51*288bf522SAndroid Build Coastguard Worker }
52*288bf522SAndroid Build Coastguard Worker 
53*288bf522SAndroid Build Coastguard Worker int
main(int argc,char ** argv)54*288bf522SAndroid Build Coastguard Worker main(int argc, char** argv)
55*288bf522SAndroid Build Coastguard Worker {
56*288bf522SAndroid Build Coastguard Worker   int c;
57*288bf522SAndroid Build Coastguard Worker   while ((c = getopt(argc, argv, "n:rvb:")) != -1) {
58*288bf522SAndroid Build Coastguard Worker     switch (c) {
59*288bf522SAndroid Build Coastguard Worker       case 'r':
60*288bf522SAndroid Build Coastguard Worker         smaps_file = "smaps_rollup";
61*288bf522SAndroid Build Coastguard Worker         break;
62*288bf522SAndroid Build Coastguard Worker       case 'v':
63*288bf522SAndroid Build Coastguard Worker         verbose = true;
64*288bf522SAndroid Build Coastguard Worker         break;
65*288bf522SAndroid Build Coastguard Worker       case 'n':
66*288bf522SAndroid Build Coastguard Worker         iterations = atoi(optarg);
67*288bf522SAndroid Build Coastguard Worker         break;
68*288bf522SAndroid Build Coastguard Worker       case 'b':
69*288bf522SAndroid Build Coastguard Worker         bufsz = atoi(optarg);
70*288bf522SAndroid Build Coastguard Worker         break;
71*288bf522SAndroid Build Coastguard Worker       default:
72*288bf522SAndroid Build Coastguard Worker         return 1;
73*288bf522SAndroid Build Coastguard Worker     }
74*288bf522SAndroid Build Coastguard Worker   }
75*288bf522SAndroid Build Coastguard Worker 
76*288bf522SAndroid Build Coastguard Worker   if (argv[optind] == NULL) {
77*288bf522SAndroid Build Coastguard Worker     fprintf(stderr, "pssbench: no PID given\n");
78*288bf522SAndroid Build Coastguard Worker     return 1;
79*288bf522SAndroid Build Coastguard Worker   }
80*288bf522SAndroid Build Coastguard Worker   int pid = atoi(argv[optind]);
81*288bf522SAndroid Build Coastguard Worker   int64_t pss = 0;
82*288bf522SAndroid Build Coastguard Worker   for (int i = 0; i < iterations; ++i)
83*288bf522SAndroid Build Coastguard Worker     pss = get_pss(pid);
84*288bf522SAndroid Build Coastguard Worker   fflush(NULL);
85*288bf522SAndroid Build Coastguard Worker 
86*288bf522SAndroid Build Coastguard Worker   printf("iterations:%d pid:%d pss:%lld\n", iterations, pid, (long long)pss);
87*288bf522SAndroid Build Coastguard Worker   return 0;
88*288bf522SAndroid Build Coastguard Worker }
89