#define VER_LAMEXP_MINOR_LO 1
#define VER_LAMEXP_TYPE Beta
#define VER_LAMEXP_PATCH 5
-#define VER_LAMEXP_BUILD 1617
+#define VER_LAMEXP_BUILD 1619
#define VER_LAMEXP_CONFG 1558
///////////////////////////////////////////////////////////////////////////////
#include <QTextStream>
#include <QScrollBar>
#include <QCloseEvent>
+#include <QElapsedTimer>
#include <QWindowsVistaStyle>
#include <QWindowsXPStyle>
m_disque(NULL),
m_disqueTimer(NULL),
m_rotateNext(false),
- m_disqueDelay(_I64_MAX),
m_lastTab(0)
{
//Init the dialog, from the .ui file
void AboutDialog::moveDisque(void)
{
int delta = 2;
- const qint64 perfFrequ = MUtils::OS::perfcounter_freq();
- const qint64 perfCount = MUtils::OS::perfcounter_read();
+ QElapsedTimer elapsedTimer;
+ elapsedTimer.start();
- if((perfFrequ >= 0) && (perfCount >= 0))
+ if((!m_disqueDelay.isNull()) && m_disqueDelay->isValid())
{
- if(m_disqueDelay != _I64_MAX)
- {
- const double delay = static_cast<double>(perfCount) - static_cast<double>(m_disqueDelay);
- delta = qMax(1, qMin(128, static_cast<int>(ceil(delay / static_cast<double>(perfFrequ) / 0.00512))));
- }
- m_disqueDelay = perfCount;
+ const qint64 delay = m_disqueDelay->restart();
+ delta = qBound(1, static_cast<int>(ceil(static_cast<double>(delay) / 5.12)), 128);
+ }
+ else
+ {
+ m_disqueDelay.reset(new QElapsedTimer());
+ m_disqueDelay->start();
}
if(m_disque)
class QLabel;
class QPixmap;
class QTimer;
+class QElapsedTimer;
class SettingsModel;
//AboutDialog class
double m_discOpacity;
QPixmap *m_cartoon[4];
bool m_rotateNext;
- __int64 m_disqueDelay;
+ QScopedPointer<QElapsedTimer> m_disqueDelay;
void initInformationTab(void);
void initContributorsTab(void);
#include <QProgressDialog>
#include <QResizeEvent>
#include <QTime>
+#include <QElapsedTimer>
#include <QThreadPool>
#include <math.h>
#include <float.h>
+#include <stdint.h>
////////////////////////////////////////////////////////////
m_skippedJobs.clear();
m_userAborted = false;
m_forcedAbort = false;
- m_timerStart = 0I64;
}
////////////////////////////////////////////////////////////
m_initThreads = m_threadPool->maxThreadCount();
QTimer::singleShot(100, this, SLOT(initNextJob()));
- m_timerStart = MUtils::OS::perfcounter_read();
+
+ m_totalTime.reset(new QElapsedTimer());
+ m_totalTime->start();
}
void ProcessingDialog::initNextJob(void)
}
else
{
- const qint64 counter = MUtils::OS::perfcounter_read();
- const qint64 frequency = MUtils::OS::perfcounter_freq();
- if((counter >= 0I64) && (frequency >= 0))
+ if((!m_totalTime.isNull()) && m_totalTime->isValid())
{
- if((m_timerStart >= 0I64) && (m_timerStart < counter))
- {
- double timeElapsed = static_cast<double>(counter - m_timerStart) / static_cast<double>(frequency);
- m_progressModel->addSystemMessage(tr("Process finished after %1.").arg(time2text(timeElapsed)), ProgressModel::SysMsg_Performance);
- }
+ m_progressModel->addSystemMessage(tr("Process finished after %1.").arg(time2text(m_totalTime->elapsed())), ProgressModel::SysMsg_Performance);
+ m_totalTime->invalidate();
}
if(m_failedJobs.count() > 0)
return true;
}
-QString ProcessingDialog::time2text(const double timeVal) const
+QString ProcessingDialog::time2text(const qint64 &msec) const
{
- double intPart = 0;
- double frcPart = modf(timeVal, &intPart);
-
- QTime time = QTime().addSecs(qRound(intPart)).addMSecs(qRound(frcPart * 1000.0));
+ const qint64 MILLISECONDS_PER_DAY = 86399999; //24x60x60x1000 - 1
+ const QTime time = QTime().addMSecs(qMin(msec, MILLISECONDS_PER_DAY));
QString a, b;
if(time.hour() > 0)
{
- a = tr("%n hour(s)", "", time.hour());
+ a = tr("%n hour(s)", "", time.hour());
b = tr("%n minute(s)", "", time.minute());
}
else if(time.minute() > 0)
}
else
{
- a = tr("%n second(s)", "", time.second());
+ a = tr("%n second(s)", "", time.second());
b = tr("%n millisecond(s)", "", time.msec());
}
class QMenu;
class QModelIndex;
class QMovie;
+class QThreadPool;
+class QElapsedTimer;
class RAMObserverThread;
class SettingsModel;
-class QThreadPool;
-class lamexp_icon_t;
enum shutdownFlag_t
{
AudioFileModel updateMetaInfo(AudioFileModel &audioFile);
void writePlayList(void);
bool shutdownComputer(void);
- QString time2text(const double timeVal) const;
+ QString time2text(const qint64 &msec) const;
QThreadPool *m_threadPool;
QList<AudioFileModel> m_pendingJobs;
CPUObserverThread *m_cpuObserver;
RAMObserverThread *m_ramObserver;
DiskObserverThread *m_diskObserver;
- qint64 m_timerStart;
+ QScopedPointer<QElapsedTimer> m_totalTime;
int m_progressViewFilter;
QColor *m_defaultColor;
};
#include <QThreadPool>
#include <QMutex>
#include <QQueue>
+#include <QElapsedTimer>
/* helper macros */
#define PRINT_CPU_TYPE(X) case X: qDebug("Selected CPU is: " #X)
LockedFile::selfTest();
ExtractorTask::clearFlags();
- const long long timeExtractStart = MUtils::OS::perfcounter_read();
+ //Start the timer
+ QElapsedTimer timeExtractStart;
+ timeExtractStart.start();
//Extract all files
while(!(queueToolName.isEmpty() || queueChecksum.isEmpty() || queueVersInfo.isEmpty() || queueCpuTypes.isEmpty() || queueVersions.isEmpty()))
pool->waitForDone();
MUTILS_DELETE(pool);
- const long long timeExtractEnd = MUtils::OS::perfcounter_read();
+ //Performance measure
+ const qint64 delayExtract = timeExtractStart.elapsed();
+ timeExtractStart.invalidate();
//Make sure all files were extracted correctly
if(ExtractorTask::getExcept())
}
//Check delay
- const double delayExtract = static_cast<double>(timeExtractEnd - timeExtractStart) / static_cast<double>(MUtils::OS::perfcounter_freq());
- if(delayExtract > g_allowedExtractDelay)
+ if((double(delayExtract) / 1000.0) > g_allowedExtractDelay)
{
m_slowIndicator = true;
qWarning("Extracting tools took %.3f seconds -> probably slow realtime virus scanner.", delayExtract);
#include <QLibrary>
#include <QProcessEnvironment>
#include <QDir>
+#include <QElapsedTimer>
/*
- * Job Object
+ * Static Objects
*/
-QScopedPointer<JobObject> AbstractTool::s_jobObject;
-QMutex AbstractTool::s_jobObjMtx;
-quint64 AbstractTool::s_jobObjCnt = 0ui64;
+QScopedPointer<JobObject> AbstractTool::s_jobObjectInstance;
+QScopedPointer<QElapsedTimer> AbstractTool::s_startProcessTimer;
/*
- * Process Timer
+ * Synchronization
*/
-quint64 AbstractTool::s_startProcessTimer = 0ui64;
-QMutex AbstractTool::s_startProcessMutex;
+QMutex AbstractTool::s_startProcessMutex;
+QMutex AbstractTool::s_createObjectMutex;
+
+/*
+ * Ref Counter
+ */
+quint64 AbstractTool::s_referenceCounter = 0ui64;
/*
* Const
*/
-static const unsigned int START_DELAY = 100U; //in milliseconds
-static const quint64 START_DELAY_NANO = quint64(START_DELAY) * 10000ui64; //in 100-nanosecond intervals
+static const qint64 START_DELAY = 64i64; //in milliseconds
/*
* Constructor
m_firstLaunch(true)
{
- QMutexLocker lock(&s_jobObjMtx);
+ QMutexLocker lock(&s_createObjectMutex);
- if(s_jobObjCnt++ == 0)
+ if(s_referenceCounter++ == 0)
{
- s_jobObject.reset(new JobObject());
+ s_jobObjectInstance.reset(new JobObject());
+ s_startProcessTimer.reset(new QElapsedTimer());
}
}
*/
AbstractTool::~AbstractTool(void)
{
- QMutexLocker lock(&s_jobObjMtx);
+ QMutexLocker lock(&s_createObjectMutex);
- if(--s_jobObjCnt == 0)
+ if(--s_referenceCounter == 0)
{
- s_jobObject.reset(NULL);
+ s_jobObjectInstance.reset(NULL);
+ s_startProcessTimer.reset(NULL);
}
}
{
QMutexLocker lock(&s_startProcessMutex);
- quint64 currentFileTime = MUtils::OS::current_file_time();
- while(currentFileTime < s_startProcessTimer)
+ if((!s_startProcessTimer.isNull()) && s_startProcessTimer->isValid())
{
- const quint64 expectedFileTime = s_startProcessTimer;
- lock.unlock();
- MUtils::OS::sleep_ms(size_t((expectedFileTime - currentFileTime) / 10000ui64) + 1U);
- lock.relock();
- currentFileTime = MUtils::OS::current_file_time();
+ qint64 elapsed = s_startProcessTimer->elapsed();
+ while(elapsed < START_DELAY)
+ {
+ lock.unlock();
+ MUtils::OS::sleep_ms((size_t)(START_DELAY - elapsed));
+ lock.relock();
+ elapsed = s_startProcessTimer->elapsed();
+ }
}
emit messageLogged(commandline2string(program, args) + "\n");
if(process.waitForStarted())
{
- if(!s_jobObject.isNull())
+ if(!s_jobObjectInstance.isNull())
{
- if(!s_jobObject->addProcessToJob(&process))
+ if(!s_jobObjectInstance->addProcessToJob(&process))
{
qWarning("Failed to assign process to job object!");
}
m_firstLaunch = false;
}
- s_startProcessTimer = MUtils::OS::current_file_time() + START_DELAY_NANO;
+ s_startProcessTimer->start();
return true;
}
process.kill();
process.waitForFinished(-1);
- s_startProcessTimer = MUtils::OS::current_file_time() + START_DELAY_NANO;
+ s_startProcessTimer->start();
return false;
}
class QMutex;
class QProcess;
+class QElapsedTimer;
class JobObject;
class AbstractTool : public QObject
static const int m_processTimeoutInterval = 600000;
private:
- static quint64 s_startProcessTimer;
- static QMutex s_startProcessMutex;
+ static QScopedPointer<JobObject> s_jobObjectInstance;
+ static QScopedPointer<QElapsedTimer> s_startProcessTimer;
- static QScopedPointer<JobObject> s_jobObject;
- static QMutex s_jobObjMtx;
- static quint64 s_jobObjCnt;
+ static QMutex s_startProcessMutex;
+ static QMutex s_createObjectMutex;
+
+ static quint64 s_referenceCounter;
bool m_firstLaunch;
};