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

# User Rev Content
1 tdb 1.13 /*
2 tdb 1.19 * i-scream libstatgrab
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.21 * $Id: page_stats.c,v 1.20 2004/04/07 14:53:40 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 tdb 1.17 #if defined(FREEBSD) || defined(DFBSD)
41 pajs 1.5 #include <sys/types.h>
42     #include <sys/sysctl.h>
43     #endif
44 tdb 1.16 #if defined(NETBSD) || defined(OPENBSD)
45 tdb 1.15 #include <sys/param.h>
46     #include <uvm/uvm.h>
47     #endif
48 pajs 1.3
49 ats 1.18 static sg_page_stats page_stats;
50 pajs 1.3 static int page_stats_uninit=1;
51    
52 ats 1.18 sg_page_stats *sg_get_page_stats(){
53 pajs 1.4 #ifdef SOLARIS
54 tdb 1.20 kstat_ctl_t *kc;
55     kstat_t *ksp;
56     cpu_stat_t cs;
57 pajs 1.4 #endif
58 ats 1.11 #if defined(LINUX) || defined(CYGWIN)
59 pajs 1.4 FILE *f;
60     char *line_ptr;
61     #endif
62 tdb 1.17 #if defined(FREEBSD) || defined(DFBSD)
63 pajs 1.5 size_t size;
64     #endif
65 tdb 1.15 #if defined(NETBSD) || defined(OPENBSD)
66 ats 1.9 struct uvmexp *uvm;
67     #endif
68 pajs 1.2
69 ats 1.9 page_stats.systime = time(NULL);
70 tdb 1.20 page_stats.pages_pagein=0;
71     page_stats.pages_pageout=0;
72 pajs 1.1
73 pajs 1.4 #ifdef SOLARIS
74 tdb 1.20 if ((kc = kstat_open()) == NULL) {
75 tdb 1.21 sg_set_error(SG_ERROR_KSTAT_OPEN, NULL);
76 tdb 1.20 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 pajs 1.1
84 pajs 1.2 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 pajs 1.4 #endif
90 ats 1.11 #if defined(LINUX) || defined(CYGWIN)
91 ats 1.10 if ((f = fopen("/proc/vmstat", "r")) != NULL) {
92 ats 1.18 while ((line_ptr = sg_f_read_line(f, "")) != NULL) {
93 ats 1.10 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 ats 1.18 if ((line_ptr = sg_f_read_line(f, "page")) == NULL) {
109 tdb 1.21 sg_set_error(SG_ERROR_PARSE, "page");
110 ats 1.10 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 tdb 1.21 sg_set_error(SG_ERROR_PARSE, "page");
116 pajs 1.12 fclose(f);
117 ats 1.10 return NULL;
118     }
119    
120 pajs 1.4 fclose(f);
121 ats 1.10 } else {
122 tdb 1.21 sg_set_error(SG_ERROR_OPEN, "/proc/stat");
123 pajs 1.4 return NULL;
124     }
125 pajs 1.5 #endif
126 tdb 1.17 #if defined(FREEBSD) || defined(DFBSD)
127 ats 1.8 size = sizeof page_stats.pages_pagein;
128 tdb 1.20 if (sysctlbyname("vm.stats.vm.v_swappgsin", &page_stats.pages_pagein, &size, NULL, 0) < 0){
129 tdb 1.21 sg_set_error(SG_ERROR_SYSCTLBYNAME, "vm.stats.vm.v_swappgsin");
130 tdb 1.20 return NULL;
131     }
132 ats 1.8 size = sizeof page_stats.pages_pageout;
133 tdb 1.20 if (sysctlbyname("vm.stats.vm.v_swappgsout", &page_stats.pages_pageout, &size, NULL, 0) < 0){
134 tdb 1.21 sg_set_error(SG_ERROR_SYSCTLBYNAME, "vm.stats.vm.v_swappgsout");
135 tdb 1.20 return NULL;
136     }
137 ats 1.9 #endif
138 tdb 1.16 #if defined(NETBSD) || defined(OPENBSD)
139 ats 1.18 if ((uvm = sg_get_uvmexp()) == NULL) {
140 ats 1.9 return NULL;
141     }
142 tdb 1.15
143 ats 1.9 page_stats.pages_pagein = uvm->pgswapin;
144     page_stats.pages_pageout = uvm->pgswapout;
145 pajs 1.4 #endif
146 pajs 1.1
147 pajs 1.2 return &page_stats;
148 pajs 1.3 }
149    
150 ats 1.18 sg_page_stats *sg_get_page_stats_diff(){
151     sg_page_stats *page_ptr;
152     static sg_page_stats page_stats_diff;
153 pajs 1.3
154     if(page_stats_uninit){
155 ats 1.18 page_ptr=sg_get_page_stats();
156 pajs 1.3 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 ats 1.18 page_ptr=sg_get_page_stats();
168 pajs 1.3 if(page_ptr==NULL){
169     return NULL;
170     }
171    
172 tdb 1.20 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 pajs 1.3
176     return &page_stats_diff;
177 pajs 1.1 }