ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/ihost/libstatgrab/page_stats.c
Revision: 1.3
Committed: Thu May 16 17:02:43 2002 UTC (22 years, 4 months ago) by pajs
Content type: text/plain
Branch: MAIN
Changes since 1.2: +4 -1 lines
Log Message:
Fixed forgetting to close files and memory leaks

File Contents

# User Rev Content
1 pajs 1.1 #include <stdio.h>
2     #include "ukcprog.h"
3     #include <unistd.h>
4     #ifdef SOLARIS
5     #include <kstat.h>
6     #include <sys/sysinfo.h>
7     #endif
8     #ifdef LINUX
9     #include <string.h>
10     #endif
11     #ifdef FREEBSD
12     #include <sys/types.h>
13     #include <sys/sysctl.h>
14     #endif
15    
16     #define WAIT_TIME_IN_SECS 1
17    
18     char *get_page_stats(){
19     char *xml_page_stats;
20     int swap_pageins;
21     int swap_pageouts;
22     #ifdef SOLARIS
23     kstat_ctl_t *kc;
24     kstat_t *ksp;
25     cpu_stat_t cs;
26     uint_t swapin, swapout;
27     #endif
28     #ifdef LINUX
29     FILE *f;
30     char *line;
31     long swapin[2], swapout[2];
32     #endif
33     #ifdef FREEBSD
34     size_t size;
35     long swapin[2], swapout[2];
36     #endif
37    
38    
39     #ifdef SOLARIS
40     if ((kc = kstat_open()) == NULL) {
41     errf("kstat_open failure (%m)");
42     return NULL;
43     }
44     for (ksp = kc->kc_chain; ksp!=NULL; ksp = ksp->ks_next) {
45     if ((strcmp(ksp->ks_module, "cpu_stat")) != 0) continue;
46     if (kstat_read(kc, ksp, &cs) == -1) {
47     errf("kstat read failure");
48     continue;
49     }
50     }
51    
52     swapin=cs.cpu_vminfo.pgswapin;
53     swapout=cs.cpu_vminfo.pgswapout;
54    
55     sleep(WAIT_TIME_IN_SECS);
56    
57     if (kstat_chain_update(kc) == -1) {
58     errf("Kstat update failure (%m)");
59     return NULL;
60     }
61     for (ksp = kc->kc_chain; ksp!=NULL; ksp = ksp->ks_next) {
62     if ((strcmp(ksp->ks_module, "cpu_stat")) != 0) continue;
63     if (kstat_read(kc, ksp, &cs) == -1) {
64     errf("kstat read failure");
65     continue;
66     }
67     }
68 pajs 1.3 if((kstat_close(kc)) != 0){
69     errf("Failed to close kstat control structure (%m)");
70     return NULL;
71     }
72 pajs 1.1 swap_pageins=(cs.cpu_vminfo.pgswapin-swapin)/WAIT_TIME_IN_SECS;
73     swap_pageouts=(cs.cpu_vminfo.pgswapout-swapout)/WAIT_TIME_IN_SECS;
74     #endif
75     #ifdef LINUX
76     if ((f=fopen("/proc/stat", "r" ))==NULL) {
77     errf("Failed to open /proc/stat (%m)");
78     return NULL;
79     }
80     while((line=fpgetline(f)) != NULL){
81     if (((strncmp(line,"swap",4)) == 0)) {
82     if((sscanf(line, "%*s %ld %ld", &swapin[0], &swapout[0])) != 2){
83     errf("Failed to read swap paging details (%m)");
84     return NULL;
85     }
86     break;
87     }
88     }
89     if ((fclose(f)) != 0) {
90     errf("Failed to close file (%m)");
91     return NULL;
92     }
93     sleep(WAIT_TIME_IN_SECS);
94    
95     if ((f=fopen("/proc/stat", "r" ))==NULL) {
96     errf("Failed to open /proc/stat (%m)");
97     return NULL;
98     }
99     while((line=fpgetline(f)) != NULL){
100     if (((strncmp(line,"swap",4)) == 0)) {
101     if((sscanf(line, "%*s %ld %ld", &swapin[1], &swapout[1])) != 2){
102     errf("Failed to read swap paging details (%m)");
103     return NULL;
104     }
105     break;
106     }
107     }
108     if ((fclose(f)) != 0) {
109     errf("Failed to close file (%m)");
110     return NULL;
111     }
112    
113     swap_pageins=(swapin[1]-swapin[0])/WAIT_TIME_IN_SECS;
114     swap_pageouts=(swapout[1]-swapout[0])/WAIT_TIME_IN_SECS;
115     #endif
116     #ifdef FREEBSD
117     #define SWAP_IN_NAME "vm.stats.vm.v_swappgsin"
118     #define SWAP_OUT_NAME "vm.stats.vm.v_swappgsout"
119     if (sysctlbyname(SWAP_IN_NAME, NULL, &size, NULL, NULL) < 0){
120     errf("sysctlbyname failed to get total memory (%m)");
121     return NULL;
122     }
123     if (sysctlbyname(SWAP_IN_NAME, &swapin[0], &size, NULL, NULL) < 0){
124     errf("Failed to get total memory stats (%m)");
125     return NULL;
126     }
127     if (sysctlbyname(SWAP_OUT_NAME, NULL, &size, NULL, NULL) < 0){
128     errf("sysctlbyname failed to get total memory (%m)");
129     return NULL;
130     }
131     if (sysctlbyname(SWAP_OUT_NAME, &swapout[0], &size, NULL, NULL) < 0){
132     errf("Failed to get total memory stats (%m)");
133     return NULL;
134     }
135    
136     sleep(WAIT_TIME_IN_SECS);
137    
138     if (sysctlbyname(SWAP_IN_NAME, NULL, &size, NULL, NULL) < 0){
139     errf("sysctlbyname failed to get total memory (%m)");
140     return NULL;
141     }
142     if (sysctlbyname(SWAP_IN_NAME, &swapin[1], &size, NULL, NULL) < 0){
143     errf("Failed to get total memory stats (%m)");
144     return NULL;
145     }
146     if (sysctlbyname(SWAP_OUT_NAME, NULL, &size, NULL, NULL) < 0){
147     errf("sysctlbyname failed to get total memory (%m)");
148     return NULL;
149     }
150     if (sysctlbyname(SWAP_OUT_NAME, &swapout[1], &size, NULL, NULL) < 0){
151     errf("Failed to get total memory stats (%m)");
152     return NULL;
153     }
154    
155     swap_pageins=(swapin[1]-swapin[0])/WAIT_TIME_IN_SECS;
156     swap_pageouts=(swapout[1]-swapout[0])/WAIT_TIME_IN_SECS;
157    
158     #endif
159    
160    
161     if((xml_page_stats=strf("<pages><swapins>%d</swapins><swapouts>%d</swapouts></pages>", swap_pageins, swap_pageouts)) == NULL){
162     errf("strf failed (%m)");
163     return NULL;
164     }
165     return xml_page_stats;
166     }