ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/disk_stats.c
(Generate patch)

Comparing projects/libstatgrab/src/libstatgrab/disk_stats.c (file contents):
Revision 1.3 by tdb, Thu Feb 20 13:19:52 2003 UTC vs.
Revision 1.6 by pajs, Sun Feb 23 23:28:19 2003 UTC

# Line 25 | Line 25
25   #include "statgrab.h"
26   #include <stdlib.h>
27   #include <stdio.h>
28 + #include "ukcprog.h"
29   #include <string.h>
30  
31   #ifdef SOLARIS
32   #include <sys/mnttab.h>
33   #include <sys/types.h>
34   #include <sys/statvfs.h>
35 + #include <kstat.h>
36  
37   #define VALID_FS_TYPES {"ufs", "tmpfs"}
38  
# Line 60 | Line 62 | void init_disk_stat(int start, int end, disk_stat_t *d
62                  
63                  disk_stats++;
64          }
63
65   }
66  
67   disk_stat_t *get_disk_stats(int *entries){
# Line 155 | Line 156 | disk_stat_t *get_disk_stats(int *entries){
156  
157   }
158  
159 + void diskio_stat_init(int start, int end, diskio_stat_t *diskio_stats){
160 +
161 +        for(diskio_stats+=start; start<end; start++){
162 +                diskio_stats->disk_name=NULL;
163 +                
164 +                diskio_stats++;
165 +        }
166 + }
167 +
168 + diskio_stat_t *diskio_stat_malloc(int needed_entries, int *cur_entries, diskio_stat_t *diskio_stats){
169 +
170 +        if(diskio_stats==NULL){
171 +
172 +                if((diskio_stats=malloc(needed_entries * sizeof(diskio_stat_t)))==NULL){
173 +                        return NULL;
174 +                }
175 +                diskio_stat_init(0, needed_entries, diskio_stats);
176 +                *cur_entries=needed_entries;
177 +
178 +                return diskio_stats;
179 +        }
180 +
181 +
182 +        if(*cur_entries<needed_entries){
183 +                diskio_stats=realloc(diskio_stats, (sizeof(diskio_stat_t)*needed_entries));
184 +                if(diskio_stats==NULL){
185 +                        return NULL;
186 +                }
187 +                diskio_stat_init(*cur_entries, needed_entries, diskio_stats);
188 +                *cur_entries=needed_entries;
189 +        }
190 +
191 +        return diskio_stats;
192 + }
193 +
194 + static diskio_stat_t *diskio_stats=NULL;        
195 + static int num_diskio=0;        
196 +
197   diskio_stat_t *get_diskio_stats(int *entries){
198  
199 <        /* Do jibble */
200 <        return NULL;
199 >        static int sizeof_diskio_stats=0;
200 >        diskio_stat_t *diskio_stats_ptr;
201 >
202 >        kstat_ctl_t *kc;
203 >        kstat_t *ksp;
204 >        kstat_io_t kios;
205 >
206 >        if ((kc = kstat_open()) == NULL) {
207 >                return NULL;
208 >        }
209 >
210 >        num_diskio=0;
211 >
212 >        for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) {
213 >                if (!strcmp(ksp->ks_class, "disk")) {
214 >
215 >                        if(ksp->ks_type != KSTAT_TYPE_IO) continue;
216 >                        /* We dont want metadevices appearins as num_diskio */
217 >                        if(strcmp(ksp->ks_module, "md")==0) continue;
218 >                        if((kstat_read(kc, ksp, &kios))==-1){  
219 >                        }
220 >                        
221 >                        if((diskio_stats=diskio_stat_malloc(num_diskio+1, &sizeof_diskio_stats, diskio_stats))==NULL){
222 >                                kstat_close(kc);
223 >                                return NULL;
224 >                        }
225 >                        diskio_stats_ptr=diskio_stats+num_diskio;
226 >                        
227 >                        diskio_stats_ptr->read_bytes=kios.nread;
228 >                        
229 >                        diskio_stats_ptr->write_bytes=kios.nwritten;
230 >
231 >                        if(diskio_stats_ptr->disk_name!=NULL) free(diskio_stats_ptr->disk_name);
232 >
233 >                        diskio_stats_ptr->disk_name=strdup(ksp->ks_name);
234 >                        num_diskio++;
235 >                }
236 >        }
237 >
238 >        kstat_close(kc);
239 >
240 >        *entries=num_diskio;
241 >
242 >        return diskio_stats;
243 > }
244 >
245 > diskio_stat_t *get_diskio_stats_diff(int *entries){
246 >        static diskio_stat_t *diskio_stats_diff=NULL;
247 >        static int sizeof_diskio_stats_diff=0;
248 >        diskio_stat_t *diskio_stats_diff_ptr, *diskio_stats_ptr;
249 >        int disks, x, y;
250 >
251 >        if(diskio_stats==NULL){
252 >                diskio_stats_ptr=get_diskio_stats(&disks);
253 >                *entries=disks;
254 >                return diskio_stats_ptr;
255 >        }
256 >
257 >        diskio_stats_diff=diskio_stat_malloc(num_diskio, &sizeof_diskio_stats_diff, diskio_stats_diff);
258 >        if(diskio_stats_diff==NULL){
259 >                return NULL;
260 >        }
261 >
262 >        diskio_stats_diff_ptr=diskio_stats_diff;
263 >        diskio_stats_ptr=diskio_stats;
264 >
265 >        for(disks=0;disks<num_diskio;disks++){
266 >                if(diskio_stats_diff_ptr->disk_name!=NULL){
267 >                        free(diskio_stats_diff_ptr->disk_name);
268 >                }
269 >                diskio_stats_diff_ptr->disk_name=strdup(diskio_stats_ptr->disk_name);
270 >                diskio_stats_diff_ptr->read_bytes=diskio_stats_ptr->read_bytes;
271 >                diskio_stats_diff_ptr->write_bytes=diskio_stats_ptr->write_bytes;
272 >                diskio_stats_diff_ptr->systime=diskio_stats_ptr->systime;
273 >
274 >                diskio_stats_diff_ptr++;
275 >                diskio_stats_ptr++;
276 >        }
277 >
278 >        diskio_stats_ptr=get_diskio_stats(&disks);
279 >        diskio_stats_diff_ptr=diskio_stats_diff;
280 >
281 >        for(x=0;x<sizeof_diskio_stats_diff;x++){
282 >
283 >                if((strcmp(diskio_stats_diff_ptr->disk_name, diskio_stats_ptr->disk_name))==0){
284 >                        diskio_stats_diff_ptr->read_bytes=diskio_stats_ptr->read_bytes-diskio_stats_diff_ptr->read_bytes;
285 >                        diskio_stats_diff_ptr->write_bytes=diskio_stats_ptr->write_bytes-diskio_stats_diff_ptr->write_bytes;
286 >                        diskio_stats_diff_ptr->systime=diskio_stats_ptr->systime-diskio_stats_diff_ptr->systime;
287 >                }else{
288 >                        diskio_stats_ptr=diskio_stats;
289 >                        for(y=0;y<disks;y++){
290 >                                if((strcmp(diskio_stats_diff_ptr->disk_name, diskio_stats_ptr->disk_name))==0){
291 >                                        diskio_stats_diff_ptr->read_bytes=diskio_stats_ptr->read_bytes-diskio_stats_diff_ptr->read_bytes;
292 >                                        diskio_stats_diff_ptr->write_bytes=diskio_stats_ptr->write_bytes-diskio_stats_diff_ptr->write_bytes;
293 >                                        diskio_stats_diff_ptr->systime=diskio_stats_ptr->systime-diskio_stats_diff_ptr->systime;
294 >
295 >                                        break;
296 >                                }
297 >                                
298 >                                diskio_stats_ptr++;
299 >                        }
300 >                }
301 >
302 >                diskio_stats_ptr++;
303 >                diskio_stats_diff_ptr++;        
304 >
305 >        }
306 >
307 >        return diskio_stats_diff;
308   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines