ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/page_stats.c
Revision: 1.21
Committed: Wed Apr 7 21:08:40 2004 UTC (20 years, 1 month ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: LIBSTATGRAB_0_10
Changes since 1.20: +7 -1 lines
Log Message:
The rest of the error handling stuff (except the vector code).

I've been extremely unimaginative with the string names in error.c, but
they're all in one place so much easier to tidy up. I'm also beginning to
wonder if we actually needed an SG_ERROR_SYSTEM_CALL to indicate some call
into the system failed - because the majority of our errors are those :-)

Still to do, then:
 - vector code
 - better string names in error.c
 - deal with arg string in some way
 - make use of the error status in statgrab/saidar/examples

File Contents

# Content
1 /*
2 * i-scream libstatgrab
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.20 2004/04/07 14:53:40 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 #if defined(FREEBSD) || defined(DFBSD)
41 #include <sys/types.h>
42 #include <sys/sysctl.h>
43 #endif
44 #if defined(NETBSD) || defined(OPENBSD)
45 #include <sys/param.h>
46 #include <uvm/uvm.h>
47 #endif
48
49 static sg_page_stats page_stats;
50 static int page_stats_uninit=1;
51
52 sg_page_stats *sg_get_page_stats(){
53 #ifdef SOLARIS
54 kstat_ctl_t *kc;
55 kstat_t *ksp;
56 cpu_stat_t cs;
57 #endif
58 #if defined(LINUX) || defined(CYGWIN)
59 FILE *f;
60 char *line_ptr;
61 #endif
62 #if defined(FREEBSD) || defined(DFBSD)
63 size_t size;
64 #endif
65 #if defined(NETBSD) || defined(OPENBSD)
66 struct uvmexp *uvm;
67 #endif
68
69 page_stats.systime = time(NULL);
70 page_stats.pages_pagein=0;
71 page_stats.pages_pageout=0;
72
73 #ifdef SOLARIS
74 if ((kc = kstat_open()) == NULL) {
75 sg_set_error(SG_ERROR_KSTAT_OPEN, NULL);
76 return NULL;
77 }
78 for (ksp = kc->kc_chain; ksp!=NULL; ksp = ksp->ks_next) {
79 if ((strcmp(ksp->ks_module, "cpu_stat")) != 0) continue;
80 if (kstat_read(kc, ksp, &cs) == -1) {
81 continue;
82 }
83
84 page_stats.pages_pagein+=(long long)cs.cpu_vminfo.pgpgin;
85 page_stats.pages_pageout+=(long long)cs.cpu_vminfo.pgpgout;
86 }
87
88 kstat_close(kc);
89 #endif
90 #if defined(LINUX) || defined(CYGWIN)
91 if ((f = fopen("/proc/vmstat", "r")) != NULL) {
92 while ((line_ptr = sg_f_read_line(f, "")) != NULL) {
93 long long value;
94
95 if (sscanf(line_ptr, "%*s %lld", &value) != 1) {
96 continue;
97 }
98
99 if (strncmp(line_ptr, "pgpgin ", 7) == 0) {
100 page_stats.pages_pagein = value;
101 } else if (strncmp(line_ptr, "pgpgout ", 8) == 0) {
102 page_stats.pages_pageout = value;
103 }
104 }
105
106 fclose(f);
107 } else if ((f = fopen("/proc/stat", "r")) != NULL) {
108 if ((line_ptr = sg_f_read_line(f, "page")) == NULL) {
109 sg_set_error(SG_ERROR_PARSE, "page");
110 fclose(f);
111 return NULL;
112 }
113
114 if (sscanf(line_ptr, "page %lld %lld", &page_stats.pages_pagein, &page_stats.pages_pageout) != 2) {
115 sg_set_error(SG_ERROR_PARSE, "page");
116 fclose(f);
117 return NULL;
118 }
119
120 fclose(f);
121 } else {
122 sg_set_error(SG_ERROR_OPEN, "/proc/stat");
123 return NULL;
124 }
125 #endif
126 #if defined(FREEBSD) || defined(DFBSD)
127 size = sizeof page_stats.pages_pagein;
128 if (sysctlbyname("vm.stats.vm.v_swappgsin", &page_stats.pages_pagein, &size, NULL, 0) < 0){
129 sg_set_error(SG_ERROR_SYSCTLBYNAME, "vm.stats.vm.v_swappgsin");
130 return NULL;
131 }
132 size = sizeof page_stats.pages_pageout;
133 if (sysctlbyname("vm.stats.vm.v_swappgsout", &page_stats.pages_pageout, &size, NULL, 0) < 0){
134 sg_set_error(SG_ERROR_SYSCTLBYNAME, "vm.stats.vm.v_swappgsout");
135 return NULL;
136 }
137 #endif
138 #if defined(NETBSD) || defined(OPENBSD)
139 if ((uvm = sg_get_uvmexp()) == NULL) {
140 return NULL;
141 }
142
143 page_stats.pages_pagein = uvm->pgswapin;
144 page_stats.pages_pageout = uvm->pgswapout;
145 #endif
146
147 return &page_stats;
148 }
149
150 sg_page_stats *sg_get_page_stats_diff(){
151 sg_page_stats *page_ptr;
152 static sg_page_stats page_stats_diff;
153
154 if(page_stats_uninit){
155 page_ptr=sg_get_page_stats();
156 if(page_ptr==NULL){
157 return NULL;
158 }
159 page_stats_uninit=0;
160 return page_ptr;
161 }
162
163 page_stats_diff.pages_pagein=page_stats.pages_pagein;
164 page_stats_diff.pages_pageout=page_stats.pages_pageout;
165 page_stats_diff.systime=page_stats.systime;
166
167 page_ptr=sg_get_page_stats();
168 if(page_ptr==NULL){
169 return NULL;
170 }
171
172 page_stats_diff.pages_pagein=page_stats.pages_pagein-page_stats_diff.pages_pagein;
173 page_stats_diff.pages_pageout=page_stats.pages_pageout-page_stats_diff.pages_pageout;
174 page_stats_diff.systime=page_stats.systime-page_stats_diff.systime;
175
176 return &page_stats_diff;
177 }