1 /*
2 * Copyright 2008, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7 #include <getopt.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 #include <system_info.h>
13
14
15 static struct option const kLongOptions[] = {
16 {"periodic", no_argument, 0, 'p'},
17 {"rate", required_argument, 0, 'r'},
18 {"help", no_argument, 0, 'h'},
19 {NULL}
20 };
21
22 extern const char *__progname;
23 static const char *kProgramName = __progname;
24
25
26 void
usage(int status)27 usage(int status)
28 {
29 fprintf(stderr, "usage: %s [-p] [-r <time>]\n"
30 " -p,--periodic\tDumps changes periodically every second.\n"
31 " -r,--rate\tDumps changes periodically every <time> milli seconds.\n",
32 kProgramName);
33
34 exit(status);
35 }
36
37
38 int
main(int argc,char ** argv)39 main(int argc, char** argv)
40 {
41 bool periodically = false;
42 bigtime_t rate = 1000000LL;
43
44 int c;
45 while ((c = getopt_long(argc, argv, "pr:h", kLongOptions, NULL)) != -1) {
46 switch (c) {
47 case 0:
48 break;
49 case 'p':
50 periodically = true;
51 break;
52 case 'r':
53 rate = atoi(optarg) * 1000LL;
54 if (rate <= 0) {
55 fprintf(stderr, "%s: Invalid rate: %s\n",
56 kProgramName, optarg);
57 return 1;
58 }
59 periodically = true;
60 break;
61 case 'h':
62 usage(0);
63 break;
64 default:
65 usage(1);
66 break;
67 }
68 }
69 system_info info;
70 status_t status = get_system_info(&info);
71 if (status != B_OK) {
72 fprintf(stderr, "%s: cannot get system info: %s\n", kProgramName,
73 strerror(status));
74 return 1;
75 }
76
77 printf("max memory:\t\t%" B_PRIu64 "\n", info.max_pages * B_PAGE_SIZE);
78 printf("free memory:\t\t%" B_PRIu64 "\n", info.free_memory);
79 printf("needed memory:\t\t%" B_PRIu64 "\n", info.needed_memory);
80 printf("block cache memory:\t%" B_PRIu64 "\n",
81 info.block_cache_pages * B_PAGE_SIZE);
82 printf("max swap space:\t\t%" B_PRIu64 "\n",
83 info.max_swap_pages * B_PAGE_SIZE);
84 printf("free swap space:\t%" B_PRIu64 "\n",
85 info.free_swap_pages * B_PAGE_SIZE);
86 printf("page faults:\t\t%" B_PRIu32 "\n", info.page_faults);
87
88 if (periodically) {
89 puts("\npage faults used memory used swap block cache");
90 system_info lastInfo = info;
91
92 while (true) {
93 snooze(rate);
94
95 get_system_info(&info);
96
97 int32 pageFaults = info.page_faults - lastInfo.page_faults;
98 int64 usedMemory
99 = (info.max_pages * B_PAGE_SIZE - info.free_memory)
100 - (lastInfo.max_pages * B_PAGE_SIZE - lastInfo.free_memory);
101 int64 usedSwap
102 = ((info.max_swap_pages - info.free_swap_pages)
103 - (lastInfo.max_swap_pages - lastInfo.free_swap_pages))
104 * B_PAGE_SIZE;
105 int64 blockCache
106 = (info.block_cache_pages - lastInfo.block_cache_pages)
107 * B_PAGE_SIZE;
108 printf("%11" B_PRId32 " %11" B_PRId64 " %11" B_PRId64 " %11"
109 B_PRId64 "\n", pageFaults, usedMemory, usedSwap, blockCache);
110
111 lastInfo = info;
112 }
113 }
114
115 return 0;
116 }
117