[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [akonadi/server-search] server/src/search: Only complete AgentSearchTask after ALL corresponding Res
From: Christian Mollekopf <chrigi_1 () fastmail ! fm>
Date: 2014-01-31 21:09:49
Message-ID: E1W9LLR-0005TD-Tc () scm ! kde ! org
[Download RAW message or body]
Git commit cdda3b0b4201be31237bbe4bfce69740aa94698d by Christian Mollekopf.
Committed on 31/01/2014 at 21:09.
Pushed by cmollekopf into branch 'server-search'.
Only complete AgentSearchTask after ALL corresponding ResourceTasks have been completed.
An AgentSearchTask typically has multiple ResourceTasks associated, and all of them
need to complete first.
M +18 -8 server/src/search/agentsearchmanager.cpp
M +1 -0 server/src/search/agentsearchmanager.h
http://commits.kde.org/akonadi/cdda3b0b4201be31237bbe4bfce69740aa94698d
diff --git a/server/src/search/agentsearchmanager.cpp b/server/src/search/agentsearchmanager.cpp
index c90f53e..ffe3b78 100644
--- a/server/src/search/agentsearchmanager.cpp
+++ b/server/src/search/agentsearchmanager.cpp
@@ -167,14 +167,24 @@ void AgentSearchManager::pushResults( const QByteArray &searchId, const QSet<qin
mWait.wakeAll();
}
+bool AgentSearchManager::allResourceTasksCompleted( AgentSearchTask *agentSearchTask ) const
+{
+ QMap<QString, ResourceTask*>::const_iterator it = mRunningTasks.begin();
+ for ( ; it != mRunningTasks.end(); ) {
+ if ( it.value()->parentTask == agentSearchTask ) {
+ return false;
+ }
+ }
+ return true;
+}
+
AgentSearchManager::TasksMap::Iterator AgentSearchManager::cancelRunningTask( TasksMap::Iterator &iter )
{
ResourceTask *task = iter.value();
AgentSearchTask *parentTask = task->parentTask;
- parentTask->sharedLock.lock();
- parentTask->pendingResults.clear();
- parentTask->complete = true;
- parentTask->sharedLock.unlock();
+ QMutexLocker locker(&parentTask->sharedLock);
+ // We're not clearing the results since we don't want to clear successful results from other resources
+ parentTask->complete = allResourceTasksCompleted( parentTask );
parentTask->notifier.wakeAll();
delete task;
@@ -217,10 +227,10 @@ void AgentSearchManager::searchLoop()
mPendingResults.remove( 0 );
akDebug() << "Pending results for search" << finishedTask->parentTask->id << "available!";
AgentSearchTask *parentTask = finishedTask->parentTask;
- parentTask->sharedLock.lock();
- parentTask->pendingResults = finishedTask->results;
- parentTask->complete = true;
- parentTask->sharedLock.unlock();
+ QMutexLocker locker( &parentTask->sharedLock );
+ // We need to append, this agent search task is shared
+ parentTask->pendingResults += finishedTask->results;
+ parentTask->complete = allResourceTasksCompleted( parentTask );
parentTask->notifier.wakeAll();
delete finishedTask;
}
diff --git a/server/src/search/agentsearchmanager.h b/server/src/search/agentsearchmanager.h
index 8c95572..91c2e97 100644
--- a/server/src/search/agentsearchmanager.h
+++ b/server/src/search/agentsearchmanager.h
@@ -93,6 +93,7 @@ class AgentSearchManager : public QObject
bool mShouldStop;
TasksMap::Iterator cancelRunningTask( TasksMap::Iterator &iter );
+ bool allResourceTasksCompleted( AgentSearchTask* ) const;
QMap<QString, AgentSearchInstance* > mInstances;
QMutex mInstancesLock;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic