• 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 <kprocio.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,KProcIO::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
290void MemSensor::update()
291{
292 readValues();
293 TQString format;
294 SensorParams *sp;
295 Meter *meter;
296 TQObjectListIt it( *objList );
297#if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
298 bool set = false;
299#endif
300 int totalMem = getMemTotal();
301 int usedMem = totalMem - getMemFree();
302 int usedMemNoBuffers = usedMem - getBuffers() - getCached();
303 int totalSwap = getSwapTotal();
304 int usedSwap = totalSwap - getSwapFree();
305
306 while (it != 0)
307 {
308 sp = (SensorParams*)(*it);
309#if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
310 if ( (!MaxSet) && (totalSwap > 0) ) {
311 setMaxValue(sp);
312 bool set = true;
313 }
314#endif
315 meter = sp->getMeter();
316 format = sp->getParam("FORMAT");
317 if (format.length() == 0 )
318 {
319 format = "%um";
320 }
321
322 format.replace( TQRegExp("%fmb", false), TQString::number( (int)(( totalMem - usedMemNoBuffers)/1024.0+0.5)));
323 format.replace( TQRegExp("%fm", false), TQString::number( (int)( ( totalMem - usedMem )/1024.0+0.5) ));
324
325 format.replace( TQRegExp("%umb", false), TQString::number( (int)((usedMemNoBuffers)/1024.0+0.5)));
326 format.replace( TQRegExp("%um", false), TQString::number( (int)((usedMem)/1024.0+0.5 )));
327
328 format.replace( TQRegExp("%tm", false), TQString::number( (int)( (totalMem)/1024.0+0.5)));
329
330 format.replace( TQRegExp("%fs", false), TQString::number( (int)((totalSwap - usedSwap)/1024.0+0.5)));
331 format.replace( TQRegExp("%us", false), TQString::number( (int)(usedSwap/1024.0+0.5)));
332 format.replace( TQRegExp("%ts", false), TQString::number( (int)(totalSwap/1024.0+0.5)));
333
334 meter->setValue(format);
335 ++it;
336 }
337#if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
338 if (set)
339 MaxSet = true;
340#endif
341}
342
343void MemSensor::setMaxValue( SensorParams *sp )
344{
345 Meter *meter;
346 meter = sp->getMeter();
347 TQString f;
348 f = sp->getParam("FORMAT");
349
350 if (f.length() == 0 )
351 {
352 f = "%um";
353 }
354 if( f=="%fm" || f== "%um" || f=="%fmb" || f=="%umb" )
355 meter->setMax( getMemTotal() / 1024 );
356 if( f=="%fs" || f== "%us" )
357 meter->setMax( getSwapTotal() / 1024 );
358}
359
360#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.8
This website is maintained by Timothy Pearson.