///////////////////////////////////////////////////////////////////////////////
// LameXP - Audio Encoder Front-End
-// Copyright (C) 2004-2014 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2015 LoRd_MuldeR <MuldeR2@GMX.de>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
#include "Tool_Abstract.h"
+//Internal
#include "Global.h"
-#include "JobObject.h"
+//MUtils
+#include <MUtils/Global.h>
+#include <MUtils/OSSupport.h>
+#include <MUtils/JobObject.h>
+
+//Qt
#include <QProcess>
#include <QMutex>
#include <QMutexLocker>
#include <QLibrary>
#include <QProcessEnvironment>
#include <QDir>
+#include <QElapsedTimer>
/*
- * Static vars
+ * Static Objects
*/
-quint64 AbstractTool::s_lastLaunchTime = 0ui64;
-QMutex AbstractTool::s_mutex_startProcess;
-JobObject *AbstractTool::s_jobObject = NULL;
-unsigned int AbstractTool::s_jobObjRefCount = 0U;
+QScopedPointer<MUtils::JobObject> AbstractTool::s_jobObjectInstance;
+QScopedPointer<QElapsedTimer> AbstractTool::s_startProcessTimer;
+
+/*
+ * Synchronization
+ */
+QMutex AbstractTool::s_startProcessMutex;
+QMutex AbstractTool::s_createObjectMutex;
+
+/*
+ * Ref Counter
+ */
+quint64 AbstractTool::s_referenceCounter = 0ui64;
/*
* Const
*/
-static const unsigned int START_DELAY = 333; //in milliseconds
-static const quint64 START_DELAY_NANO = START_DELAY * 1000 * 10; //in 100-nanosecond intervals
+static const qint64 START_DELAY = 64i64; //in milliseconds
/*
* Constructor
*/
AbstractTool::AbstractTool(void)
+:
+ m_firstLaunch(true)
+
{
- QMutexLocker lock(&s_mutex_startProcess);
+ QMutexLocker lock(&s_createObjectMutex);
- if(s_jobObjRefCount < 1U)
+ if(s_referenceCounter++ == 0)
{
- s_jobObject = new JobObject();
- s_jobObjRefCount = 1U;
- }
- else
- {
- s_jobObjRefCount++;
+ s_jobObjectInstance.reset(new MUtils::JobObject());
+ s_startProcessTimer.reset(new QElapsedTimer());
+ if(!MUtils::OS::setup_timer_resolution())
+ {
+ qWarning("Failed to setup system timer resolution!");
+ }
}
-
- m_firstLaunch = true;
}
/*
*/
AbstractTool::~AbstractTool(void)
{
- QMutexLocker lock(&s_mutex_startProcess);
+ QMutexLocker lock(&s_createObjectMutex);
- if(s_jobObjRefCount >= 1U)
+ if(--s_referenceCounter == 0)
{
- s_jobObjRefCount--;
- if(s_jobObjRefCount < 1U)
+ s_jobObjectInstance.reset(NULL);
+ s_startProcessTimer.reset(NULL);
+ if(!MUtils::OS::reset_timer_resolution())
{
- LAMEXP_DELETE(s_jobObject);
+ qWarning("Failed to reset system timer resolution!");
}
}
}
*/
bool AbstractTool::startProcess(QProcess &process, const QString &program, const QStringList &args)
{
- QMutexLocker lock(&s_mutex_startProcess);
-
- if(lamexp_current_file_time() <= s_lastLaunchTime)
+ QMutexLocker lock(&s_startProcessMutex);
+
+ if((!s_startProcessTimer.isNull()) && s_startProcessTimer->isValid())
{
- lamexp_sleep(START_DELAY);
+ 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");
- lamexp_init_process(process, QFileInfo(program).absolutePath());
+ MUtils::init_process(process, QFileInfo(program).absolutePath());
process.start(program, args);
if(process.waitForStarted())
{
- if(s_jobObject)
+ if(!s_jobObjectInstance.isNull())
{
- if(!s_jobObject->addProcessToJob(&process))
+ if(!s_jobObjectInstance->addProcessToJob(&process))
{
qWarning("Failed to assign process to job object!");
}
}
- lamexp_change_process_priority(&process, -1);
- lock.unlock();
+ MUtils::OS::change_process_priority(&process, -1);
if(m_firstLaunch)
{
m_firstLaunch = false;
}
- s_lastLaunchTime = lamexp_current_file_time() + START_DELAY_NANO;
+ s_startProcessTimer->start();
return true;
}
process.kill();
process.waitForFinished(-1);
- s_lastLaunchTime = lamexp_current_file_time() + START_DELAY_NANO;
+ s_startProcessTimer->start();
return false;
}