cpusensor.cpp
00001 /*************************************************************************** 00002 * Copyright (C) 2003 by Hans Karlsson * 00003 * karlsson.h@home.se * 00004 * * 00005 * This program is free software; you can redistribute it and/or modify * 00006 * it under the terms of the GNU General Public License as published by * 00007 * the Free Software Foundation; either version 2 of the License, or * 00008 * (at your option) any later version. * 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 /* get the cp_time array */ 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 /* get the cp_time array */ 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 ); // use a text stream 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 //user 00085 u = rx.cap(1).toLong(); 00086 //nice 00087 n = rx.cap(2).toLong(); 00088 //system 00089 s = rx.cap(3).toLong(); 00090 //idle 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"