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

Comparing projects/libstatgrab/src/statgrab/statgrab.c (file contents):
Revision 1.7 by ats, Fri Aug 29 06:49:46 2003 UTC vs.
Revision 1.8 by ats, Fri Aug 29 06:56:12 2003 UTC

# Line 66 | Line 66 | display_mode_type display_mode = DISPLAY_LINUX;
66   repeat_mode_type repeat_mode = REPEAT_NONE;
67   int repeat_time = 1;
68   int use_cpu_percent = 0;
69 + int use_diffs = 0;
70  
71   /* Exit with an error message. */
72   void die(const char *s) {
# Line 144 | Line 145 | int stats_compare(const void *a, const void *b) {
145          return strcmp(((stat *)a)->name, ((stat *)b)->name);
146   }
147  
148 < /* Clear and rebuild the stats array. */
148 < void get_stats(int use_diffs) {
149 <        cpu_states_t *cpu_s;
150 <        cpu_percent_t *cpu_p;
151 <        mem_stat_t *mem;
152 <        load_stat_t *load;
153 <        user_stat_t *user;
154 <        swap_stat_t *swap;
155 <        general_stat_t *gen;
156 <        disk_stat_t *disk;
157 <        diskio_stat_t *diskio;
158 <        process_stat_t *proc;
159 <        network_stat_t *net;
160 <        page_stat_t *page;
148 > void populate_const() {
149          static int zero = 0;
162        int n, i;
150  
164        clear_stats();
165
151          /* Constants, for use with MRTG mode. */
152          add_stat(INT, &zero, "const", "0", NULL);
153 + }
154  
155 <        /* FIXME when only fetching some stats, it'd be more efficient to only
170 <           do the libstatgrab calls needed, rather than fetching everything. */
171 <
155 > void populate_cpu() {
156          if (use_cpu_percent) {
157 <                cpu_p = cpu_percent_usage();
157 >                cpu_percent_t *cpu_p = cpu_percent_usage();
158 >
159                  if (cpu_p != NULL) {
160                          add_stat(FLOAT, &cpu_p->user,
161                                   "cpu", "user", NULL);
# Line 188 | Line 173 | void get_stats(int use_diffs) {
173                                   "cpu", "time_taken", NULL);
174                  }
175          } else {
176 +                cpu_states_t *cpu_s;
177 +
178                  cpu_s = use_diffs ? get_cpu_diff() : get_cpu_totals();
179                  if (cpu_s != NULL) {
180                          add_stat(LONG_LONG, &cpu_s->user,
# Line 208 | Line 195 | void get_stats(int use_diffs) {
195                                   "cpu", "systime", NULL);
196                  }
197          }
198 + }
199  
200 <        mem = get_memory_stats();
200 > void populate_mem() {
201 >        mem_stat_t *mem = get_memory_stats();
202 >
203          if (mem != NULL) {
204                  add_stat(LONG_LONG, &mem->total, "mem", "total", NULL);
205                  add_stat(LONG_LONG, &mem->free, "mem", "free", NULL);
206                  add_stat(LONG_LONG, &mem->used, "mem", "used", NULL);
207                  add_stat(LONG_LONG, &mem->cache, "mem", "cache", NULL);
208          }
209 + }
210  
211 <        load = get_load_stats();
211 > void populate_load() {
212 >        load_stat_t *load = get_load_stats();
213 >
214          if (load != NULL) {
215                  add_stat(DOUBLE, &load->min1, "load", "min1", NULL);
216                  add_stat(DOUBLE, &load->min5, "load", "min5", NULL);
217                  add_stat(DOUBLE, &load->min15, "load", "min15", NULL);
218          }
219 + }
220  
221 <        user = get_user_stats();
221 > void populate_user() {
222 >        user_stat_t *user = get_user_stats();
223 >
224          if (user != NULL) {
225                  add_stat(INT, &user->num_entries, "user", "num", NULL);
226                  add_stat(STRING, &user->name_list, "user", "names", NULL);
227          }
228 + }
229  
230 <        swap = get_swap_stats();
230 > void populate_swap() {
231 >        swap_stat_t *swap = get_swap_stats();
232 >
233          if (swap != NULL) {
234                  add_stat(LONG_LONG, &swap->total, "swap", "total", NULL);
235                  add_stat(LONG_LONG, &swap->used, "swap", "used", NULL);
236                  add_stat(LONG_LONG, &swap->free, "swap", "free", NULL);
237          }
238 + }
239  
240 <        gen = get_general_stats();
240 > void populate_general() {
241 >        general_stat_t *gen = get_general_stats();
242 >
243          if (gen != NULL) {
244                  add_stat(STRING, &gen->os_name,
245                           "general", "os_name", NULL);
# Line 249 | Line 251 | void get_stats(int use_diffs) {
251                  add_stat(STRING, &gen->hostname, "general", "hostname", NULL);
252                  add_stat(TIME_T, &gen->uptime, "general", "uptime", NULL);
253          }
254 + }
255  
256 <        disk = get_disk_stats(&n);
256 > void populate_fs() {
257 >        int n, i;
258 >        disk_stat_t *disk = get_disk_stats(&n);
259 >
260          if (disk != NULL) {
261                  for (i = 0; i < n; i++) {
262                          /* FIXME it'd be nicer if libstatgrab did this */
# Line 281 | Line 287 | void get_stats(int use_diffs) {
287                                   "fs", name, "free_inodes", NULL);
288                  }
289          }
290 + }
291  
292 + void populate_disk() {
293 +        int n, i;
294 +        diskio_stat_t *diskio;
295 +
296          diskio = use_diffs ? get_diskio_stats_diff(&n) : get_diskio_stats(&n);
297          if (diskio != NULL) {
298                  for (i = 0; i < n; i++) {
# Line 297 | Line 308 | void get_stats(int use_diffs) {
308                                   "disk", name, "systime", NULL);
309                  }
310          }
311 + }
312  
313 <        proc = get_process_stats();
313 > void populate_proc() {
314 >        process_stat_t *proc = get_process_stats();
315 >
316          if (proc != NULL) {
317                  add_stat(INT, &proc->total, "proc", "total", NULL);
318                  add_stat(INT, &proc->running, "proc", "running", NULL);
# Line 306 | Line 320 | void get_stats(int use_diffs) {
320                  add_stat(INT, &proc->stopped, "proc", "stopped", NULL);
321                  add_stat(INT, &proc->zombie, "proc", "zombie", NULL);
322          }
323 + }
324  
325 + void populate_net() {
326 +        int n, i;
327 +        network_stat_t *net;
328 +
329          net = use_diffs ? get_network_stats_diff(&n) : get_network_stats(&n);
330          if (net != NULL) {
331                  for (i = 0; i < n; i++) {
# Line 322 | Line 341 | void get_stats(int use_diffs) {
341                                   "net", name, "systime", NULL);
342                  }
343          }
344 + }
345  
346 + void populate_page() {
347 +        page_stat_t *page;
348 +
349          page = use_diffs ? get_page_stats_diff() : get_page_stats();
350          if (page != NULL) {
351                  add_stat(LONG_LONG, &page->pages_pagein, "page", "in", NULL);
352                  add_stat(LONG_LONG, &page->pages_pageout, "page", "out", NULL);
353                  add_stat(LONG_LONG, &page->systime, "page", "systime", NULL);
354          }
355 + }
356  
357 + typedef struct {
358 +        const char *name;
359 +        void (*populate)();
360 +        int interesting;
361 + } toplevel;
362 + toplevel toplevels[] = {
363 +        {"const.", populate_const, 0},
364 +        {"cpu.", populate_cpu, 0},
365 +        {"mem.", populate_mem, 0},
366 +        {"load.", populate_load, 0},
367 +        {"user.", populate_user, 0},
368 +        {"swap.", populate_swap, 0},
369 +        {"general.", populate_general, 0},
370 +        {"fs.", populate_fs, 0},
371 +        {"disk.", populate_disk, 0},
372 +        {"proc.", populate_proc, 0},
373 +        {"net.", populate_net, 0},
374 +        {"page.", populate_page, 0},
375 +        {NULL, NULL, 0}
376 + };
377 +
378 + /* Set the "interesting" flag on the sections that we actually need to
379 +   fetch. */
380 + void select_interesting(int argc, char **argv) {
381 +        toplevel *t;
382 +
383 +        if (argc == 0) {
384 +                for (t = &toplevels[0]; t->name != NULL; t++)
385 +                        t->interesting = 1;
386 +        } else {
387 +                int i;
388 +
389 +                for (i = 0; i < argc; i++) {
390 +                        for (t = &toplevels[0]; t->name != NULL; t++) {
391 +                                if (strncmp(argv[i], t->name,
392 +                                            strlen(t->name)) == 0) {
393 +                                        t->interesting = 1;
394 +                                        break;
395 +                                }
396 +                        }
397 +                }
398 +        }
399 + }
400 +
401 + /* Clear and rebuild the stats array. */
402 + void get_stats() {
403 +        toplevel *t;
404 +
405 +        clear_stats();
406 +
407 +        for (t = &toplevels[0]; t->name != NULL; t++) {
408 +                if (t->interesting)
409 +                        t->populate();
410 +        }
411 +
412          qsort(stats, num_stats, sizeof *stats, stats_compare);
413   }
414  
# Line 472 | Line 551 | int main(int argc, char **argv) {
551          if (use_cpu_percent && repeat_mode == REPEAT_NONE)
552                  die("CPU percentage usage display requires stat differences");
553  
554 +        if (repeat_mode == REPEAT_NONE)
555 +                use_diffs = 0;
556 +        else
557 +                use_diffs = 1;
558 +
559 +        select_interesting(argc - optind, &argv[optind]);
560 +
561          switch (repeat_mode) {
562          case REPEAT_NONE:
563 <                get_stats(0);
563 >                get_stats();
564                  print_stats(argc, argv);
565                  break;
566          case REPEAT_ONCE:
567 <                get_stats(1);
567 >                get_stats();
568                  sleep(repeat_time);
569 <                get_stats(1);
569 >                get_stats();
570                  print_stats(argc, argv);
571                  break;
572          case REPEAT_FOREVER:
573                  while (1) {
574 <                        get_stats(1);
574 >                        get_stats();
575                          print_stats(argc, argv);
576                          printf("\n");
577                          sleep(repeat_time);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines