• 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
43MemSensor::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
76MemSensor::~MemSensor()
77{}
78
79#ifdef Q_OS_FREEBSD
80void MemSensor::receivedStdout(TDEProcess *, char *buffer, int len )
81{
82 buffer[len] = 0;
83 sensorResult += TQString( TQCString(buffer) );
84}
85#else
86void MemSensor::receivedStdout(TDEProcess *, char *, int)
87{
88}
89#endif
90
91void 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
103int 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
118int 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
142int 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
163int 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
183int 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
225int 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
270void 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
293void 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
365void 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:32

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.9.4
This website is maintained by Timothy Pearson.