ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/page_stats.c
Revision: 1.15
Committed: Thu Feb 12 23:04:52 2004 UTC (20 years, 3 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.14: +35 -2 lines
Log Message:
Add preliminary support for OpenBSD (tested on 3.3).

All works apart from Disk IO stats - currently the disks are not named
correctly. The fix for this is probably to use KVM.

Mostly similar to the NetBSD code, the notable exception being the uvm
stuff. In NetBSD there's a function to get it, in OpenBSD sysctl is needed
to get hold of it.

File Contents

# User Rev Content
1 tdb 1.13 /*
2 pajs 1.1 * i-scream central monitoring system
3 tdb 1.6 * http://www.i-scream.org
4 tdb 1.13 * Copyright (C) 2000-2004 i-scream
5 pajs 1.1 *
6 tdb 1.13 * This library is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU Lesser General Public
8     * License as published by the Free Software Foundation; either
9     * version 2.1 of the License, or (at your option) any later version.
10 pajs 1.1 *
11 tdb 1.13 * This library is distributed in the hope that it will be useful,
12 pajs 1.1 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 tdb 1.13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14     * Lesser General Public License for more details.
15 pajs 1.1 *
16 tdb 1.13 * You should have received a copy of the GNU Lesser General Public
17     * License along with this library; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19     * 02111-1307 USA
20 tdb 1.14 *
21 tdb 1.15 * $Id: page_stats.c,v 1.14 2004/01/19 16:49:21 tdb Exp $
22 pajs 1.1 */
23    
24     #ifdef HAVE_CONFIG_H
25     #include "config.h"
26     #endif
27    
28 pajs 1.2 #include "statgrab.h"
29 ats 1.9 #include "tools.h"
30 pajs 1.4 #include <time.h>
31 pajs 1.1 #ifdef SOLARIS
32     #include <kstat.h>
33     #include <sys/sysinfo.h>
34 pajs 1.2 #include <string.h>
35 pajs 1.1 #endif
36 ats 1.11 #if defined(LINUX) || defined(CYGWIN)
37 pajs 1.4 #include <stdio.h>
38 ats 1.10 #include <string.h>
39 pajs 1.4 #endif
40 pajs 1.5 #ifdef FREEBSD
41     #include <sys/types.h>
42     #include <sys/sysctl.h>
43     #endif
44 tdb 1.15 #ifdef OPENBSD
45     #include <stdlib.h>
46     #include <sys/param.h>
47     #include <sys/sysctl.h>
48     #include <uvm/uvm.h>
49     #endif
50 pajs 1.3
51     static page_stat_t page_stats;
52     static int page_stats_uninit=1;
53    
54 pajs 1.1 page_stat_t *get_page_stats(){
55 pajs 1.4 #ifdef SOLARIS
56 pajs 1.1 kstat_ctl_t *kc;
57     kstat_t *ksp;
58     cpu_stat_t cs;
59 pajs 1.4 #endif
60 ats 1.11 #if defined(LINUX) || defined(CYGWIN)
61 pajs 1.4 FILE *f;
62     char *line_ptr;
63     #endif
64 pajs 1.5 #ifdef FREEBSD
65     size_t size;
66     #endif
67 tdb 1.15 #if defined(NETBSD) || defined(OPENBSD)
68 ats 1.9 struct uvmexp *uvm;
69     #endif
70 tdb 1.15 #ifdef OPENBSD
71     int mib[2];
72     size_t size;
73     #endif
74 pajs 1.2
75 ats 1.9 page_stats.systime = time(NULL);
76 pajs 1.2 page_stats.pages_pagein=0;
77     page_stats.pages_pageout=0;
78 pajs 1.1
79 pajs 1.4 #ifdef SOLARIS
80 pajs 1.1 if ((kc = kstat_open()) == NULL) {
81     return NULL;
82     }
83     for (ksp = kc->kc_chain; ksp!=NULL; ksp = ksp->ks_next) {
84     if ((strcmp(ksp->ks_module, "cpu_stat")) != 0) continue;
85     if (kstat_read(kc, ksp, &cs) == -1) {
86     continue;
87     }
88    
89 pajs 1.2 page_stats.pages_pagein+=(long long)cs.cpu_vminfo.pgpgin;
90     page_stats.pages_pageout+=(long long)cs.cpu_vminfo.pgpgout;
91     }
92    
93     kstat_close(kc);
94 pajs 1.4 #endif
95 ats 1.11 #if defined(LINUX) || defined(CYGWIN)
96 ats 1.10 if ((f = fopen("/proc/vmstat", "r")) != NULL) {
97     while ((line_ptr = f_read_line(f, "")) != NULL) {
98     long long value;
99    
100     if (sscanf(line_ptr, "%*s %lld", &value) != 1) {
101     continue;
102     }
103    
104     if (strncmp(line_ptr, "pgpgin ", 7) == 0) {
105     page_stats.pages_pagein = value;
106     } else if (strncmp(line_ptr, "pgpgout ", 8) == 0) {
107     page_stats.pages_pageout = value;
108     }
109     }
110    
111     fclose(f);
112     } else if ((f = fopen("/proc/stat", "r")) != NULL) {
113     if ((line_ptr = f_read_line(f, "page")) == NULL) {
114     fclose(f);
115     return NULL;
116     }
117    
118     if (sscanf(line_ptr, "page %lld %lld", &page_stats.pages_pagein, &page_stats.pages_pageout) != 2) {
119 pajs 1.12 fclose(f);
120 ats 1.10 return NULL;
121     }
122    
123 pajs 1.4 fclose(f);
124 ats 1.10 } else {
125 pajs 1.4 return NULL;
126     }
127 pajs 1.5 #endif
128     #ifdef FREEBSD
129 ats 1.8 size = sizeof page_stats.pages_pagein;
130 ats 1.7 if (sysctlbyname("vm.stats.vm.v_swappgsin", &page_stats.pages_pagein, &size, NULL, 0) < 0){
131 pajs 1.5 return NULL;
132     }
133 ats 1.8 size = sizeof page_stats.pages_pageout;
134 ats 1.7 if (sysctlbyname("vm.stats.vm.v_swappgsout", &page_stats.pages_pageout, &size, NULL, 0) < 0){
135 pajs 1.5 return NULL;
136     }
137 ats 1.9 #endif
138     #ifdef NETBSD
139     if ((uvm = get_uvmexp()) == NULL) {
140     return NULL;
141     }
142 tdb 1.15 #endif
143     #ifdef OPENBSD
144     mib[0] = CTL_VM;
145     mib[1] = VM_UVMEXP;
146    
147     if (sysctl(mib, 2, NULL, &size, NULL, 0) < 0) {
148     return NULL;
149     }
150    
151     uvm = malloc(size);
152     if (uvm == NULL) {
153     return NULL;
154     }
155    
156     if (sysctl(mib, 2, uvm, &size, NULL, 0) < 0) {
157     return NULL;
158     }
159     #endif
160     #if defined(NETBSD) || defined(OPENBSD)
161 ats 1.9 page_stats.pages_pagein = uvm->pgswapin;
162     page_stats.pages_pageout = uvm->pgswapout;
163 tdb 1.15 #endif
164    
165     #ifdef OPENBSD
166     free(uvm);
167 pajs 1.4 #endif
168 pajs 1.1
169 pajs 1.2 return &page_stats;
170 pajs 1.3 }
171    
172     page_stat_t *get_page_stats_diff(){
173     page_stat_t *page_ptr;
174     static page_stat_t page_stats_diff;
175    
176     if(page_stats_uninit){
177     page_ptr=get_page_stats();
178     if(page_ptr==NULL){
179     return NULL;
180     }
181     page_stats_uninit=0;
182     return page_ptr;
183     }
184    
185     page_stats_diff.pages_pagein=page_stats.pages_pagein;
186     page_stats_diff.pages_pageout=page_stats.pages_pageout;
187     page_stats_diff.systime=page_stats.systime;
188    
189     page_ptr=get_page_stats();
190     if(page_ptr==NULL){
191     return NULL;
192     }
193    
194     page_stats_diff.pages_pagein=page_stats.pages_pagein-page_stats_diff.pages_pagein;
195     page_stats_diff.pages_pageout=page_stats.pages_pageout-page_stats_diff.pages_pageout;
196     page_stats_diff.systime=page_stats.systime-page_stats_diff.systime;
197    
198     return &page_stats_diff;
199 pajs 1.1 }