/* * SystemBackendProc.cpp * * Copyright (C) 2008 Matthias Schiffer * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along * with this program. If not, see . */ #include "SystemBackendProc.h" #include #include #include namespace Mad { namespace Modules { namespace SystemBackendProc { void SystemBackendProc::getUptimeInfo(unsigned long *uptime, unsigned long *idleTime) throw(Core::Exception) { application->getThreadManager()->detach(); uptimeFile.seekg(0, std::ios::beg); if(!uptimeFile.good()) throw(Core::Exception(Core::Exception::NOT_AVAILABLE)); float f; uptimeFile >> f; if(!uptimeFile.good()) throw(Core::Exception(Core::Exception::NOT_AVAILABLE)); if(uptime) *uptime = (unsigned long)f; uptimeFile >> f; if(uptimeFile.good() && idleTime) *idleTime = (unsigned long)f; } void SystemBackendProc::getMemoryInfo(unsigned long *totalMem, unsigned long *freeMem, unsigned long *totalSwap, unsigned long *freeSwap) throw(Core::Exception) { application->getThreadManager()->detach(); if(totalMem) *totalMem = 0; if(freeMem) *freeMem = 0; if(totalSwap) *totalSwap = 0; if(freeSwap) *freeSwap = 0; meminfoFile.seekg(0, std::ios::beg); if(!meminfoFile.good()) throw(Core::Exception(Core::Exception::NOT_AVAILABLE)); while(!meminfoFile.eof() && meminfoFile.good()) { std::string line; std::getline(meminfoFile, line); char *name = new char[line.length()+1]; // is always long enough unsigned long value; if(std::sscanf(line.c_str(), "%s %lu", name, &value) == 2) { if(std::strcmp(name, "MemTotal:") == 0 && totalMem) *totalMem = value; else if(std::strcmp(name, "MemFree:") == 0 && freeMem) *freeMem = value; else if(std::strcmp(name, "SwapTotal:") == 0 && totalSwap) *totalSwap = value; else if(std::strcmp(name, "SwapFree:" ) == 0 && freeSwap) *freeSwap = value; } delete [] name; if((!totalMem || *totalMem) && (!freeMem || *freeMem) && (!totalSwap || *totalSwap) && (!freeSwap || *freeSwap)) break; } } void SystemBackendProc::getLoadInfo(unsigned long *currentLoad, unsigned long *nProcesses, float *loadAvg1, float *loadAvg5, float *loadAvg15) throw(Core::Exception) { application->getThreadManager()->detach(); unsigned long currentLoadValue = 0, nProcessesValue = 0; float loadAvg1Value = 0, loadAvg5Value = 0, loadAvg15Value = 0; loadFile.seekg(0, std::ios::beg); if(!loadFile.good()) throw(Core::Exception(Core::Exception::NOT_AVAILABLE)); std::string line; std::getline(loadFile, line); if(line.empty()) throw(Core::Exception(Core::Exception::NOT_AVAILABLE)); std::sscanf(line.c_str(), "%f %f %f %lu/%lu", &loadAvg1Value, &loadAvg5Value, &loadAvg15Value, ¤tLoadValue, &nProcessesValue); if(currentLoad) *currentLoad = currentLoadValue; if(nProcesses) *nProcesses = nProcessesValue; if(loadAvg1) *loadAvg1 = loadAvg1Value; if(loadAvg5) *loadAvg5 = loadAvg5Value; if(loadAvg15) *loadAvg15 = loadAvg15Value; } } } }