summaryrefslogtreecommitdiffstats
path: root/superkaramba/src/cpusensor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'superkaramba/src/cpusensor.cpp')
-rw-r--r--superkaramba/src/cpusensor.cpp167
1 files changed, 167 insertions, 0 deletions
diff --git a/superkaramba/src/cpusensor.cpp b/superkaramba/src/cpusensor.cpp
new file mode 100644
index 0000000..bc4b095
--- /dev/null
+++ b/superkaramba/src/cpusensor.cpp
@@ -0,0 +1,167 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Hans Karlsson *
+ * karlsson.h@home.se *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+
+#include <qglobal.h>
+
+#ifdef __FreeBSD__
+#include <sys/time.h>
+#include <sys/dkstat.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/resource.h>
+#endif
+
+#if defined(Q_OS_NETBSD)
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/sched.h>
+#endif
+
+#include "cpusensor.h"
+
+CPUSensor::CPUSensor( QString cpu, int interval ) :
+ Sensor(interval), userTicks(0), sysTicks(0), niceTicks(0), idleTicks(0)
+{
+ cpuNbr = cpu;
+ QRegExp rx("^\\d+$");
+ if( rx.search( cpu.lower() ) == -1)
+ cpuNbr = "";
+ cpuNbr = "cpu"+cpuNbr;
+ getCPULoad();
+}
+
+CPUSensor::~CPUSensor()
+{
+}
+
+void CPUSensor::getTicks (long &u,long &s,long &n,long &i)
+{
+#ifdef __FreeBSD__
+ static long cp_time[CPUSTATES];
+
+ size_t size = sizeof(cp_time);
+
+ /* get the cp_time array */
+ if (sysctlbyname("kern.cp_time", &cp_time, &size, NULL, 0) != -1) {
+ u = cp_time[CP_USER];
+ s = cp_time[CP_SYS] + cp_time[CP_INTR];
+ n = cp_time[CP_NICE];
+ i = cp_time[CP_IDLE];
+ }
+#else
+#if defined(Q_OS_NETBSD)
+ static uint64_t cp_time[CPUSTATES];
+
+ size_t size = sizeof(cp_time);
+
+ /* get the cp_time array */
+ if (sysctlbyname("kern.cp_time", &cp_time, &size, NULL, 0) != -1) {
+ u = cp_time[CP_USER];
+ s = cp_time[CP_SYS] + cp_time[CP_INTR];
+ n = cp_time[CP_NICE];
+ i = cp_time[CP_IDLE];
+ }
+#else
+ QFile file("/proc/stat");
+ QString line;
+ if ( file.open(IO_ReadOnly | IO_Translate) )
+ {
+ QTextStream t( &file ); // use a text stream
+ QRegExp rx( cpuNbr+"\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)");
+ line = t.readLine();
+ rx.search( line );
+ while( (line = t.readLine()) !=0 && rx.cap(0) == "" )
+ {
+ rx.search( line );
+ }
+ //user
+ u = rx.cap(1).toLong();
+ //nice
+ n = rx.cap(2).toLong();
+ //system
+ s = rx.cap(3).toLong();
+ //idle
+ i = rx.cap(4).toLong();
+ file.close();
+ }
+#endif
+#endif
+ else
+ {
+ u = 0;
+ s = 0;
+ n = 0;
+ i = 0;
+ }
+}
+
+int CPUSensor::getCPULoad()
+{
+ long uTicks, sTicks, nTicks, iTicks;
+
+ getTicks(uTicks, sTicks, nTicks, iTicks);
+
+ const long totalTicks = ((uTicks - userTicks) +
+ (sTicks - sysTicks) +
+ (nTicks - niceTicks) +
+ (iTicks - idleTicks));
+
+ int load = (totalTicks == 0) ? 0 : (int) ( 100.0 * ( (uTicks+sTicks+nTicks) - (userTicks+sysTicks+niceTicks))/( totalTicks+0.001) + 0.5 );
+ user = (totalTicks == 0) ? 0 : (int) ( 100.0 * ( uTicks - userTicks)/( totalTicks+0.001) + 0.5 );
+ idle = (totalTicks == 0) ? 0 : (int) ( 100.0 * ( iTicks - idleTicks)/( totalTicks+0.001) + 0.5 );
+ system = (totalTicks == 0) ? 0 : (int) ( 100.0 * ( sTicks - sysTicks)/( totalTicks+0.001) + 0.5 );
+ nice = (totalTicks == 0) ? 0 : (int) ( 100.0 * ( nTicks - niceTicks)/( totalTicks+0.001) + 0.5 );
+
+ userTicks = uTicks;
+ sysTicks = sTicks;
+ niceTicks = nTicks;
+ idleTicks = iTicks;
+
+ return load;
+}
+
+void CPUSensor::update()
+{
+ SensorParams *sp;
+ Meter *meter;
+ QString format;
+ int load = getCPULoad();
+
+ QObjectListIt it( *objList );
+ while (it != 0)
+ {
+ sp = (SensorParams*)(*it);
+ meter = sp->getMeter();
+ format = sp->getParam( "FORMAT" );
+
+ if( format.length() == 0)
+ {
+ format = "%v";
+ }
+ format.replace( QRegExp("%load", false), QString::number( load ) );
+ format.replace( QRegExp("%user", false), QString::number( user ) );
+ format.replace( QRegExp("%nice", false), QString::number( nice ) );
+ format.replace( QRegExp("%idle", false), QString::number( idle ) );
+ format.replace( QRegExp("%system", false), QString::number( system ) );
+ format.replace( QRegExp("%v", false), QString::number( load ) );
+
+ meter->setValue( format );
+ ++it;
+ }
+}
+
+void CPUSensor::setMaxValue( SensorParams *sp )
+{
+ Meter *meter;
+ meter = sp->getMeter();
+ meter->setMax( 100 );
+}
+
+#include "cpusensor.moc"