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.5
Committed: Tue May 21 16:47:12 2002 UTC (22 years, 6 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.4: +1 -0 lines
Log Message:
Added URL to GPL headers.

File Contents

# User Rev Content
1 tdb 1.4 /*
2     * i-scream central monitoring system
3 tdb 1.5 * http://www.i-scream.org.uk
4 tdb 1.4 * Copyright (C) 2000-2002 i-scream
5     *
6     * This program is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU General Public License
8     * as published by the Free Software Foundation; either version 2
9     * of the License, or (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19     */
20    
21 pajs 1.1 #include <stdio.h>
22     #include "ukcprog.h"
23     #include <unistd.h>
24     #ifdef SOLARIS
25     #include <kstat.h>
26     #include <sys/sysinfo.h>
27     #endif
28     #ifdef LINUX
29     #include <string.h>
30     #endif
31     #ifdef FREEBSD
32     #include <sys/types.h>
33     #include <sys/sysctl.h>
34     #endif
35    
36     #define WAIT_TIME_IN_SECS 1
37    
38     char *get_page_stats(){
39     char *xml_page_stats;
40     int swap_pageins;
41     int swap_pageouts;
42     #ifdef SOLARIS
43     kstat_ctl_t *kc;
44     kstat_t *ksp;
45     cpu_stat_t cs;
46     uint_t swapin, swapout;
47     #endif
48     #ifdef LINUX
49     FILE *f;
50     char *line;
51     long swapin[2], swapout[2];
52     #endif
53     #ifdef FREEBSD
54     size_t size;
55     long swapin[2], swapout[2];
56     #endif
57    
58    
59     #ifdef SOLARIS
60     if ((kc = kstat_open()) == NULL) {
61     errf("kstat_open failure (%m)");
62     return NULL;
63     }
64     for (ksp = kc->kc_chain; ksp!=NULL; ksp = ksp->ks_next) {
65     if ((strcmp(ksp->ks_module, "cpu_stat")) != 0) continue;
66     if (kstat_read(kc, ksp, &cs) == -1) {
67     errf("kstat read failure");
68     continue;
69     }
70     }
71    
72     swapin=cs.cpu_vminfo.pgswapin;
73     swapout=cs.cpu_vminfo.pgswapout;
74    
75     sleep(WAIT_TIME_IN_SECS);
76    
77     if (kstat_chain_update(kc) == -1) {
78     errf("Kstat update failure (%m)");
79     return NULL;
80     }
81     for (ksp = kc->kc_chain; ksp!=NULL; ksp = ksp->ks_next) {
82     if ((strcmp(ksp->ks_module, "cpu_stat")) != 0) continue;
83     if (kstat_read(kc, ksp, &cs) == -1) {
84     errf("kstat read failure");
85     continue;
86     }
87     }
88 pajs 1.3 if((kstat_close(kc)) != 0){
89     errf("Failed to close kstat control structure (%m)");
90     return NULL;
91     }
92 pajs 1.1 swap_pageins=(cs.cpu_vminfo.pgswapin-swapin)/WAIT_TIME_IN_SECS;
93     swap_pageouts=(cs.cpu_vminfo.pgswapout-swapout)/WAIT_TIME_IN_SECS;
94     #endif
95     #ifdef LINUX
96     if ((f=fopen("/proc/stat", "r" ))==NULL) {
97     errf("Failed to open /proc/stat (%m)");
98     return NULL;
99     }
100     while((line=fpgetline(f)) != NULL){
101     if (((strncmp(line,"swap",4)) == 0)) {
102     if((sscanf(line, "%*s %ld %ld", &swapin[0], &swapout[0])) != 2){
103     errf("Failed to read swap paging details (%m)");
104     return NULL;
105     }
106     break;
107     }
108     }
109     if ((fclose(f)) != 0) {
110     errf("Failed to close file (%m)");
111     return NULL;
112     }
113     sleep(WAIT_TIME_IN_SECS);
114    
115     if ((f=fopen("/proc/stat", "r" ))==NULL) {
116     errf("Failed to open /proc/stat (%m)");
117     return NULL;
118     }
119     while((line=fpgetline(f)) != NULL){
120     if (((strncmp(line,"swap",4)) == 0)) {
121     if((sscanf(line, "%*s %ld %ld", &swapin[1], &swapout[1])) != 2){
122     errf("Failed to read swap paging details (%m)");
123     return NULL;
124     }
125     break;
126     }
127     }
128     if ((fclose(f)) != 0) {
129     errf("Failed to close file (%m)");
130     return NULL;
131     }
132    
133     swap_pageins=(swapin[1]-swapin[0])/WAIT_TIME_IN_SECS;
134     swap_pageouts=(swapout[1]-swapout[0])/WAIT_TIME_IN_SECS;
135     #endif
136     #ifdef FREEBSD
137     #define SWAP_IN_NAME "vm.stats.vm.v_swappgsin"
138     #define SWAP_OUT_NAME "vm.stats.vm.v_swappgsout"
139     if (sysctlbyname(SWAP_IN_NAME, NULL, &size, NULL, NULL) < 0){
140     errf("sysctlbyname failed to get total memory (%m)");
141     return NULL;
142     }
143     if (sysctlbyname(SWAP_IN_NAME, &swapin[0], &size, NULL, NULL) < 0){
144     errf("Failed to get total memory stats (%m)");
145     return NULL;
146     }
147     if (sysctlbyname(SWAP_OUT_NAME, NULL, &size, NULL, NULL) < 0){
148     errf("sysctlbyname failed to get total memory (%m)");
149     return NULL;
150     }
151     if (sysctlbyname(SWAP_OUT_NAME, &swapout[0], &size, NULL, NULL) < 0){
152     errf("Failed to get total memory stats (%m)");
153     return NULL;
154     }
155    
156     sleep(WAIT_TIME_IN_SECS);
157    
158     if (sysctlbyname(SWAP_IN_NAME, NULL, &size, NULL, NULL) < 0){
159     errf("sysctlbyname failed to get total memory (%m)");
160     return NULL;
161     }
162     if (sysctlbyname(SWAP_IN_NAME, &swapin[1], &size, NULL, NULL) < 0){
163     errf("Failed to get total memory stats (%m)");
164     return NULL;
165     }
166     if (sysctlbyname(SWAP_OUT_NAME, NULL, &size, NULL, NULL) < 0){
167     errf("sysctlbyname failed to get total memory (%m)");
168     return NULL;
169     }
170     if (sysctlbyname(SWAP_OUT_NAME, &swapout[1], &size, NULL, NULL) < 0){
171     errf("Failed to get total memory stats (%m)");
172     return NULL;
173     }
174    
175     swap_pageins=(swapin[1]-swapin[0])/WAIT_TIME_IN_SECS;
176     swap_pageouts=(swapout[1]-swapout[0])/WAIT_TIME_IN_SECS;
177    
178     #endif
179    
180    
181     if((xml_page_stats=strf("<pages><swapins>%d</swapins><swapouts>%d</swapouts></pages>", swap_pageins, swap_pageouts)) == NULL){
182     errf("strf failed (%m)");
183     return NULL;
184     }
185     return xml_page_stats;
186     }