• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • superkaramba
 

superkaramba

  • superkaramba
  • src
memsensor.cpp
1 /***************************************************************************
2  * Copyright (C) 2003 by Hans Karlsson *
3  * karlsson.h@home.se *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  ***************************************************************************/
10 #include "memsensor.h"
11 #include <tqfile.h>
12 #include <tqglobal.h>
13 #include <tqtextstream.h>
14 #include <tqstring.h>
15 #include <tqregexp.h>
16 
17 #ifdef Q_OS_FREEBSD
18 #include <sys/time.h>
19 #include <sys/param.h>
20 #include <sys/sysctl.h>
21 #include <sys/resource.h>
22 #include <unistd.h>
23 #include <kvm.h>
24 #include <sys/file.h>
25 #include <osreldate.h>
26 #endif
27 
28 #if defined(Q_OS_NETBSD)
29 #include <sys/param.h>
30 #include <sys/sysctl.h>
31 #include <sys/sched.h>
32 #include <sys/swap.h>
33 #include <uvm/uvm_extern.h>
34 #endif
35 
36 #include <tdeprocio.h>
37 
38 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
39 /* define pagetok in terms of pageshift */
40 #define pagetok(size) ((size) << pageshift)
41 #endif
42 
43 MemSensor::MemSensor(int msec) : Sensor(msec)
44 {
45 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
46  /* get the page size with "getpagesize" and calculate pageshift from it */
47  int pagesize = getpagesize();
48  pageshift = 0;
49  while (pagesize > 1)
50  {
51  pageshift++;
52  pagesize >>= 1;
53  }
54 
55  /* we only need the amount of log(2)1024 for our conversion */
56  pageshift -= 10;
57 # if defined(Q_OS_FREEBSD) && defined(__FreeBSD_version) && __FreeBSD_version >= 500018
58  kd = kvm_open("/dev/null", "/dev/null", "/dev/null", O_RDONLY, "kvm_open");
59 # elif defined Q_OS_FREEBSD
60  connect(&ksp, TQ_SIGNAL(receivedStdout(TDEProcess *, char *, int )),
61  this,TQ_SLOT(receivedStdout(TDEProcess *, char *, int )));
62  connect(&ksp, TQ_SIGNAL(processExited(TDEProcess *)),
63  this,TQ_SLOT(processExited( TDEProcess * )));
64 
65  swapTotal = swapUsed = 0;
66 
67  MaxSet = false;
68 
69  readValues();
70 # endif
71 #else
72  readValues();
73 #endif
74 }
75 
76 MemSensor::~MemSensor()
77 {}
78 
79 #ifdef Q_OS_FREEBSD
80 void MemSensor::receivedStdout(TDEProcess *, char *buffer, int len )
81 {
82  buffer[len] = 0;
83  sensorResult += TQString( TQCString(buffer) );
84 }
85 #else
86 void MemSensor::receivedStdout(TDEProcess *, char *, int)
87 {
88 }
89 #endif
90 
91 void MemSensor::processExited(TDEProcess *)
92 {
93 #ifdef Q_OS_FREEBSD
94  TQStringList stringList = TQStringList::split('\n',sensorResult);
95  sensorResult = "";
96  TQStringList itemsList = TQStringList::split(' ', stringList[1]);
97 
98  swapUsed = itemsList[2].toInt();
99  swapTotal = itemsList[1].toInt();
100 #endif
101 }
102 
103 int MemSensor::getMemTotal()
104 {
105 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
106  static int mem = 0;
107  size_t size = sizeof(mem);
108 
109  sysctlbyname("hw.physmem", &mem, &size, NULL, 0);
110  return (mem / 1024);
111 #else
112  TQRegExp rx( "MemTotal:\\s*(\\d+)" );
113  rx.search( meminfo );
114  return ( rx.cap(1).toInt() );
115 #endif
116 }
117 
118 int MemSensor::getMemFree()
119 {
120 #ifdef Q_OS_FREEBSD
121  static int mem = 0;
122  size_t size = sizeof(mem);
123 
124  sysctlbyname("vm.stats.vm.v_free_count", &mem, &size, NULL, 0);
125  return (pagetok(mem));
126 #elif defined(Q_OS_NETBSD)
127  struct uvmexp_sysctl uvmexp;
128  int mib[2];
129  size_t ssize;
130  mib[0] = CTL_VM;
131  mib[1] = VM_UVMEXP2;
132  ssize = sizeof(uvmexp);
133  sysctl(mib,2,&uvmexp,&ssize,NULL,0);
134  return pagetok(uvmexp.free);
135 #else
136  TQRegExp rx( "MemFree:\\s*(\\d+)" );
137  rx.search( meminfo );
138  return ( rx.cap(1).toInt() );
139 #endif
140 }
141 
142 int MemSensor::getBuffers()
143 {
144 #ifdef Q_OS_FREEBSD
145  static int mem = 0;
146  size_t size = sizeof(mem);
147 
148  sysctlbyname("vfs.bufspace", &mem, &size, NULL, 0);
149  return (mem / 1024);
150 #elif defined(Q_OS_NETBSD)
151  static int buf_mem = 0;
152  size_t size = sizeof(buf_mem);
153 
154  sysctlbyname("vm.bufmem", &buf_mem, &size, NULL, 0);
155  return (buf_mem / 1024);
156 #else
157  TQRegExp rx( "Buffers:\\s*(\\d+)" );
158  rx.search( meminfo );
159  return ( rx.cap(1).toInt() );
160 #endif
161 }
162 
163 int MemSensor::getCached()
164 {
165 #ifdef Q_OS_FREEBSD
166  static int mem = 0;
167  size_t size = sizeof(mem);
168 
169  sysctlbyname("vm.stats.vm.v_cache_count", &mem, &size, NULL, 0);
170  return (pagetok(mem));
171 #elif defined(Q_OS_NETBSD)
172  return 0;
173 #else
174  TQRegExp rx1( "Cached:\\s*(\\d+)" );
175  TQRegExp rx2( "SwapCached:\\s*(\\d+)" );
176  rx1.search( meminfo );
177  rx2.search( meminfo );
178  return ( rx1.cap(1).toInt() + rx2.cap(1).toInt() );
179 #endif
180 }
181 
182 
183 int MemSensor::getSwapTotal()
184 {
185 #ifdef Q_OS_FREEBSD
186 # if defined(__FreeBSD_version) && __FreeBSD_version >= 500018
187  int n = -1;
188  int pagesize = getpagesize();
189  int retavail = 0;
190 
191  if (kd != NULL)
192  n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
193 
194  if (n < 0 || swapinfo.ksw_total == 0)
195  return(0);
196 
197  retavail = swapinfo.ksw_total * pagesize / 1024;
198 
199  return(retavail);
200 #else
201  return(swapTotal);
202 # endif
203 #elif defined(Q_OS_NETBSD)
204  struct uvmexp_sysctl uvmexp;
205  int STotal = 0;
206  int pagesize = 1;
207  int mib[2];
208  size_t ssize;
209  mib[0] = CTL_VM;
210  mib[1] = VM_UVMEXP;
211  ssize = sizeof(uvmexp);
212 
213  if (sysctl(mib, 2, &uvmexp, &ssize, NULL, 0) != -1) {
214  pagesize = uvmexp.pagesize;
215  STotal = (pagesize*uvmexp.swpages) >> 10;
216  }
217  return STotal;
218 #else
219  TQRegExp rx( "SwapTotal:\\s*(\\d+)" );
220  rx.search( meminfo );
221  return ( rx.cap(1).toInt() );
222 #endif
223 }
224 
225 int MemSensor::getSwapFree()
226 {
227 #ifdef Q_OS_FREEBSD
228 # if defined(__FreeBSD_version) && __FreeBSD_version >= 500018
229  int n = -1;
230  int pagesize = getpagesize();
231  int retfree = 0;
232 
233  if (kd != NULL)
234  n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
235  if (n < 0 || swapinfo.ksw_total == 0)
236  return(0);
237 
238  retfree = (swapinfo.ksw_total - swapinfo.ksw_used) * pagesize / 1024;
239 
240  return(retfree);
241 # else
242  return(swapTotal - swapUsed);
243 # endif
244 #elif defined(Q_OS_NETBSD)
245  struct uvmexp_sysctl uvmexp;
246  int STotal = 0;
247  int SFree = 0;
248  int SUsed = 0;
249  int pagesize = 1;
250  int mib[2];
251  size_t ssize;
252  mib[0] = CTL_VM;
253  mib[1] = VM_UVMEXP;
254  ssize = sizeof(uvmexp);
255 
256  if (sysctl(mib,2,&uvmexp,&ssize,NULL,0) != -1) {
257  pagesize = uvmexp.pagesize;
258  STotal = (pagesize*uvmexp.swpages) >> 10;
259  SUsed = (pagesize*uvmexp.swpginuse) >> 10;
260  SFree = STotal - SUsed;
261  }
262  return SFree;
263 #else
264  TQRegExp rx( "SwapFree:\\s*(\\d+)" );
265  rx.search( meminfo );
266  return ( rx.cap(1).toInt() );
267 #endif
268 }
269 
270 void MemSensor::readValues()
271 {
272 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
273 # if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
274  ksp.clearArguments();
275  ksp << "swapinfo";
276  ksp.start( TDEProcess::NotifyOnExit,TDEProcIO::Stdout);
277 # endif
278 #else
279  TQFile file("/proc/meminfo");
280  TQString line;
281  if ( file.open(IO_ReadOnly | IO_Translate) )
282  {
283  TQTextStream t( &file ); // use a text stream
284  meminfo = t.read();
285  file.close();
286  }
287 #endif
288 }
289 
290 #define SUB_FORMAT_STR(fstring, value) \
291  format.replace(TQRegExp(#fstring, false), TQString::number((int)(value)))
292 
293 void MemSensor::update()
294 {
295  readValues();
296  TQString format;
297  SensorParams *sp;
298  Meter *meter;
299  TQObjectListIt it( *objList );
300 #if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
301  bool set = false;
302 #endif
303  int totalMem = getMemTotal();
304  int usedMem = totalMem - getMemFree();
305  int usedMemNoBuffers = usedMem - getBuffers() - getCached();
306  int totalSwap = getSwapTotal();
307  int usedSwap = totalSwap - getSwapFree();
308 
309  while (it != 0)
310  {
311  sp = (SensorParams*)(*it);
312 #if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
313  if ( (!MaxSet) && (totalSwap > 0) ) {
314  setMaxValue(sp);
315  bool set = true;
316  }
317 #endif
318  meter = sp->getMeter();
319  format = sp->getParam("FORMAT");
320  if (format.length() == 0 )
321  {
322  format = "%um";
323  }
324 
325  SUB_FORMAT_STR(%fmbp, (totalMem - usedMemNoBuffers) * 100.0 / totalMem);
326  SUB_FORMAT_STR(%fmbg, (totalMem - usedMemNoBuffers) / 1024.0 / 1024.0 + 1);
327  SUB_FORMAT_STR(%fmb, (totalMem - usedMemNoBuffers) / 1024.0 + 0.5);
328  SUB_FORMAT_STR(%fmp, (totalMem - usedMem) * 100.0 / totalMem);
329  SUB_FORMAT_STR(%fmg, (totalMem - usedMem) / 1024.0 / 1024.0 + 1);
330  SUB_FORMAT_STR(%fm, (totalMem - usedMem) / 1024.0 + 0.5);
331 
332  SUB_FORMAT_STR(%umbp, usedMemNoBuffers * 100.0 / totalMem);
333  SUB_FORMAT_STR(%umbg, usedMemNoBuffers / 1024.0 / 1024.0 + 1);
334  SUB_FORMAT_STR(%umb, usedMemNoBuffers / 1024.0 + 0.5);
335  SUB_FORMAT_STR(%ump, usedMem * 100.0 / totalMem);
336  SUB_FORMAT_STR(%umg, usedMem / 1024.0 / 1024.0 + 1);
337  SUB_FORMAT_STR(%um, usedMem / 1024.0 + 0.5);
338 
339  SUB_FORMAT_STR(%tmg, totalMem / 1024.0 / 1024.0 + 1);
340  SUB_FORMAT_STR(%tm, totalMem / 1024.0 + 0.5);
341 
342  SUB_FORMAT_STR(%fsp, (totalSwap - usedSwap) * 100.0 / totalSwap);
343  SUB_FORMAT_STR(%fsg, (totalSwap - usedSwap) / 1024.0 / 1024.0 + 1);
344  SUB_FORMAT_STR(%fs, (totalSwap - usedSwap) / 1024.0 + 0.5);
345  SUB_FORMAT_STR(%usp, usedSwap * 100.0 / totalSwap);
346  SUB_FORMAT_STR(%usg, usedSwap / 1024.0 / 1024.0 + 1);
347  SUB_FORMAT_STR(%us, usedSwap / 1024.0 + 0.5);
348 
349  SUB_FORMAT_STR(%tsg, totalSwap / 1024.0 / 1024.0 + 1);
350  SUB_FORMAT_STR(%ts, totalSwap / 1024.0 + 0.5);
351 
352  meter->setValue(format);
353  ++it;
354  }
355 #if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
356  if (set)
357  {
358  MaxSet = true;
359  }
360 #endif
361 }
362 
363 #undef SUB_FORMAT_STR
364 
365 void MemSensor::setMaxValue( SensorParams *sp )
366 {
367  Meter *meter;
368  meter = sp->getMeter();
369  TQString f;
370  f = sp->getParam("FORMAT");
371 
372  if (f.length() == 0 )
373  {
374  f = "%um";
375  }
376  else if (f.endsWith("p"))
377  {
378  meter->setMax(100);
379  }
380  else if (f == "%fm" || f == "%um" || f == "%fmb" || f == "%umb")
381  {
382  meter->setMax(getMemTotal() / 1024);
383  }
384  else if (f == "%fmg" || f == "%umg" || f == "%fmbg" || f == "%umbg")
385  {
386  meter->setMax(getMemTotal() / 1024 / 1024);
387  }
388  else if (f == "%fs" || f == "%us" || f == "%fsg" || f == "%usg")
389  {
390  meter->setMax(getSwapTotal() / 1024);
391  }
392 }
393 
394 #include "memsensor.moc"
SensorParams
Hans Karlsson.
Definition: sensorparams.h:31

superkaramba

Skip menu "superkaramba"
  • Main Page
  • Alphabetical List
  • Class List
  • File List
  • Class Members

superkaramba

Skip menu "superkaramba"
  • kcalc
  •   knumber
  • superkaramba
Generated for superkaramba by doxygen 1.8.13
This website is maintained by Timothy Pearson.