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; }
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; }
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) ); } } }
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; }