diff --git a/src/mirall/accountsettings.cpp b/src/mirall/accountsettings.cpp index 013775a35..0ced6ee55 100644 --- a/src/mirall/accountsettings.cpp +++ b/src/mirall/accountsettings.cpp @@ -235,7 +235,8 @@ void AccountSettings::folderToModelItem( QStandardItem *item, Folder *f ) if( errorList.isEmpty() ) { if( (status == SyncResult::Error || status == SyncResult::SetupError || - status == SyncResult::Unavailable )) { + status == SyncResult::SyncAbortRequested || + status == SyncResult::Unavailable)) { errorList << theme->statusHeaderText(status); } } @@ -306,7 +307,7 @@ void AccountSettings::slotResetCurrentFolder() if( ret == QMessageBox::Yes ) { FolderMan *folderMan = FolderMan::instance(); Folder *f = folderMan->folder(alias); - f->slotTerminateSync(); + f->slotTerminateSync(true); f->wipe(); folderMan->slotScheduleAllFolders(); } @@ -430,8 +431,9 @@ void AccountSettings::slotEnableCurrentFolder() // message box can return at any time while the thread keeps running, // so better check again after the user has responded. - if ( f->isBusy() && terminate ) - folderMan->terminateSyncProcess( alias ); + if ( f->isBusy() && terminate ) { + f->slotTerminateSync(false); + } folderMan->slotEnableFolder( alias, !folderEnabled ); slotUpdateFolderState (f); diff --git a/src/mirall/csyncthread.cpp b/src/mirall/csyncthread.cpp index 4962e5a21..28d11a4a7 100644 --- a/src/mirall/csyncthread.cpp +++ b/src/mirall/csyncthread.cpp @@ -341,11 +341,15 @@ void CSyncThread::startSync() } qDebug() << Q_FUNC_INFO << "Sync started"; + qDebug() << "starting to sync " << qApp->thread() << QThread::currentThread(); _syncedItems.clear(); _mutex.lock(); _needsUpdate = false; + if (!_abortRequested.fetchAndAddRelease(0)) { + csync_resume(_csync_ctx); + } _mutex.unlock(); @@ -635,6 +639,7 @@ QString CSyncThread::adjustRenamedPath(const QString& original) void CSyncThread::abort() { + QMutexLocker locker(&_mutex); csync_request_abort(_csync_ctx); _abortRequested = true; } diff --git a/src/mirall/folder.cpp b/src/mirall/folder.cpp index a1f0809fb..424d7e558 100644 --- a/src/mirall/folder.cpp +++ b/src/mirall/folder.cpp @@ -113,7 +113,6 @@ Folder::~Folder() { if( _thread ) { _csync->abort(); - _thread->quit(); _thread->wait(); } delete _csync; @@ -400,35 +399,25 @@ void Folder::slotCatchWatcherError(const QString& error) Logger::instance()->postGuiLog(tr("Error"), error); } -void Folder::slotTerminateSync() +void Folder::slotTerminateSync(bool block) { qDebug() << "folder " << alias() << " Terminating!"; - MirallConfigFile cfg; - QString configDir = cfg.configPath(); - qDebug() << "csync's Config Dir: " << configDir; if( _thread && _csync ) { _csync->abort(); + _errors.append( tr("The CSync thread terminated.") ); + _csyncError = true; + if (!block) { + setSyncState(SyncResult::SyncAbortRequested); + return; + } + _thread->wait(); _csync->deleteLater(); delete _thread; - _csync = 0; - _thread = 0; - csync_resume(_csync_ctx); + slotCSyncFinished(); } - if( ! configDir.isEmpty() ) { - QFile file( configDir + QLatin1String("/lock")); - if( file.exists() ) { - qDebug() << "After termination, lock file exists and gets removed."; - file.remove(); - } - } - - _errors.append( tr("The CSync thread terminated.") ); - _csyncError = true; - qDebug() << "-> CSync Terminated!"; - slotCSyncFinished(); } // This removes the csync File database if the sync folder definition is removed diff --git a/src/mirall/folder.h b/src/mirall/folder.h index b8703a12c..2337f171b 100644 --- a/src/mirall/folder.h +++ b/src/mirall/folder.h @@ -135,8 +135,10 @@ public slots: /** * terminate the current sync run + * + * If block is true, this will block synchroniously for the sync thread to finish. */ - void slotTerminateSync(); + void slotTerminateSync(bool block); void slotAboutToRemoveAllFiles(SyncFileItem::Direction, bool*); diff --git a/src/mirall/folderman.cpp b/src/mirall/folderman.cpp index d43d65bf1..0b2d610d2 100644 --- a/src/mirall/folderman.cpp +++ b/src/mirall/folderman.cpp @@ -295,8 +295,7 @@ void FolderMan::terminateSyncProcess( const QString& alias ) if( ! folderAlias.isEmpty() ) { Folder *f = _folderMap[folderAlias]; if( f ) { - f->slotTerminateSync(); - + f->slotTerminateSync(true); if(_currentSyncFolder == folderAlias ) _currentSyncFolder.clear(); } diff --git a/src/mirall/syncresult.h b/src/mirall/syncresult.h index 0ed7b1301..c5444f105 100644 --- a/src/mirall/syncresult.h +++ b/src/mirall/syncresult.h @@ -33,6 +33,7 @@ public: NotYetStarted, SyncPrepare, SyncRunning, + SyncAbortRequested, Success, Problem, Error, diff --git a/src/mirall/theme.cpp b/src/mirall/theme.cpp index f66200af0..485afda6a 100644 --- a/src/mirall/theme.cpp +++ b/src/mirall/theme.cpp @@ -71,6 +71,9 @@ QString Theme::statusHeaderText( SyncResult::Status status ) const case SyncResult::SyncPrepare: resultStr = QCoreApplication::translate("theme", "Preparing to sync" ); break; + case SyncResult::SyncAbortRequested: + resultStr = QCoreApplication::translate("theme", "Aborting..." ); + break; } return resultStr; @@ -241,6 +244,7 @@ QIcon Theme::syncStateIcon( SyncResult::Status status, bool sysTray ) const statusIcon = QLatin1String("state-offline"); break; case SyncResult::SyncRunning: + case SyncResult::SyncAbortRequested: statusIcon = QLatin1String("state-sync"); break; case SyncResult::SyncPrepare: