# # # patch "src/model/AutomateCommand.cpp" # from [80b69f1ceaee3c47a08a18914f5cda659bed27d0] # to [6c18c81e3b741b180caf5ea6662142d132a7f0cc] # # patch "src/model/AutomateCommand.h" # from [b2e0fd928d2e273b314398bc250066de03ea5348] # to [2c38aad8a34201def446804676086e08296a70d0] # # patch "src/model/GetContentChanged.cpp" # from [0c531336daa091157734aa87fb39859877c0e9d2] # to [32abedcae92407071a71b07a4e2e104a6ac7edee] # # patch "src/monotone/MonotoneThread.cpp" # from [56a8906a9d0f808ea3a08d88920bfffd1afecf69] # to [45532a7867fab2da5953617a723e54cb387c2e48] # # patch "src/monotone/MonotoneThread.h" # from [8a6365f540ed8706b8eae206865dfac75fa452a3] # to [7c1941c8305b863e190b3ad246fc12bb31f8ae9f] # # patch "src/view/dialogs/Netsync.cpp" # from [8782a4afbfaf1af1871e297529c6c47cac028a55] # to [3d62c51dffa72aadfe2e4b791fc7d823cbfa331e] # ============================================================ --- src/model/AutomateCommand.cpp 80b69f1ceaee3c47a08a18914f5cda659bed27d0 +++ src/model/AutomateCommand.cpp 6c18c81e3b741b180caf5ea6662142d132a7f0cc @@ -91,7 +91,7 @@ void AutomateCommand::enqueueDatabaseTas enqueueTask(thread, task); } -void AutomateCommand::stopAllTasks() +void AutomateCommand::abortThreads() { QMutexLocker locker(&lock); @@ -100,8 +100,14 @@ void AutomateCommand::stopAllTasks() while (it.hasNext()) { it.next(); - if (it.value().size() == 0) continue; - APP->manager()->getThreadByNumber(it.key())->removeTasks(it.value()); + // FIXME: this plainly aborts all threads for which we have + // commands enqueued, but other models may have added their own + // commands in the same thread queue and are therefor also aborted! + // + // We should find a clean and nice way to only abort the currently + // running task and to restart the mtn process proceeding with the + // left items in the task queue... + APP->manager()->getThreadByNumber(it.key())->abort(); } } ============================================================ --- src/model/AutomateCommand.h b2e0fd928d2e273b314398bc250066de03ea5348 +++ src/model/AutomateCommand.h 2c38aad8a34201def446804676086e08296a70d0 @@ -39,7 +39,7 @@ protected: virtual void tickerUpdate(const TickerMap &); void enqueueWorkspaceTask(const WorkspacePath &, const MonotoneTask &); void enqueueDatabaseTask(const DatabaseFile &, const MonotoneTask &); - void stopAllTasks(); + void abortThreads(); private: void enqueueTask(MonotoneThread * thread, const MonotoneTask &); ============================================================ --- src/model/GetContentChanged.cpp 0c531336daa091157734aa87fb39859877c0e9d2 +++ src/model/GetContentChanged.cpp 32abedcae92407071a71b07a4e2e104a6ac7edee @@ -76,7 +76,7 @@ void GetContentChanged::stopReading() void GetContentChanged::stopReading() { stopReadingChanges = true; - AutomateCommand::stopAllTasks(); + AutomateCommand::abortThreads(); } void GetContentChanged::queryContentChanged(const QString & rev, const QString & path) ============================================================ --- src/monotone/MonotoneThread.cpp 56a8906a9d0f808ea3a08d88920bfffd1afecf69 +++ src/monotone/MonotoneThread.cpp 45532a7867fab2da5953617a723e54cb387c2e48 @@ -145,6 +145,22 @@ MonotoneThread::~MonotoneThread() {} MonotoneThread::~MonotoneThread() {} + +bool MonotoneThread::waitForStarted() +{ + QEventLoop * ev = new QEventLoop(this); + + connect(this, SIGNAL(started(int)), + ev, SLOT(quit())); + connect(this, SIGNAL(aborted(int, QProcess::ProcessError, const QString &)), + ev, SLOT(quit())); + + ev->exec(); + + delete ev; + return !doAbort; +} + int MonotoneThread::enqueueTask(const MonotoneTask & task) { QMutexLocker locker(&lock); @@ -162,17 +178,34 @@ int MonotoneThread::enqueueTask(const Mo return commandNumber; } -void MonotoneThread::removeTasks(QList commandNumbers) +void MonotoneThread::abort() { QMutexLocker locker(&lock); + doAbort = true; + waitForTasks.wakeAll(); +} - for (int i=0; i 0) { - if (commandNumbers.contains(queue[i].getCommandNumber())) + foreach (MonotoneTask task, queue) { - queue[i].setAborted(); + emit taskAborted(task); } + queue.clear(); } + + // close the pipes + proc->close(); + // send SIGTERM + proc->terminate(); + // block until the process has really been finished + proc->waitForFinished(); } void MonotoneThread::run() @@ -323,9 +356,14 @@ void MonotoneThread::run() .arg(task.getCommandNumber()).arg(QString(task.getEncodedInput()))); } - // FIXME: make this configurable! - if (!process->waitForReadyRead(30000)) + while (!process->waitForReadyRead(500) && !doAbort) { + if (process->error() == QProcess::Timedout) + { + L("waiting just a little longer"); + continue; + } + emit aborted(threadNumber, process->error(), QString::fromUtf8(process->readAllStandardError()) ); @@ -334,7 +372,7 @@ void MonotoneThread::run() } QByteArray err = process->readAllStandardError(); - if (err.size() != 0) + if (err.size() != 0 || doAbort) { task.setOutput(err); task.setReturnCode(-1); @@ -411,50 +449,11 @@ void MonotoneThread::run() emit taskFinished(task); } - cleanup(process); -} -void MonotoneThread::cleanup(QProcess * proc) -{ - QMutexLocker locker(&lock); + emit aborted(threadNumber, process->error(), + QString::fromUtf8(process->readAllStandardError()) + ); - doAbort = true; - - if (queue.size() > 0) - { - foreach (MonotoneTask task, queue) - { - emit taskAborted(task); - } - queue.clear(); - } - - // close the pipes - proc->close(); - // send SIGTERM - proc->terminate(); - // block until the process has really been finished - proc->waitForFinished(); + cleanup(process); } -void MonotoneThread::abort() -{ - QMutexLocker locker(&lock); - doAbort = true; - waitForTasks.wakeAll(); -} - -bool MonotoneThread::waitForStarted() -{ - QEventLoop * ev = new QEventLoop(this); - - connect(this, SIGNAL(started(int)), - ev, SLOT(quit())); - connect(this, SIGNAL(aborted(int, QProcess::ProcessError, const QString &)), - ev, SLOT(quit())); - - ev->exec(); - - delete ev; - return !doAbort; -} ============================================================ --- src/monotone/MonotoneThread.h 8a6365f540ed8706b8eae206865dfac75fa452a3 +++ src/monotone/MonotoneThread.h 7c1941c8305b863e190b3ad246fc12bb31f8ae9f @@ -128,9 +128,6 @@ public: //! enqueue a new task for this thread int enqueueTask(const MonotoneTask &); - //! removes one or more tasks from the local queue by deactivating it - void removeTasks(QList); - //! abort task execution on this thread /*! ATTENTION: all unfinished tasks will be aborted! ============================================================ --- src/view/dialogs/Netsync.cpp 8782a4afbfaf1af1871e297529c6c47cac028a55 +++ src/view/dialogs/Netsync.cpp 3d62c51dffa72aadfe2e4b791fc7d823cbfa331e @@ -116,7 +116,7 @@ void Netsync::stop() void Netsync::stop() { - stopAllTasks(); + AutomateCommand::abortThreads(); progressWidget->hide(); startStopButton->setText(tr("Start")); settingsGroup->setEnabled(true); @@ -212,11 +212,16 @@ void Netsync::tickerUpdate(const TickerM } if (knowTotalValue) + { overallProgress->setMaximum(total); + overallProgress->setValue(progress); + } else + if (overallProgress->maximum() != 0) + { overallProgress->setMaximum(0); + } - overallProgress->setValue(progress); progressText->setText(progressTexts.join(", ")); progressWidget->show();