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

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org
4 * Copyright (C) 2000-2004 i-scream
5 *
6 * 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 *
11 * This library 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 GNU
14 * Lesser General Public License for more details.
15 *
16 * 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 *
21 * $Id: page_stats.c,v 1.14 2004/01/19 16:49:21 tdb Exp $
22 */
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include "statgrab.h"
29 #include "tools.h"
30 #include <time.h>
31 #ifdef SOLARIS
32 #include <kstat.h>
33 #include <sys/sysinfo.h>
34 #include <string.h>
35 #endif
36 #if defined(LINUX) || defined(CYGWIN)
37 #include <stdio.h>
38 #include <string.h>
39 #endif
40 #ifdef FREEBSD
41 #include <sys/types.h>
42 #include <sys/sysctl.h>
43 #endif
44 #ifdef OPENBSD
45 #include <stdlib.h>
46 #include <sys/param.h>
47 #include <sys/sysctl.h>
48 #include <uvm/uvm.h>
49 #endif
50
51 static page_stat_t page_stats;
52 static int page_stats_uninit=1;
53
54 page_stat_t *get_page_stats(){
55 #ifdef SOLARIS
56 kstat_ctl_t *kc;
57 kstat_t *ksp;
58 cpu_stat_t cs;
59 #endif
60 #if defined(LINUX) || defined(CYGWIN)
61 FILE *f;
62 char *line_ptr;
63 #endif
64 #ifdef FREEBSD
65 size_t size;
66 #endif
67 #if defined(NETBSD) || defined(OPENBSD)
68 struct uvmexp *uvm;
69 #endif
70 #ifdef OPENBSD
71 int mib[2];
72 size_t size;
73 #endif
74
75 page_stats.systime = time(NULL);
76 page_stats.pages_pagein=0;
77 page_stats.pages_pageout=0;
78
79 #ifdef SOLARIS
80 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 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 #endif
95 #if defined(LINUX) || defined(CYGWIN)
96 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 fclose(f);
120 return NULL;
121 }
122
123 fclose(f);
124 } else {
125 return NULL;
126 }
127 #endif
128 #ifdef FREEBSD
129 size = sizeof page_stats.pages_pagein;
130 if (sysctlbyname("vm.stats.vm.v_swappgsin", &page_stats.pages_pagein, &size, NULL, 0) < 0){
131 return NULL;
132 }
133 size = sizeof page_stats.pages_pageout;
134 if (sysctlbyname("vm.stats.vm.v_swappgsout", &page_stats.pages_pageout, &size, NULL, 0) < 0){
135 return NULL;
136 }
137 #endif
138 #ifdef NETBSD
139 if ((uvm = get_uvmexp()) == NULL) {
140 return NULL;
141 }
142 #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 page_stats.pages_pagein = uvm->pgswapin;
162 page_stats.pages_pageout = uvm->pgswapout;
163 #endif
164
165 #ifdef OPENBSD
166 free(uvm);
167 #endif
168
169 return &page_stats;
170 }
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 }