// Doxygen skip: /// @cond void QueueManager::handleRestartStructure_(Structure* s) { Q_ASSERT(trackerContainsStructure(s, &m_restartTracker)); removeFromTrackerWhenScopeEnds popper(s, &m_restartTracker); if (s->getStatus() != Structure::Restart) { return; } stopJob(s); addStructureToSubmissionQueue(s); }
void QueueManager::killStructure(Structure* s) { // End job if currently running if (s->getStatus() != Structure::Optimized) { s->lock().lockForWrite(); s->stopOptTimer(); s->setStatus(Structure::Killed); s->lock().unlock(); } else { s->lock().lockForWrite(); s->stopOptTimer(); s->setStatus(Structure::Removed); s->lock().unlock(); } stopJob(s); emit structureKilled(s); }
// Doxygen skip: /// @cond void QueueManager::handleSupercellStructure_(Structure* s) { Q_ASSERT(trackerContainsStructure(s, &m_newSupercellTracker)); removeFromTrackerWhenScopeEnds popper(s, &m_newSupercellTracker); if (s->getStatus() != Structure::Supercell) { return; } // Ensure that the job is not tying up the queue stopJob(s); // Remove from running tracker m_runningTracker.lockForWrite(); m_runningTracker.remove(s); m_runningTracker.unlock(); }
// Doxygen skip: /// @cond void QueueManager::handleKilledStructure_(Structure* s) { Q_ASSERT(trackerContainsStructure(s, &m_newlyKilledTracker)); removeFromTrackerWhenScopeEnds popper(s, &m_newlyKilledTracker); if (s->getStatus() != Structure::Killed && // Remove structures end up here, too, so check this (see // handleRemovedStructure below) s->getStatus() != Structure::Removed) { return; } // Ensure that the job is not tying up the queue stopJob(s); // Remove from running tracker m_runningTracker.lockForWrite(); m_runningTracker.remove(s); m_runningTracker.unlock(); }
// Doxygen skip: /// @cond void QueueManager::handleOptimizedStructure_(Structure* s) { Q_ASSERT(trackerContainsStructure(s, &m_newlyOptimizedTracker)); removeFromTrackerWhenScopeEnds popper(s, &m_newlyOptimizedTracker); // Revalidate assumptions if (s->getStatus() != Structure::Optimized) { return; } // Ensure that the job is not tying up the queue stopJob(s); // Remove from running tracker m_runningTracker.lockForWrite(); m_runningTracker.remove(s); m_runningTracker.unlock(); emit structureFinished(s); }
CopyJob::~CopyJob() { stopJob(); wait(); }
// Doxygen skip: /// @cond void QueueManager::handleErrorStructure_(Structure* s) { Q_ASSERT(trackerContainsStructure(s, &m_errorTracker)); removeFromTrackerWhenScopeEnds popper(s, &m_errorTracker); if (s->getStatus() != Structure::Error) { return; } if (!m_opt->usingGUI()) { qDebug() << "Structure" << QString::number(s->getGeneration()) + "x" + QString::number(s->getIDNumber()) << "failed"; } stopJob(s); // Lock for writing QWriteLocker locker(&s->lock()); s->addFailure(); // If the number of failures has exceed the limit, take // appropriate action if (s->getFailCount() >= m_opt->failLimit) { switch (OptBase::FailActions(m_opt->failAction)) { case OptBase::FA_DoNothing: default: // resubmit job s->setStatus(Structure::Restart); emit structureUpdated(s); return; case OptBase::FA_KillIt: locker.unlock(); killStructure(s); emit structureUpdated(s); return; case OptBase::FA_Randomize: s->setStatus(Structure::Empty); locker.unlock(); m_opt->replaceWithRandom(s, tr("excessive failures")); s->setStatus(Structure::Restart); emit structureUpdated(s); return; case OptBase::FA_NewOffspring: s->setStatus(Structure::Empty); locker.unlock(); m_opt->replaceWithOffspring(s, tr("excessive failures")); s->setStatus(Structure::Restart); emit structureUpdated(s); return; } } // Resubmit job if failure limit hasn't been reached else { s->setStatus(Structure::Restart); emit structureUpdated(s); return; } }