163 lines
3.8 KiB
C++
163 lines
3.8 KiB
C++
/*******************************************************************************
|
|
* *
|
|
* Société de Transports de Montréal. *
|
|
* 2012 *
|
|
* *
|
|
* Projet Zones Tests *
|
|
* *
|
|
* *
|
|
* *
|
|
*******************************************************************************/
|
|
/*
|
|
Description:
|
|
Cette classe permet de connaître la quantité de RAM utilisée par le programme.
|
|
|
|
*/
|
|
|
|
/* ************************************************************************** */
|
|
/* Revision:
|
|
### 20121219 JFM
|
|
Verision d'origine.
|
|
|
|
### YYYYMMDD Description du besoin ou du bug
|
|
Description du changement.
|
|
*/
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#include "RamMonitor.h"
|
|
#include <QDateTime>
|
|
#include <unistd.h>
|
|
|
|
//singleton instantiation
|
|
CRamMonitor CRamMonitor::mSingleton;
|
|
|
|
CRamMonitor::CRamMonitor()
|
|
{
|
|
mLastRamUsage = 0;
|
|
GetRamUsage();
|
|
|
|
connect(&mRamUsageTimer,SIGNAL(timeout()),this,SLOT(RamUsageTimerExpired()));
|
|
|
|
QString FileName;
|
|
FileName = "./LOG/RamLog.csv";
|
|
|
|
#ifdef LOG_RAM_USAGE
|
|
mRamLogFile = new QFile(FileName);
|
|
if(mRamLogFile)
|
|
{
|
|
mRamLogFile->open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text | QIODevice::Unbuffered);
|
|
|
|
QString temp;
|
|
mRamLogFile->write(temp.sprintf("********************************************************************\n").toAscii().data());
|
|
mRamLogFile->write(temp.sprintf("Création le %s à %s\n",QDateTime::currentDateTime().date().toString("yyyy-MM-dd").toAscii().data(),QDateTime::currentDateTime().time().toString("hh:mm:ss").toAscii().data()).toAscii().data());
|
|
mRamLogFile->write(temp.sprintf("********************************************************************\n").toAscii().data());
|
|
}
|
|
#endif
|
|
}
|
|
|
|
CRamMonitor::~CRamMonitor()
|
|
{
|
|
#ifdef LOG_RAM_USAGE
|
|
mRamLogFile->close();
|
|
delete mRamLogFile;
|
|
#endif
|
|
}
|
|
|
|
long CRamMonitor::GetRamUsage(bool print)
|
|
{
|
|
long rss = 0;
|
|
FILE *fp = NULL;
|
|
if((fp = fopen("/proc/self/statm","r")) == NULL)
|
|
{
|
|
fclose(fp);
|
|
if(print)
|
|
qDebug("cannot open statm");
|
|
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
if(fscanf(fp,"%*s%ld",&rss) != 1)
|
|
{
|
|
fclose(fp);
|
|
|
|
if(print)
|
|
qDebug("Cannot read ram size");
|
|
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
fclose(fp);
|
|
rss *= (long)sysconf(_SC_PAGESIZE);
|
|
|
|
if(print)
|
|
qDebug("Ram usage: %ld",rss);
|
|
|
|
mLastRamUsage = rss;
|
|
return rss;
|
|
}
|
|
}
|
|
|
|
//return rss;
|
|
}
|
|
|
|
long CRamMonitor::GetRamDelta(bool print)
|
|
{
|
|
long rss = 0;
|
|
FILE *fp = NULL;
|
|
if((fp = fopen("/proc/self/statm","r")) == NULL)
|
|
{
|
|
fclose(fp);
|
|
if(print)
|
|
qDebug("cannot open statm");
|
|
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
if(fscanf(fp,"%*s%ld",&rss) != 1)
|
|
{
|
|
fclose(fp);
|
|
|
|
if(print)
|
|
qDebug("Cannot read ram size");
|
|
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
fclose(fp);
|
|
rss *= (long)sysconf(_SC_PAGESIZE);
|
|
|
|
if(print)
|
|
{
|
|
qDebug("Ram usage: Previous = %ld [%ldk], Actual = %ld [%ldk], Delta = %ld [%ldk]",mLastRamUsage,mLastRamUsage/1024,rss,rss/1024,(rss-mLastRamUsage),(rss-mLastRamUsage)/1024);
|
|
#ifdef LOG_RAM_USAGE
|
|
mRamLogFile->write(QString().sprintf("%ld\n",rss).toAscii().data());
|
|
#endif
|
|
}
|
|
|
|
mLastRamUsage = rss;
|
|
return rss;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CRamMonitor::StartTimer()
|
|
{
|
|
mRamUsageTimer.setSingleShot(false);
|
|
mRamUsageTimer.start(5000);
|
|
}
|
|
|
|
void CRamMonitor::StopTimer()
|
|
{
|
|
mRamUsageTimer.stop();
|
|
}
|
|
|
|
void CRamMonitor::RamUsageTimerExpired()
|
|
{
|
|
GetRamDelta(true);
|
|
}
|