• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • superkaramba
 

superkaramba

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"

superkaramba

Skip menu "superkaramba"
  • Main Page
  • Alphabetical List
  • Class List
  • File List
  • Class Members

superkaramba

Skip menu "superkaramba"
  • kcalc
  •   knumber
  • superkaramba
Generated for superkaramba by doxygen 1.7.1
This website is maintained by Timothy Pearson.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. |