freebsd-ports/deskutils/superkaramba/files/patch-memsensor.cpp
Will Andrews b45ad32f77 Add superkaramba 0.33, a KDE tool that allows interactive eye-candy
on the desktop.

PR:		56493
Submitted by:	Markus Brueffer <brueffer@phoenix-systems.de>
2003-11-09 07:40:29 +00:00

261 lines
5.9 KiB
C++

--- src/memsensor.cpp.orig Mon Apr 21 15:17:03 2003
+++ src/memsensor.cpp Fri Sep 5 12:07:36 2003
@@ -12,63 +12,202 @@
#include <qtextstream.h>
#include <qstring.h>
#include <qregexp.h>
+
+#ifdef __FreeBSD__
+#include <sys/time.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#include <kvm.h>
+#include <sys/file.h>
+#include <osreldate.h>
+
+/* define pagetok in terms of pageshift */
+#define pagetok(size) ((size) << pageshift)
+#endif
+
MemSensor::MemSensor(int msec) : Sensor(msec)
{
+#ifdef __FreeBSD__
+ /* get the page size with "getpagesize" and calculate pageshift from it */
+ int pagesize = getpagesize();
+ pageshift = 0;
+ while (pagesize > 1)
+ {
+ pageshift++;
+ pagesize >>= 1;
+ }
+
+ /* we only need the amount of log(2)1024 for our conversion */
+ pageshift -= 10;
+
+# if __FreeBSD_version < 500018
+ connect(&ksp, SIGNAL(receivedStdout(KProcess *, char *, int )),
+ this,SLOT(receivedStdout(KProcess *, char *, int )));
+ connect(&ksp, SIGNAL(processExited(KProcess *)),
+ this,SLOT(processExited( KProcess * )));
+
+ swapTotal = swapUsed = 0;
+
+ MaxSet = false;
+
readValues();
+# else
+ kd = kvm_open("/dev/null", "/dev/null", "/dev/null", O_RDONLY, "kvm_open");
+# endif
+#else
+ readValues();
+#endif
}
+
MemSensor::~MemSensor()
{}
+#ifdef __FreeBSD__
+void MemSensor::receivedStdout(KProcess *, char *buffer, int len )
+{
+ buffer[len] = 0;
+ sensorResult += QString( QCString(buffer) );
+}
+
+void MemSensor::processExited(KProcess *)
+{
+ QStringList stringList = QStringList::split('\n',sensorResult);
+ sensorResult = "";
+ QStringList itemsList = QStringList::split(' ', stringList[1]);
+
+ swapUsed = itemsList[2].toInt();
+ swapTotal = itemsList[1].toInt();
+}
+#endif
int MemSensor::getMemTotal()
{
+#ifdef __FreeBSD__
+ static int mem = 0;
+ size_t size = sizeof(mem);
+
+ sysctlbyname("hw.physmem", &mem, &size, NULL, 0);
+ return (mem / 1024);
+#else
QRegExp rx( "MemTotal:\\s*(\\d+)" );
rx.search( meminfo );
return ( rx.cap(1).toInt() );
+#endif
}
int MemSensor::getMemFree()
{
+#ifdef __FreeBSD__
+ static int mem = 0;
+ size_t size = sizeof(mem);
+
+ sysctlbyname("vm.stats.vm.v_free_count", &mem, &size, NULL, 0);
+ return (pagetok(mem));
+#else
QRegExp rx( "MemFree:\\s*(\\d+)" );
rx.search( meminfo );
return ( rx.cap(1).toInt() );
+#endif
}
int MemSensor::getBuffers()
{
+#ifdef __FreeBSD__
+ static int mem = 0;
+ size_t size = sizeof(mem);
+
+ sysctlbyname("vfs.bufspace", &mem, &size, NULL, 0);
+ return (mem / 1024);
+#else
QRegExp rx( "Buffers:\\s*(\\d+)" );
rx.search( meminfo );
return ( rx.cap(1).toInt() );
+#endif
}
int MemSensor::getCached()
{
+#ifdef __FreeBSD__
+ static int mem = 0;
+ size_t size = sizeof(mem);
+
+ sysctlbyname("vm.stats.vm.v_cache_count", &mem, &size, NULL, 0);
+ return (pagetok(mem));
+#else
QRegExp rx1( "Cached:\\s*(\\d+)" );
QRegExp rx2( "SwapCached:\\s*(\\d+)" );
rx1.search( meminfo );
rx2.search( meminfo );
return ( rx1.cap(1).toInt() + rx2.cap(1).toInt() );
+#endif
}
int MemSensor::getSwapTotal()
{
+#ifdef __FreeBSD__
+# if __FreeBSD_version < 500018
+ return(swapTotal);
+# else
+ int n = -1;
+ int pagesize = getpagesize();
+ int retavail = 0;
+
+ if (kd != NULL)
+ n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
+
+ if (n < 0 || swapinfo.ksw_total == 0)
+ return(0);
+
+ retavail = swapinfo.ksw_total * pagesize / 1024;
+
+ return(retavail);
+# endif
+#else
QRegExp rx( "SwapTotal:\\s*(\\d+)" );
rx.search( meminfo );
return ( rx.cap(1).toInt() );
+#endif
}
int MemSensor::getSwapFree()
{
+#ifdef __FreeBSD__
+# if __FreeBSD_version < 500018
+ return(swapTotal - swapUsed);
+# else
+ int n = -1;
+ int pagesize = getpagesize();
+ int retfree = 0;
+
+ if (kd != NULL)
+ n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
+ if (n < 0 || swapinfo.ksw_total == 0)
+ return(0);
+
+ retfree = (swapinfo.ksw_total - swapinfo.ksw_used) * pagesize / 1024;
+
+ return(retfree);
+# endif
+#else
QRegExp rx( "SwapFree:\\s*(\\d+)" );
rx.search( meminfo );
return ( rx.cap(1).toInt() );
+#endif
}
-
void MemSensor::readValues()
{
+#ifdef __FreeBSD__
+# if __FreeBSD_version < 500018
+ ksp.clearArguments();
+ ksp << "swapinfo";
+ ksp.start( KProcess::NotifyOnExit,KProcIO::Stdout);
+# endif
+#else
QFile file("/proc/meminfo");
QString line;
if ( file.open(IO_ReadOnly | IO_Translate) )
@@ -77,15 +216,21 @@
meminfo = t.read();
file.close();
}
+#endif
}
void MemSensor::update()
{
+#if (defined(__FreeBSD__) && __FreeBSD_version < 500018)
readValues();
+#endif
QString format;
SensorParams *sp;
Meter *meter;
QObjectListIt it( *objList );
+#if (defined(__FreeBSD__) && __FreeBSD_version < 500018)
+ bool set = false;
+#endif
int totalMem = getMemTotal();
int usedMem = totalMem - getMemFree();
@@ -96,6 +241,12 @@
while (it != 0)
{
sp = (SensorParams*)(*it);
+#if (defined(__FreeBSD__) && __FreeBSD_version < 500018)
+ if ( (!MaxSet) && (totalSwap > 0) ) {
+ setMaxValue(sp);
+ bool set = true;
+ }
+#endif
meter = sp->getMeter();
format = sp->getParam("FORMAT");
if (format.length() == 0 )
@@ -118,6 +269,11 @@
meter->setValue(format);
++it;
}
+#if (defined(__FreeBSD__) && __FreeBSD_version < 500018)
+ if (set)
+ MaxSet = true;
+#endif
+
}
void MemSensor::setMaxValue( SensorParams *sp )
@@ -133,7 +289,6 @@
}
if( f=="%fm" || f== "%um" || f=="%fmb" || f=="%umb" )
meter->setMax( getMemTotal() / 1024 );
-
if( f=="%fs" || f== "%us" )
meter->setMax( getSwapTotal() / 1024 );
}