xosview  1.23
About: xosview is an X Windows based system monitor (cpu, memory, swap and network usage; interrupt and serial activities; load average).
  Fossies Dox: xosview-1.23.tar.gz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

kstats.h
Go to the documentation of this file.
1 #ifndef _KStatList_H_
2 #define _KStatList_H_
3 
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <string.h>
7 #include <strings.h>
8 #include <kstat.h>
9 #include <vector>
10 #include <iostream>
11 
12 
13 // Helper to keep track of kstats.
14 class KStatList {
15  public:
16  enum module { // module:instance:name (class)
17  CPU_STAT, // *:*:cpu_stat*
18  CPU_INFO, // *:*:cpu_info*
19  CPU_SYS, // cpu:*:sys
20  DISKS, // *:*:* (disk)
21  NETS // {link,lo}:*:* (net)
22  };
23  static KStatList *getList(kstat_ctl_t *kcp, module m) {
24  switch (m) {
25  case CPU_STAT:
26  static KStatList cpu_stats(kcp, m);
27  return &cpu_stats;
28  case CPU_INFO:
29  static KStatList cpu_infos(kcp, m);
30  return &cpu_infos;
31  case CPU_SYS:
32  static KStatList cpu_sys(kcp, m);
33  return &cpu_sys;
34  case DISKS:
35  static KStatList disks(kcp, m);
36  return &disks;
37  case NETS:
38  static KStatList nets(kcp, m);
39  return &nets;
40  default:
41  return NULL;
42  }
43  }
44  kstat_t *operator[](size_t i) {
45  return ( i < _stats.size() ? _stats[i] : NULL );
46  }
47  size_t count(void) { return _stats.size(); }
48  void update(kstat_ctl_t *kcp) {
49  if (kstat_chain_update(kcp) > 0 || _chain != kcp->kc_chain_id) {
50  XOSDEBUG("kstat chain id changed to %d\n", kcp->kc_chain_id);
51  _chain = kcp->kc_chain_id;
52  _stats.clear();
53  getstats(kcp);
54  }
55  }
56  private:
57  KStatList(const KStatList &);
58  ~KStatList(void) {}
60  KStatList(kstat_ctl_t *kcp, module m) {
61  _chain = kcp->kc_chain_id;
62  _m = m;
63  getstats(kcp);
64  }
65  void getstats(kstat_ctl_t *kcp) {
66  for (kstat_t *ksp = kcp->kc_chain; ksp != NULL; ksp = ksp->ks_next) {
67  if (_m == CPU_STAT && strncmp(ksp->ks_name, "cpu_stat", 8) == 0)
68  _stats.push_back(ksp);
69  if (_m == CPU_INFO && strncmp(ksp->ks_name, "cpu_info", 8) == 0)
70  _stats.push_back(ksp);
71  if (_m == CPU_SYS && ksp->ks_type == KSTAT_TYPE_NAMED &&
72  strncmp(ksp->ks_module, "cpu", 3) == 0 &&
73  strncmp(ksp->ks_name, "sys", 3) == 0)
74  _stats.push_back(ksp);
75  if (_m == DISKS && ksp->ks_type == KSTAT_TYPE_IO &&
76  strncmp(ksp->ks_class, "disk", 4) == 0)
77  _stats.push_back(ksp);
78  if (_m == NETS && ksp->ks_type == KSTAT_TYPE_NAMED &&
79  strncmp(ksp->ks_class, "net", 3) == 0 &&
80  ( strncmp(ksp->ks_module, "link", 4) == 0 ||
81  strncmp(ksp->ks_module, "lo", 2) == 0 ))
82  _stats.push_back(ksp);
83  }
84  }
85  kid_t _chain;
87  std::vector<kstat_t *> _stats;
88 };
89 
90 
91 // Read the correct value from "named" type kstat.
92 inline double kstat_to_double(kstat_named_t *k) {
93  switch (k->data_type) {
94  case KSTAT_DATA_INT32:
95  return k->value.i32;
96  case KSTAT_DATA_UINT32:
97  return k->value.ui32;
98 #if defined(_INT64_TYPE)
99  case KSTAT_DATA_INT64:
100  return k->value.i64;
101  case KSTAT_DATA_UINT64:
102  return k->value.ui64;
103 #endif
104  case KSTAT_DATA_FLOAT:
105  return k->value.f;
106  case KSTAT_DATA_DOUBLE:
107  return k->value.d;
108  case KSTAT_DATA_CHAR:
109  case KSTAT_DATA_STRING:
110  default:
111  std::cerr << "kstat data type " << k->data_type
112  << " can not be converted to number."
113  << std::endl;
114  exit(1);
115  }
116 }
117 
118 inline unsigned long long kstat_to_ui64(kstat_named_t *k) {
119  switch (k->data_type) {
120  case KSTAT_DATA_INT32:
121  return k->value.i32;
122  case KSTAT_DATA_UINT32:
123  return k->value.ui32;
124 #if defined(_INT64_TYPE)
125  case KSTAT_DATA_INT64:
126  return k->value.i64;
127  case KSTAT_DATA_UINT64:
128  return k->value.ui64;
129 #endif
130  case KSTAT_DATA_FLOAT:
131  return k->value.f;
132  case KSTAT_DATA_DOUBLE:
133  return k->value.d;
134  case KSTAT_DATA_CHAR:
135  case KSTAT_DATA_STRING:
136  default:
137  std::cerr << "kstat data type " << k->data_type
138  << " can not be converted to number."
139  << std::endl;
140  exit(1);
141  }
142 }
143 
144 
145 #endif
146 
void update(kstat_ctl_t *kcp)
Definition: kstats.h:48
KStatList(const KStatList &)
kid_t _chain
Definition: kstats.h:85
KStatList & operator=(const KStatList &)
void getstats(kstat_ctl_t *kcp)
Definition: kstats.h:65
~KStatList(void)
Definition: kstats.h:58
@ DISKS
Definition: kstats.h:20
@ CPU_SYS
Definition: kstats.h:19
@ CPU_STAT
Definition: kstats.h:17
@ CPU_INFO
Definition: kstats.h:18
@ NETS
Definition: kstats.h:21
KStatList(kstat_ctl_t *kcp, module m)
Definition: kstats.h:60
std::vector< kstat_t * > _stats
Definition: kstats.h:87
module _m
Definition: kstats.h:86
size_t count(void)
Definition: kstats.h:47
kstat_t * operator[](size_t i)
Definition: kstats.h:44
static KStatList * getList(kstat_ctl_t *kcp, module m)
Definition: kstats.h:23
double kstat_to_double(kstat_named_t *k)
Definition: kstats.h:92
unsigned long long kstat_to_ui64(kstat_named_t *k)
Definition: kstats.h:118
#define XOSDEBUG(...)
Definition: xosview.h:84