add proto for task run

This commit is contained in:
Evgenii Alekseev 2017-03-10 07:28:51 +03:00
parent 2d8d501f02
commit 9000bf08a4
3 changed files with 100 additions and 3 deletions

View File

@ -121,6 +121,10 @@ public:
* task index * task index
*/ */
void remove(const long long _index); void remove(const long long _index);
/**
* @brief select and start task automatically
*/
void start();
/** /**
* @brief force start task * @brief force start task
* @param _index * @param _index
@ -156,6 +160,11 @@ public:
* new command line * new command line
*/ */
void setProcessLine(const QString _processLine); void setProcessLine(const QString _processLine);
/**
* @brief get used limits
* @return used system limits
*/
QueuedLimits::Limits usedLimits();
signals: signals:
/** /**

View File

@ -530,6 +530,9 @@ void QueuedCore::init(const QString &_configuration)
// dbus session // dbus session
initDBus(); initDBus();
// run!
m_processes->start();
} }

View File

@ -170,6 +170,45 @@ void QueuedProcessManager::remove(const long long _index)
} }
/**
* @fn start
*/
void QueuedProcessManager::start()
{
qCDebug(LOG_LIB) << "Start random task";
long long index = -1;
// gather used resources
QueuedLimits::Limits limits = usedLimits();
double weightedCpu
= limits.cpu == 0 ? 0.0 : QueuedSystemInfo::cpuWeight(limits.cpu);
double weightedMemory = limits.memory == 0
? 0.0
: QueuedSystemInfo::memoryWeight(limits.memory);
auto tasks = processes().values();
for (auto pr : tasks) {
// check limits first
if (((1.0 - weightedCpu)
< QueuedSystemInfo::cpuWeight(pr->nativeLimits().cpu))
&& ((1.0 - weightedMemory)
< QueuedSystemInfo::memoryWeight(pr->nativeLimits().memory)))
continue;
// now check nice level
if ((index > -1) && (pr->nice() < process(index)->nice()))
continue;
// now check index value
if ((index > -1) && (pr->index() > index))
continue;
// hmmm, looks like we found a candidate
index = pr->index();
}
if (index > -1)
return start(index);
}
/** /**
* @fn start * @fn start
*/ */
@ -184,6 +223,7 @@ void QueuedProcessManager::start(const long long _index)
} }
pr->start(); pr->start();
emit(taskStartTimeReceived(_index, QDateTime::currentDateTimeUtc()));
} }
@ -253,6 +293,52 @@ void QueuedProcessManager::setProcessLine(const QString _processLine)
} }
/**
* @fn usedLimits
*/
QueuedLimits::Limits QueuedProcessManager::usedLimits()
{
auto tasks = processes().values();
long long cpu = std::accumulate(
tasks.cbegin(), tasks.cend(), 0,
[](long long value, QueuedProcess *process) {
return process->pstate() == QueuedEnums::ProcessState::Running
? value + process->nativeLimits().cpu
: value;
});
long long gpu = std::accumulate(
tasks.cbegin(), tasks.cend(), 0,
[](long long value, QueuedProcess *process) {
return process->pstate() == QueuedEnums::ProcessState::Running
? value + process->nativeLimits().gpu
: value;
});
long long memory = std::accumulate(
tasks.cbegin(), tasks.cend(), 0,
[](long long value, QueuedProcess *process) {
return process->pstate() == QueuedEnums::ProcessState::Running
? value + process->nativeLimits().memory
: value;
});
long long gpumemory = std::accumulate(
tasks.cbegin(), tasks.cend(), 0,
[](long long value, QueuedProcess *process) {
return process->pstate() == QueuedEnums::ProcessState::Running
? value + process->nativeLimits().gpumemory
: value;
});
long long storage = std::accumulate(
tasks.cbegin(), tasks.cend(), 0,
[](long long value, QueuedProcess *process) {
return process->pstate() == QueuedEnums::ProcessState::Running
? value + process->nativeLimits().storage
: value;
});
return QueuedLimits::Limits(cpu, gpu, memory, gpumemory, storage);
}
/** /**
* @fn taskFinished * @fn taskFinished
*/ */
@ -269,7 +355,6 @@ void QueuedProcessManager::taskFinished(const int _exitCode,
pr->setEndTime(endTime); pr->setEndTime(endTime);
emit(taskStopTimeReceived(_index, endTime)); emit(taskStopTimeReceived(_index, endTime));
} }
// TODO implementation
// TODO emit signal for new task here start();
// emit(taskStartTimeReceived(_index, QDateTime::currentDateTimeUtc()));
} }