Abort the sync asynchroniously

Don't block the GUI when clicking on pause

Mirall issue #968
This commit is contained in:
Olivier Goffart 2013-10-03 13:41:15 +02:00
parent b18810f381
commit 79ea7c3eed
7 changed files with 29 additions and 27 deletions

View file

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

View file

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

View file

@ -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

View file

@ -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*);

View file

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

View file

@ -33,6 +33,7 @@ public:
NotYetStarted,
SyncPrepare,
SyncRunning,
SyncAbortRequested,
Success,
Problem,
Error,

View file

@ -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: