• 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 #endif
34 
35 #include <kprocio.h>
36 
37 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
38 /* define pagetok in terms of pageshift */
39 #define pagetok(size) ((size) << pageshift)
40 #endif
41 
42 MemSensor::MemSensor(int msec) : Sensor(msec)
43 {
44 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
45  /* get the page size with "getpagesize" and calculate pageshift from it */
46  int pagesize = getpagesize();
47  pageshift = 0;
48  while (pagesize > 1)
49  {
50  pageshift++;
51  pagesize >>= 1;
52  }
53 
54  /* we only need the amount of log(2)1024 for our conversion */
55  pageshift -= 10;
56 # if defined(Q_OS_FREEBSD) && defined(__FreeBSD_version) && __FreeBSD_version >= 500018
57  kd = kvm_open("/dev/null", "/dev/null", "/dev/null", O_RDONLY, "kvm_open");
58 # elif defined Q_OS_FREEBSD
59  connect(&ksp, TQT_SIGNAL(receivedStdout(TDEProcess *, char *, int )),
60  this,TQT_SLOT(receivedStdout(TDEProcess *, char *, int )));
61  connect(&ksp, TQT_SIGNAL(processExited(TDEProcess *)),
62  this,TQT_SLOT(processExited( TDEProcess * )));
63 
64  swapTotal = swapUsed = 0;
65 
66  MaxSet = false;
67 
68  readValues();
69 # endif
70 #else
71  readValues();
72 #endif
73 }
74 
75 MemSensor::~MemSensor()
76 {}
77 
78 #ifdef Q_OS_FREEBSD
79 void MemSensor::receivedStdout(TDEProcess *, char *buffer, int len )
80 {
81  buffer[len] = 0;
82  sensorResult += TQString( TQCString(buffer) );
83 }
84 #else
85 void MemSensor::receivedStdout(TDEProcess *, char *, int)
86 {
87 }
88 #endif
89 
90 void MemSensor::processExited(TDEProcess *)
91 {
92 #ifdef Q_OS_FREEBSD
93  TQStringList stringList = TQStringList::split('\n',sensorResult);
94  sensorResult = "";
95  TQStringList itemsList = TQStringList::split(' ', stringList[1]);
96 
97  swapUsed = itemsList[2].toInt();
98  swapTotal = itemsList[1].toInt();
99 #endif
100 }
101 
102 int MemSensor::getMemTotal()
103 {
104 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
105  static int mem = 0;
106  size_t size = sizeof(mem);
107 
108  sysctlbyname("hw.physmem", &mem, &size, NULL, 0);
109  return (mem / 1024);
110 #else
111  TQRegExp rx( "MemTotal:\\s*(\\d+)" );
112  rx.search( meminfo );
113  return ( rx.cap(1).toInt() );
114 #endif
115 }
116 
117 int MemSensor::getMemFree()
118 {
119 #ifdef Q_OS_FREEBSD
120  static int mem = 0;
121  size_t size = sizeof(mem);
122 
123  sysctlbyname("vm.stats.vm.v_free_count", &mem, &size, NULL, 0);
124  return (pagetok(mem));
125 #elif defined(Q_OS_NETBSD)
126  struct uvmexp_sysctl uvmexp;
127  int mib[2];
128  size_t ssize;
129  mib[0] = CTL_VM;
130  mib[1] = VM_UVMEXP2;
131  ssize = sizeof(uvmexp);
132  sysctl(mib,2,&uvmexp,&ssize,NULL,0);
133  return pagetok(uvmexp.free);
134 #else
135  TQRegExp rx( "MemFree:\\s*(\\d+)" );
136  rx.search( meminfo );
137  return ( rx.cap(1).toInt() );
138 #endif
139 }
140 
141 int MemSensor::getBuffers()
142 {
143 #ifdef Q_OS_FREEBSD
144  static int mem = 0;
145  size_t size = sizeof(mem);
146 
147  sysctlbyname("vfs.bufspace", &mem, &size, NULL, 0);
148  return (mem / 1024);
149 #elif defined(Q_OS_NETBSD)
150  static int buf_mem = 0;
151  size_t size = sizeof(buf_mem);
152 
153  sysctlbyname("vm.bufmem", &buf_mem, &size, NULL, 0);
154  return (buf_mem / 1024);
155 #else
156  TQRegExp rx( "Buffers:\\s*(\\d+)" );
157  rx.search( meminfo );
158  return ( rx.cap(1).toInt() );
159 #endif
160 }
161 
162 int MemSensor::getCached()
163 {
164 #ifdef Q_OS_FREEBSD
165  static int mem = 0;
166  size_t size = sizeof(mem);
167 
168  sysctlbyname("vm.stats.vm.v_cache_count", &mem, &size, NULL, 0);
169  return (pagetok(mem));
170 #elif defined(Q_OS_NETBSD)
171  return 0;
172 #else
173  TQRegExp rx1( "Cached:\\s*(\\d+)" );
174  TQRegExp rx2( "SwapCached:\\s*(\\d+)" );
175  rx1.search( meminfo );
176  rx2.search( meminfo );
177  return ( rx1.cap(1).toInt() + rx2.cap(1).toInt() );
178 #endif
179 }
180 
181 
182 int MemSensor::getSwapTotal()
183 {
184 #ifdef Q_OS_FREEBSD
185 # if defined(__FreeBSD_version) && __FreeBSD_version >= 500018
186  int n = -1;
187  int pagesize = getpagesize();
188  int retavail = 0;
189 
190  if (kd != NULL)
191  n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
192 
193  if (n < 0 || swapinfo.ksw_total == 0)
194  return(0);
195 
196  retavail = swapinfo.ksw_total * pagesize / 1024;
197 
198  return(retavail);
199 #else
200  return(swapTotal);
201 # endif
202 #elif defined(Q_OS_NETBSD)
203  struct uvmexp_sysctl uvmexp;
204  int STotal = 0;
205  int pagesize = 1;
206  int mib[2];
207  size_t ssize;
208  mib[0] = CTL_VM;
209  mib[1] = VM_UVMEXP;
210  ssize = sizeof(uvmexp);
211 
212  if (sysctl(mib,2,&uvmexp,&ssize,NULL,0) != -1) {
213  pagesize = uvmexp.pagesize;
214  STotal = (pagesize*uvmexp.swpages) >> 10;
215  }
216  return STotal;
217 #else
218  TQRegExp rx( "SwapTotal:\\s*(\\d+)" );
219  rx.search( meminfo );
220  return ( rx.cap(1).toInt() );
221 #endif
222 }
223 
224 int MemSensor::getSwapFree()
225 {
226 #ifdef Q_OS_FREEBSD
227 # if defined(__FreeBSD_version) && __FreeBSD_version >= 500018
228  int n = -1;
229  int pagesize = getpagesize();
230  int retfree = 0;
231 
232  if (kd != NULL)
233  n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
234  if (n < 0 || swapinfo.ksw_total == 0)
235  return(0);
236 
237  retfree = (swapinfo.ksw_total - swapinfo.ksw_used) * pagesize / 1024;
238 
239  return(retfree);
240 # else
241  return(swapTotal - swapUsed);
242 # endif
243 #elif defined(Q_OS_NETBSD)
244  struct uvmexp_sysctl uvmexp;
245  int STotal = 0;
246  int SFree = 0;
247  int SUsed = 0;
248  int pagesize = 1;
249  int mib[2];
250  size_t ssize;
251  mib[0] = CTL_VM;
252  mib[1] = VM_UVMEXP;
253  ssize = sizeof(uvmexp);
254 
255  if (sysctl(mib,2,&uvmexp,&ssize,NULL,0) != -1) {
256  pagesize = uvmexp.pagesize;
257  STotal = (pagesize*uvmexp.swpages) >> 10;
258  SUsed = (pagesize*uvmexp.swpginuse) >> 10;
259  SFree = STotal - SUsed;
260  }
261  return SFree;
262 #else
263  TQRegExp rx( "SwapFree:\\s*(\\d+)" );
264  rx.search( meminfo );
265  return ( rx.cap(1).toInt() );
266 #endif
267 }
268 
269 void MemSensor::readValues()
270 {
271 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
272 # if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
273  ksp.clearArguments();
274  ksp << "swapinfo";
275  ksp.start( TDEProcess::NotifyOnExit,KProcIO::Stdout);
276 # endif
277 #else
278  TQFile file("/proc/meminfo");
279  TQString line;
280  if ( file.open(IO_ReadOnly | IO_Translate) )
281  {
282  TQTextStream t( &file ); // use a text stream
283  meminfo = t.read();
284  file.close();
285  }
286 #endif
287 }
288 
289 void MemSensor::update()
290 {
291  readValues();
292  TQString format;
293  SensorParams *sp;
294  Meter *meter;
295  TQObjectListIt it( *objList );
296 #if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
297  bool set = false;
298 #endif
299  int totalMem = getMemTotal();
300  int usedMem = totalMem - getMemFree();
301  int usedMemNoBuffers = usedMem - getBuffers() - getCached();
302  int totalSwap = getSwapTotal();
303  int usedSwap = totalSwap - getSwapFree();
304 
305  while (it != 0)
306  {
307  sp = (SensorParams*)(*it);
308 #if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
309  if ( (!MaxSet) && (totalSwap > 0) ) {
310  setMaxValue(sp);
311  bool set = true;
312  }
313 #endif
314  meter = sp->getMeter();
315  format = sp->getParam("FORMAT");
316  if (format.length() == 0 )
317  {
318  format = "%um";
319  }
320 
321  format.replace( TQRegExp("%fmb", false), TQString::number( (int)(( totalMem - usedMemNoBuffers)/1024.0+0.5)));
322  format.replace( TQRegExp("%fm", false), TQString::number( (int)( ( totalMem - usedMem )/1024.0+0.5) ));
323 
324  format.replace( TQRegExp("%umb", false), TQString::number( (int)((usedMemNoBuffers)/1024.0+0.5)));
325  format.replace( TQRegExp("%um", false), TQString::number( (int)((usedMem)/1024.0+0.5 )));
326 
327  format.replace( TQRegExp("%tm", false), TQString::number( (int)( (totalMem)/1024.0+0.5)));
328 
329  format.replace( TQRegExp("%fs", false), TQString::number( (int)((totalSwap - usedSwap)/1024.0+0.5)));
330  format.replace( TQRegExp("%us", false), TQString::number( (int)(usedSwap/1024.0+0.5)));
331  format.replace( TQRegExp("%ts", false), TQString::number( (int)(totalSwap/1024.0+0.5)));
332 
333  meter->setValue(format);
334  ++it;
335  }
336 #if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
337  if (set)
338  MaxSet = true;
339 #endif
340 }
341 
342 void MemSensor::setMaxValue( SensorParams *sp )
343 {
344  Meter *meter;
345  meter = sp->getMeter();
346  TQString f;
347  f = sp->getParam("FORMAT");
348 
349  if (f.length() == 0 )
350  {
351  f = "%um";
352  }
353  if( f=="%fm" || f== "%um" || f=="%fmb" || f=="%umb" )
354  meter->setMax( getMemTotal() / 1024 );
355  if( f=="%fs" || f== "%us" )
356  meter->setMax( getSwapTotal() / 1024 );
357 }
358 
359 #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.