10 #include "memsensor.h" 13 #include <tqtextstream.h> 19 #include <sys/param.h> 20 #include <sys/sysctl.h> 21 #include <sys/resource.h> 25 #include <osreldate.h> 28 #if defined(Q_OS_NETBSD) 29 #include <sys/param.h> 30 #include <sys/sysctl.h> 31 #include <sys/sched.h> 33 #include <uvm/uvm_extern.h> 36 #include <tdeprocio.h> 38 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD) 40 #define pagetok(size) ((size) << pageshift) 43 MemSensor::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;
76 MemSensor::~MemSensor()
80 void MemSensor::receivedStdout(TDEProcess *,
char *buffer,
int len )
83 sensorResult += TQString( TQCString(buffer) );
86 void MemSensor::receivedStdout(TDEProcess *,
char *,
int)
91 void 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();
103 int 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() );
118 int 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() );
142 int 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() );
163 int 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() );
183 int 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() );
225 int 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() );
270 void 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))) 293 void 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) 363 #undef SUB_FORMAT_STR 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"