Some more improvements of ExtractorTask class.

This commit is contained in:
LoRd_MuldeR 2013-10-16 18:24:16 +02:00
parent 33e04007fb
commit 2f543e11ab

View File

@ -31,7 +31,6 @@
#include <QDir>
#include <QLibrary>
#include <QResource>
#include <QTime>
#include <QTextStream>
#include <QRunnable>
#include <QThreadPool>
@ -39,7 +38,10 @@
/* helper macros */
#define PRINT_CPU_TYPE(X) case X: qDebug("Selected CPU is: " #X)
/* constants */
static const double g_allowedExtractDelay = 12.0;
static const size_t BUFF_SIZE = 512;
////////////////////////////////////////////////////////////
// ExtractorTask class
@ -50,39 +52,63 @@ class ExtractorTask : public QRunnable
public:
ExtractorTask(const QDir &appDir, const QString &toolName, const QString &toolShortName, const QByteArray &toolHash, const unsigned int toolVersion, const QString &toolTag)
:
QRunnable(), m_appDir(appDir), m_toolName(toolName), m_toolShortName(toolShortName), m_toolHash(toolHash), m_toolVersion(toolVersion), m_toolTag(toolTag)
m_appDir(appDir),
m_toolName(toolName),
m_toolShortName(toolShortName),
m_toolHash(toolHash),
m_toolVersion(toolVersion),
m_toolTag(toolTag)
{
/* Nothing to do */
}
static void clearFlags(void)
{
s_mutex.lock();
s_bAbort = s_bCustom = false;
s_errMsg[0] = '\0';
s_mutex.unlock();
QMutexLocker lock(&s_mutex);
s_bExcept = false;
s_bCustom = false;
s_errMsg[0] = char(0);
}
static bool getAbort(void) { bool ret; s_mutex.lock(); ret = s_bAbort; s_mutex.unlock(); return ret; }
static bool getCustom(void) { bool ret; s_mutex.lock(); ret = s_bCustom; s_mutex.unlock(); return ret; }
static bool getExcept(void) { bool ret; QMutexLocker lock(&s_mutex); ret = s_bExcept; return ret; }
static bool getCustom(void) { bool ret; QMutexLocker lock(&s_mutex); ret = s_bCustom; return ret; }
static void getError(char *buffer, const size_t buffSize)
static bool getErrMsg(char *buffer, const size_t buffSize)
{
s_mutex.lock();
strncpy_s(buffer, 1024, s_errMsg, _TRUNCATE);
s_mutex.unlock();
QMutexLocker lock(&s_mutex);
if(s_errMsg[0])
{
strncpy_s(buffer, BUFF_SIZE, s_errMsg, _TRUNCATE);
return true;
}
return false;
}
protected:
void run(void)
{
try
{
if(!getExcept()) doExtract();
}
catch(char *errorMsg)
{
QMutexLocker lock(&s_mutex);
if(!s_bExcept)
{
s_bExcept = true;
strncpy_s(s_errMsg, BUFF_SIZE, errorMsg, _TRUNCATE);
lock.unlock();
qWarning("ExtractorTask error:\n%s", errorMsg);
}
}
}
void doExtract(void)
{
LockedFile *lockedFile = NULL;
unsigned int version = m_toolVersion;
if(!s_bAbort)
{
QFileInfo customTool(QString("%1/tools/%2/%3").arg(m_appDir.canonicalPath(), QString::number(lamexp_version_build()), m_toolShortName));
if(customTool.exists() && customTool.isFile())
{
@ -97,44 +123,28 @@ protected:
if(lockedFile)
{
//QMutexLocker lock(&s_mutex);
lamexp_register_tool(m_toolShortName, lockedFile, version, &m_toolTag);
}
}
}
catch(char *errorMsg)
{
qWarning("At least one of the required tools could not be initialized:\n%s", errorMsg);
if(s_mutex.tryLock())
{
if(!s_bAbort)
{
strncpy_s(s_errMsg, 1024, errorMsg, _TRUNCATE);
s_bAbort = true;
}
s_mutex.unlock();
}
}
}
private:
const QDir m_appDir;
const QString m_toolName;
const QString m_toolShortName;
const QString m_toolTag;
const unsigned int m_toolVersion;
const QByteArray m_toolHash;
const unsigned int m_toolVersion;
const QString m_toolTag;
static volatile bool s_bAbort;
static volatile bool s_bExcept;
static volatile bool s_bCustom;
static QMutex s_mutex;
static char s_errMsg[1024];
static char s_errMsg[BUFF_SIZE];
};
volatile bool ExtractorTask::s_bAbort = false;
volatile bool ExtractorTask::s_bCustom = false;
char ExtractorTask::s_errMsg[1024] = {'\0'};
QMutex ExtractorTask::s_mutex;
volatile bool ExtractorTask::s_bExcept = false;
volatile bool ExtractorTask::s_bCustom = false;
char ExtractorTask::s_errMsg[BUFF_SIZE] = {'\0'};
////////////////////////////////////////////////////////////
// Constructor
@ -199,9 +209,9 @@ void InitializationThread::run()
QMap<QString, QString> mapVersTag;
//Init properties
for(int i = 0; i < INT_MAX; i++)
for(int i = 0; true; i++)
{
if(!g_lamexp_tools[i].pcName && !g_lamexp_tools[i].pcHash && !g_lamexp_tools[i].uiVersion)
if(!(g_lamexp_tools[i].pcName || g_lamexp_tools[i].pcHash || g_lamexp_tools[i].uiVersion))
{
break;
}
@ -233,8 +243,7 @@ void InitializationThread::run()
LockedFile::selfTest();
ExtractorTask::clearFlags();
QTime timer;
timer.start();
const long long timeExtractStart = lamexp_perfcounter_value();
//Extract all files
while(!toolsList.isEmpty())
@ -258,7 +267,6 @@ void InitializationThread::run()
if(toolCpuType & cpuSupport)
{
pool->start(new ExtractorTask(appDir, toolName, toolShortName, toolHash, toolVersion, toolVersTag));
QThread::yieldCurrentThread();
}
}
catch(char *errorMsg)
@ -272,14 +280,20 @@ void InitializationThread::run()
pool->waitForDone();
LAMEXP_DELETE(pool);
const long long timeExtractEnd = lamexp_perfcounter_value();
//Make sure all files were extracted correctly
if(ExtractorTask::getAbort())
if(ExtractorTask::getExcept())
{
char errorMsg[BUFF_SIZE];
if(ExtractorTask::getErrMsg(errorMsg, BUFF_SIZE))
{
char errorMsg[1024];
ExtractorTask::getError(errorMsg, 1024);
qFatal("At least one of the required tools could not be initialized:\n%s", errorMsg);
return;
}
qFatal("At least one of the required tools could not be initialized!");
return;
}
//Make sure all files were extracted
if(!mapChecksum.isEmpty())
@ -302,7 +316,7 @@ void InitializationThread::run()
}
//Check delay
double delayExtract = static_cast<double>(timer.elapsed()) / 1000.0;
double delayExtract = static_cast<double>(timeExtractEnd - timeExtractStart) / static_cast<double>(lamexp_perfcounter_frequ());
if(delayExtract > g_allowedExtractDelay)
{
m_slowIndicator = true;
@ -311,7 +325,7 @@ void InitializationThread::run()
}
else
{
qDebug("Extracting the tools took %.3f seconds (OK).\n", delayExtract);
qDebug("Extracting the tools took %.5f seconds (OK).\n", delayExtract);
}
//Register all translations