summaryrefslogtreecommitdiffstats
path: root/src/tools/messageserver/servicehandler.cpp
diff options
context:
space:
mode:
authorDon Sanders <don.sanders@nokia.com>2012-02-24 11:57:28 +0200
committerDon Sanders <don.sanders@nokia.com>2012-02-24 11:57:28 +0200
commit03a29040f11d655f9e0f9c4dfc4b07c01239a258 (patch)
tree2a864db7972b354fd4bd3d8cbac131f728dcda4f /src/tools/messageserver/servicehandler.cpp
parent5527b5bcb35d67a3108a5eb5563c21825f7f70eb (diff)
Limit concurrent serviceactions, facilitates limiting RAM usage.
Only allow 2 concurrent actions to be serviced on the device. Only allow 1 concurrent action per process. Fix a bug whereby invalid actions where being added to mActiveActions. Add 2 new functions (quasi public) QMF_EXPORT int maximumConcurrentServiceActions(); QMF_EXPORT int maximumConcurrentServiceActionsPerProcess();
Diffstat (limited to 'src/tools/messageserver/servicehandler.cpp')
-rw-r--r--src/tools/messageserver/servicehandler.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/tools/messageserver/servicehandler.cpp b/src/tools/messageserver/servicehandler.cpp
index 897c28a0..48997d91 100644
--- a/src/tools/messageserver/servicehandler.cpp
+++ b/src/tools/messageserver/servicehandler.cpp
@@ -51,6 +51,7 @@
#include <qmaillog.h>
#include <qmailmessage.h>
#include <qmailcontentmanager.h>
+#include <qmailnamespace.h>
#include <QCoreApplication>
#include <QDir>
#include <QDateTime>
@@ -1091,6 +1092,26 @@ void ServiceHandler::dispatchRequest()
continue;
}
+ // Limit number of concurrent actions serviced on the device
+ if (mActiveActions.count() >= QMail::maximumConcurrentServiceActions())
+ return;
+
+ // Limit number of concurrent actions serviced per process
+ const quint64 requestProcess = request->action >> 32;
+ int requestProcessCount = 1; // including the request
+ foreach(quint64 actionId, mActiveActions.keys()) {
+ if ((actionId >> 32) == requestProcess) {
+ if (++requestProcessCount > QMail::maximumConcurrentServiceActionsPerProcess()) {
+ break;
+ }
+ }
+ }
+
+ if (requestProcessCount > QMail::maximumConcurrentServiceActionsPerProcess()) {
+ ++request;
+ continue;
+ }
+
// Associate the services with the action, so that signals are reported correctly
foreach (QMailMessageService *service, request->services)
mServiceAction.insert(service, request->action);
@@ -2996,7 +3017,8 @@ void ServiceHandler::reportFailure(quint64 action, QMailServiceAction::Status::E
void ServiceHandler::reportFailure(quint64 action, const QMailServiceAction::Status status)
{
- if (status.errorCode != QMailServiceAction::Status::ErrNoError) {
+ if (status.errorCode != QMailServiceAction::Status::ErrNoError
+ && mActiveActions.contains(action)) {
markFailedMessage(mActiveActions[action].description, status);
}