13#include <tqtextstream.h>
20#include <sys/sysctl.h>
21#include <sys/resource.h>
28#if defined(Q_OS_NETBSD)
30#include <sys/sysctl.h>
33#include <uvm/uvm_extern.h>
38#if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
40#define pagetok(size) ((size) << pageshift)
43MemSensor::MemSensor(
int msec) : Sensor(msec)
45#if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
47 int pagesize = getpagesize();
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 * )));
65 swapTotal = swapUsed = 0;
76MemSensor::~MemSensor()
80void MemSensor::receivedStdout(TDEProcess *,
char *buffer,
int len )
83 sensorResult += TQString( TQCString(buffer) );
86void MemSensor::receivedStdout(TDEProcess *,
char *,
int)
91void MemSensor::processExited(TDEProcess *)
94 TQStringList stringList = TQStringList::split(
'\n',sensorResult);
96 TQStringList itemsList = TQStringList::split(
' ', stringList[1]);
98 swapUsed = itemsList[2].toInt();
99 swapTotal = itemsList[1].toInt();
103int MemSensor::getMemTotal()
105#if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD)
107 size_t size =
sizeof(mem);
109 sysctlbyname(
"hw.physmem", &mem, &size, NULL, 0);
112 TQRegExp rx(
"MemTotal:\\s*(\\d+)" );
113 rx.search( meminfo );
114 return ( rx.cap(1).toInt() );
118int MemSensor::getMemFree()
122 size_t size =
sizeof(mem);
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;
132 ssize =
sizeof(uvmexp);
133 sysctl(mib,2,&uvmexp,&ssize,NULL,0);
134 return pagetok(uvmexp.free);
136 TQRegExp rx(
"MemFree:\\s*(\\d+)" );
137 rx.search( meminfo );
138 return ( rx.cap(1).toInt() );
142int MemSensor::getBuffers()
146 size_t size =
sizeof(mem);
148 sysctlbyname(
"vfs.bufspace", &mem, &size, NULL, 0);
150#elif defined(Q_OS_NETBSD)
151 static int buf_mem = 0;
152 size_t size =
sizeof(buf_mem);
154 sysctlbyname(
"vm.bufmem", &buf_mem, &size, NULL, 0);
155 return (buf_mem / 1024);
157 TQRegExp rx(
"Buffers:\\s*(\\d+)" );
158 rx.search( meminfo );
159 return ( rx.cap(1).toInt() );
163int MemSensor::getCached()
167 size_t size =
sizeof(mem);
169 sysctlbyname(
"vm.stats.vm.v_cache_count", &mem, &size, NULL, 0);
170 return (pagetok(mem));
171#elif defined(Q_OS_NETBSD)
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() );
183int MemSensor::getSwapTotal()
186# if defined(__FreeBSD_version) && __FreeBSD_version >= 500018
188 int pagesize = getpagesize();
192 n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
194 if (n < 0 || swapinfo.ksw_total == 0)
197 retavail = swapinfo.ksw_total * pagesize / 1024;
203#elif defined(Q_OS_NETBSD)
204 struct uvmexp_sysctl uvmexp;
211 ssize =
sizeof(uvmexp);
213 if (sysctl(mib, 2, &uvmexp, &ssize, NULL, 0) != -1) {
214 pagesize = uvmexp.pagesize;
215 STotal = (pagesize*uvmexp.swpages) >> 10;
219 TQRegExp rx(
"SwapTotal:\\s*(\\d+)" );
220 rx.search( meminfo );
221 return ( rx.cap(1).toInt() );
225int MemSensor::getSwapFree()
228# if defined(__FreeBSD_version) && __FreeBSD_version >= 500018
230 int pagesize = getpagesize();
234 n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
235 if (n < 0 || swapinfo.ksw_total == 0)
238 retfree = (swapinfo.ksw_total - swapinfo.ksw_used) * pagesize / 1024;
242 return(swapTotal - swapUsed);
244#elif defined(Q_OS_NETBSD)
245 struct uvmexp_sysctl uvmexp;
254 ssize =
sizeof(uvmexp);
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;
264 TQRegExp rx(
"SwapFree:\\s*(\\d+)" );
265 rx.search( meminfo );
266 return ( rx.cap(1).toInt() );
270void MemSensor::readValues()
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();
276 ksp.start( TDEProcess::NotifyOnExit,TDEProcIO::Stdout);
279 TQFile file(
"/proc/meminfo");
281 if ( file.open(IO_ReadOnly | IO_Translate) )
283 TQTextStream t( &file );
290#define SUB_FORMAT_STR(fstring, value) \
291 format.replace(TQRegExp(#fstring, false), TQString::number((int)(value)))
293void MemSensor::update()
299 TQObjectListIt it( *objList );
300#if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
303 int totalMem = getMemTotal();
304 int usedMem = totalMem - getMemFree();
305 int usedMemNoBuffers = usedMem - getBuffers() - getCached();
306 int totalSwap = getSwapTotal();
307 int usedSwap = totalSwap - getSwapFree();
312#if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
313 if ( (!MaxSet) && (totalSwap > 0) ) {
318 meter = sp->getMeter();
319 format = sp->getParam(
"FORMAT");
320 if (format.length() == 0 )
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);
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);
339 SUB_FORMAT_STR(%tmg, totalMem / 1024.0 / 1024.0 + 1);
340 SUB_FORMAT_STR(%tm, totalMem / 1024.0 + 0.5);
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);
349 SUB_FORMAT_STR(%tsg, totalSwap / 1024.0 / 1024.0 + 1);
350 SUB_FORMAT_STR(%ts, totalSwap / 1024.0 + 0.5);
352 meter->setValue(format);
355#if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018)
368 meter = sp->getMeter();
370 f = sp->getParam(
"FORMAT");
372 if (f.length() == 0 )
376 else if (f.endsWith(
"p"))
380 else if (f ==
"%fm" || f ==
"%um" || f ==
"%fmb" || f ==
"%umb")
382 meter->setMax(getMemTotal() / 1024);
384 else if (f ==
"%fmg" || f ==
"%umg" || f ==
"%fmbg" || f ==
"%umbg")
386 meter->setMax(getMemTotal() / 1024 / 1024);
388 else if (f ==
"%fs" || f ==
"%us" || f ==
"%fsg" || f ==
"%usg")
390 meter->setMax(getSwapTotal() / 1024);
394#include "memsensor.moc"