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> 37 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD) 39 #define pagetok(size) ((size) << pageshift) 42 MemSensor::MemSensor(
int msec) : Sensor(msec)
44 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD) 46 int pagesize = getpagesize();
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 * )));
64 swapTotal = swapUsed = 0;
75 MemSensor::~MemSensor()
79 void MemSensor::receivedStdout(TDEProcess *,
char *buffer,
int len )
82 sensorResult += TQString( TQCString(buffer) );
85 void MemSensor::receivedStdout(TDEProcess *,
char *,
int)
90 void MemSensor::processExited(TDEProcess *)
93 TQStringList stringList = TQStringList::split(
'\n',sensorResult);
95 TQStringList itemsList = TQStringList::split(
' ', stringList[1]);
97 swapUsed = itemsList[2].toInt();
98 swapTotal = itemsList[1].toInt();
102 int MemSensor::getMemTotal()
104 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD) 106 size_t size =
sizeof(mem);
108 sysctlbyname(
"hw.physmem", &mem, &size, NULL, 0);
111 TQRegExp rx(
"MemTotal:\\s*(\\d+)" );
112 rx.search( meminfo );
113 return ( rx.cap(1).toInt() );
117 int MemSensor::getMemFree()
121 size_t size =
sizeof(mem);
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;
131 ssize =
sizeof(uvmexp);
132 sysctl(mib,2,&uvmexp,&ssize,NULL,0);
133 return pagetok(uvmexp.free);
135 TQRegExp rx(
"MemFree:\\s*(\\d+)" );
136 rx.search( meminfo );
137 return ( rx.cap(1).toInt() );
141 int MemSensor::getBuffers()
145 size_t size =
sizeof(mem);
147 sysctlbyname(
"vfs.bufspace", &mem, &size, NULL, 0);
149 #elif defined(Q_OS_NETBSD) 150 static int buf_mem = 0;
151 size_t size =
sizeof(buf_mem);
153 sysctlbyname(
"vm.bufmem", &buf_mem, &size, NULL, 0);
154 return (buf_mem / 1024);
156 TQRegExp rx(
"Buffers:\\s*(\\d+)" );
157 rx.search( meminfo );
158 return ( rx.cap(1).toInt() );
162 int MemSensor::getCached()
166 size_t size =
sizeof(mem);
168 sysctlbyname(
"vm.stats.vm.v_cache_count", &mem, &size, NULL, 0);
169 return (pagetok(mem));
170 #elif defined(Q_OS_NETBSD) 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() );
182 int MemSensor::getSwapTotal()
185 # if defined(__FreeBSD_version) && __FreeBSD_version >= 500018 187 int pagesize = getpagesize();
191 n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
193 if (n < 0 || swapinfo.ksw_total == 0)
196 retavail = swapinfo.ksw_total * pagesize / 1024;
202 #elif defined(Q_OS_NETBSD) 203 struct uvmexp_sysctl uvmexp;
210 ssize =
sizeof(uvmexp);
212 if (sysctl(mib,2,&uvmexp,&ssize,NULL,0) != -1) {
213 pagesize = uvmexp.pagesize;
214 STotal = (pagesize*uvmexp.swpages) >> 10;
218 TQRegExp rx(
"SwapTotal:\\s*(\\d+)" );
219 rx.search( meminfo );
220 return ( rx.cap(1).toInt() );
224 int MemSensor::getSwapFree()
227 # if defined(__FreeBSD_version) && __FreeBSD_version >= 500018 229 int pagesize = getpagesize();
233 n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
234 if (n < 0 || swapinfo.ksw_total == 0)
237 retfree = (swapinfo.ksw_total - swapinfo.ksw_used) * pagesize / 1024;
241 return(swapTotal - swapUsed);
243 #elif defined(Q_OS_NETBSD) 244 struct uvmexp_sysctl uvmexp;
253 ssize =
sizeof(uvmexp);
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;
263 TQRegExp rx(
"SwapFree:\\s*(\\d+)" );
264 rx.search( meminfo );
265 return ( rx.cap(1).toInt() );
269 void MemSensor::readValues()
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();
275 ksp.start( TDEProcess::NotifyOnExit,KProcIO::Stdout);
278 TQFile file(
"/proc/meminfo");
280 if ( file.open(IO_ReadOnly | IO_Translate) )
282 TQTextStream t( &file );
289 void MemSensor::update()
295 TQObjectListIt it( *objList );
296 #if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018) 299 int totalMem = getMemTotal();
300 int usedMem = totalMem - getMemFree();
301 int usedMemNoBuffers = usedMem - getBuffers() - getCached();
302 int totalSwap = getSwapTotal();
303 int usedSwap = totalSwap - getSwapFree();
308 #if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018) 309 if ( (!MaxSet) && (totalSwap > 0) ) {
314 meter = sp->getMeter();
315 format = sp->getParam(
"FORMAT");
316 if (format.length() == 0 )
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) ));
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 )));
327 format.replace( TQRegExp(
"%tm",
false), TQString::number( (
int)( (totalMem)/1024.0+0.5)));
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)));
333 meter->setValue(format);
336 #if defined(Q_OS_FREEBSD) && !(defined(__FreeBSD_version) && __FreeBSD_version >= 500018) 345 meter = sp->getMeter();
347 f = sp->getParam(
"FORMAT");
349 if (f.length() == 0 )
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 );
359 #include "memsensor.moc"