Esempio n. 1
0
// 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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
// 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();
}
Esempio n. 4
0
// 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();
}
Esempio n. 5
0
// 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);
}
Esempio n. 6
0
CopyJob::~CopyJob()
{
  stopJob();
  wait();
}
Esempio n. 7
0
// 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;
  }
}