00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <tqglobal.h>
00012
00013 #ifdef __FreeBSD__
00014 #include <sys/time.h>
00015 #include <sys/dkstat.h>
00016 #include <sys/param.h>
00017 #include <sys/sysctl.h>
00018 #include <sys/resource.h>
00019 #endif
00020
00021 #if defined(Q_OS_NETBSD)
00022 #include <sys/param.h>
00023 #include <sys/sysctl.h>
00024 #include <sys/sched.h>
00025 #endif
00026
00027 #include "cpusensor.h"
00028
00029 CPUSensor::CPUSensor( TQString cpu, int interval ) :
00030 Sensor(interval), userTicks(0), sysTicks(0), niceTicks(0), idleTicks(0)
00031 {
00032 cpuNbr = cpu;
00033 TQRegExp rx("^\\d+$");
00034 if( rx.search( cpu.lower() ) == -1)
00035 cpuNbr = "";
00036 cpuNbr = "cpu"+cpuNbr;
00037 getCPULoad();
00038 }
00039
00040 CPUSensor::~CPUSensor()
00041 {
00042 }
00043
00044 void CPUSensor::getTicks (long &u,long &s,long &n,long &i)
00045 {
00046 #ifdef __FreeBSD__
00047 static long cp_time[CPUSTATES];
00048
00049 size_t size = sizeof(cp_time);
00050
00051
00052 if (sysctlbyname("kern.cp_time", &cp_time, &size, NULL, 0) != -1) {
00053 u = cp_time[CP_USER];
00054 s = cp_time[CP_SYS] + cp_time[CP_INTR];
00055 n = cp_time[CP_NICE];
00056 i = cp_time[CP_IDLE];
00057 }
00058 #else
00059 #if defined(Q_OS_NETBSD)
00060 static uint64_t cp_time[CPUSTATES];
00061
00062 size_t size = sizeof(cp_time);
00063
00064
00065 if (sysctlbyname("kern.cp_time", &cp_time, &size, NULL, 0) != -1) {
00066 u = cp_time[CP_USER];
00067 s = cp_time[CP_SYS] + cp_time[CP_INTR];
00068 n = cp_time[CP_NICE];
00069 i = cp_time[CP_IDLE];
00070 }
00071 #else
00072 TQFile file("/proc/stat");
00073 TQString line;
00074 if ( file.open(IO_ReadOnly | IO_Translate) )
00075 {
00076 TQTextStream t( &file );
00077 TQRegExp rx( cpuNbr+"\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)");
00078 line = t.readLine();
00079 rx.search( line );
00080 while( (line = t.readLine()) !=0 && rx.cap(0) == "" )
00081 {
00082 rx.search( line );
00083 }
00084
00085 u = rx.cap(1).toLong();
00086
00087 n = rx.cap(2).toLong();
00088
00089 s = rx.cap(3).toLong();
00090
00091 i = rx.cap(4).toLong();
00092 file.close();
00093 }
00094 #endif
00095 #endif
00096 else
00097 {
00098 u = 0;
00099 s = 0;
00100 n = 0;
00101 i = 0;
00102 }
00103 }
00104
00105 int CPUSensor::getCPULoad()
00106 {
00107 long uTicks, sTicks, nTicks, iTicks;
00108
00109 getTicks(uTicks, sTicks, nTicks, iTicks);
00110
00111 const long totalTicks = ((uTicks - userTicks) +
00112 (sTicks - sysTicks) +
00113 (nTicks - niceTicks) +
00114 (iTicks - idleTicks));
00115
00116 int load = (totalTicks == 0) ? 0 : (int) ( 100.0 * ( (uTicks+sTicks+nTicks) - (userTicks+sysTicks+niceTicks))/( totalTicks+0.001) + 0.5 );
00117 user = (totalTicks == 0) ? 0 : (int) ( 100.0 * ( uTicks - userTicks)/( totalTicks+0.001) + 0.5 );
00118 idle = (totalTicks == 0) ? 0 : (int) ( 100.0 * ( iTicks - idleTicks)/( totalTicks+0.001) + 0.5 );
00119 system = (totalTicks == 0) ? 0 : (int) ( 100.0 * ( sTicks - sysTicks)/( totalTicks+0.001) + 0.5 );
00120 nice = (totalTicks == 0) ? 0 : (int) ( 100.0 * ( nTicks - niceTicks)/( totalTicks+0.001) + 0.5 );
00121
00122 userTicks = uTicks;
00123 sysTicks = sTicks;
00124 niceTicks = nTicks;
00125 idleTicks = iTicks;
00126
00127 return load;
00128 }
00129
00130 void CPUSensor::update()
00131 {
00132 SensorParams *sp;
00133 Meter *meter;
00134 TQString format;
00135 int load = getCPULoad();
00136
00137 TQObjectListIt it( *objList );
00138 while (it != 0)
00139 {
00140 sp = (SensorParams*)(*it);
00141 meter = sp->getMeter();
00142 format = sp->getParam( "FORMAT" );
00143
00144 if( format.length() == 0)
00145 {
00146 format = "%v";
00147 }
00148 format.replace( TQRegExp("%load", false), TQString::number( load ) );
00149 format.replace( TQRegExp("%user", false), TQString::number( user ) );
00150 format.replace( TQRegExp("%nice", false), TQString::number( nice ) );
00151 format.replace( TQRegExp("%idle", false), TQString::number( idle ) );
00152 format.replace( TQRegExp("%system", false), TQString::number( system ) );
00153 format.replace( TQRegExp("%v", false), TQString::number( load ) );
00154
00155 meter->setValue( format );
00156 ++it;
00157 }
00158 }
00159
00160 void CPUSensor::setMaxValue( SensorParams *sp )
00161 {
00162 Meter *meter;
00163 meter = sp->getMeter();
00164 meter->setMax( 100 );
00165 }
00166
00167 #include "cpusensor.moc"