示例#1
0
Debugger::~Debugger()
{
    // Abort all running jobs, wait for them to finish and then delete them.
    // When there are undeleted jobs with queue policies assigned, deleting m_weaver would crash
    m_mutex->lock();
    if ( hasRunningJobs() ) {
        m_weaver->requestAbort();
        m_weaver->finish();
        qApp->processEvents();
    }
    foreach ( const QPointer<DebuggerJob> &job, m_runningJobs ) {
        if ( job ) {
            job->finish();
            if ( job ) {
                QEventLoop loop;
                connect( job, SIGNAL(destroyed(QObject*)), &loop, SLOT(quit()) );
                loop.exec();
                delete job.data();
            }
        }
    }
    m_runningJobs.clear();

    delete m_debuggerRestrictionPolicy;
    delete m_evaluateInContextRestrictionPolicy;
    delete m_runData;
    m_runData = 0;
    m_mutex->unlock();

    delete m_mutex;
}
示例#2
0
bool
MainWindow::beforeCloseCheckRunningJobs() {
  auto tool = jobTool();
  if (!tool)
    return true;

  auto model = tool->model();
  if (!model->hasRunningJobs())
    return true;

  if (   Util::Settings::get().m_warnBeforeAbortingJobs
      && (Util::MessageBox::question(this)
            ->title(QY("Abort running jobs"))
            .text(Q("%1 %2").arg(QY("There is currently a job running.")).arg(QY("Do you really want to abort all currently running jobs?")))
            .buttonLabel(QMessageBox::Yes, QY("&Abort jobs"))
            .buttonLabel(QMessageBox::No,  QY("Cancel"))
            .exec()) == QMessageBox::No)
    return false;

  model->stop();
  model->withAllJobs([](Jobs::Job &job) {
    if (Jobs::Job::Running == job.status()) {
      job.setQuitAfterFinished(true);
      job.abort();
    }
  });

  return false;
}
示例#3
0
void Debugger::finish()
{
    QMutexLocker locker( m_mutex );
    if ( hasRunningJobs() ) {
        m_weaver->finish();
        qApp->processEvents();
    }
    while ( hasRunningJobs() ) {
        const QPointer< DebuggerJob > job = currentJob();
        Q_ASSERT( job );
        job->finish();

        if ( job && m_runningJobs.contains(job) ) {
            QEventLoop loop;
            connect( job, SIGNAL(destroyed(QObject*)), &loop, SLOT(quit()) );
            loop.exec();

            if ( m_runningJobs.contains(job) ) {
                kDebug() << "Manually remove done job";
                m_runningJobs.remove( m_runningJobs.indexOf(job) );
            }
        }
    }
示例#4
0
bool
MainWindow::beforeCloseCheckRunningJobs() {
  auto tool = jobTool();
  if (!tool)
    return true;

  auto model = tool->model();
  if (!model->hasRunningJobs())
    return true;

  if (   Util::Settings::get().m_warnBeforeAbortingJobs
      && Util::MessageBox::question(this, QY("Abort running jobs"), Q("%1 %2").arg(QY("There is currently a job running.")).arg(QY("Do you want to abort that job and quit?"))) == QMessageBox::No)
    return false;

  model->stop();
  model->withAllJobs([](Jobs::Job &job) {
    if (Jobs::Job::Running == job.m_status) {
      job.m_quitAfterFinished = true;
      job.abort();
    }
  });

  return false;
}