Rex Dieter 78fb1bf
From a5542751bc147c7f74131006339b55e6339b3e9f Mon Sep 17 00:00:00 2001
Rex Dieter 78fb1bf
From: =?UTF-8?q?Dan=20Vr=C3=A1til?= <dvratil@redhat.com>
Rex Dieter 78fb1bf
Date: Thu, 17 Apr 2014 15:11:57 +0200
Rex Dieter 78fb1bf
Subject: [PATCH 1/7] Use per-thread QDBusConnections
Rex Dieter 78fb1bf
Rex Dieter 78fb1bf
This moves DBusConnectionPool from Nepomuk search code to Akonadi and makes
Rex Dieter 78fb1bf
use of it in search infrastructure and couple other classes that interact
Rex Dieter 78fb1bf
with DBus from non-main thread.
Rex Dieter 78fb1bf
Rex Dieter 78fb1bf
QDBusConnection is not thread-safe in Qt 4, so we need to workaround it by
Rex Dieter 78fb1bf
having a connection for each thread. Qt 5 should be OK, so we can remove this
Rex Dieter 78fb1bf
in Frameworks.
Rex Dieter 78fb1bf
Rex Dieter 78fb1bf
This should fix random crashes I've been seeing when SearchTaskManager::addTask()
Rex Dieter 78fb1bf
was called from multiple threads simultaneously.
Rex Dieter 78fb1bf
---
Rex Dieter 78fb1bf
 server/CMakeLists.txt                       |  2 +-
Rex Dieter 78fb1bf
 server/src/dbusconnectionpool.cpp           | 62 +++++++++++++++++++++++++++++
Rex Dieter 78fb1bf
 server/src/dbusconnectionpool.h             | 41 +++++++++++++++++++
Rex Dieter 78fb1bf
 server/src/handler/fetchhelper.cpp          |  9 ++---
Rex Dieter 78fb1bf
 server/src/nepomuk/dbusconnectionpool.cpp   | 59 ---------------------------
Rex Dieter 78fb1bf
 server/src/nepomuk/dbusconnectionpool.h     | 38 ------------------
Rex Dieter 78fb1bf
 server/src/nepomuk/queryserviceclient.cpp   |  4 +-
Rex Dieter 78fb1bf
 server/src/search/agentsearchinstance.cpp   |  5 ++-
Rex Dieter 78fb1bf
 server/src/search/searchmanager.cpp         |  3 +-
Rex Dieter 78fb1bf
 server/src/search/searchtaskmanager.cpp     | 11 ++---
Rex Dieter 78fb1bf
 server/src/search/searchtaskmanager.h       |  2 -
Rex Dieter 78fb1bf
 server/src/storage/itemretrievalmanager.cpp |  6 +--
Rex Dieter 78fb1bf
 server/src/storagejanitor.cpp               |  3 +-
Rex Dieter 78fb1bf
 13 files changed, 124 insertions(+), 121 deletions(-)
Rex Dieter 78fb1bf
 create mode 100644 server/src/dbusconnectionpool.cpp
Rex Dieter 78fb1bf
 create mode 100644 server/src/dbusconnectionpool.h
Rex Dieter 78fb1bf
 delete mode 100644 server/src/nepomuk/dbusconnectionpool.cpp
Rex Dieter 78fb1bf
 delete mode 100644 server/src/nepomuk/dbusconnectionpool.h
Rex Dieter 78fb1bf
Rex Dieter 78fb1bf
diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt
Rex Dieter 78fb1bf
index 571bead..1709348 100644
Rex Dieter 78fb1bf
--- a/server/CMakeLists.txt
Rex Dieter 78fb1bf
+++ b/server/CMakeLists.txt
Rex Dieter 78fb1bf
@@ -106,6 +106,7 @@ set(libakonadiprivate_SRCS
Rex Dieter 78fb1bf
   src/collectionscheduler.cpp
Rex Dieter 78fb1bf
   src/clientcapabilities.cpp
Rex Dieter 78fb1bf
   src/clientcapabilityaggregator.cpp
Rex Dieter 78fb1bf
+  src/dbusconnectionpool.cpp
Rex Dieter 78fb1bf
   src/handler.cpp
Rex Dieter 78fb1bf
   src/handlerhelper.cpp
Rex Dieter 78fb1bf
   src/intervalcheck.cpp
Rex Dieter 78fb1bf
@@ -206,7 +207,6 @@ if (Soprano_FOUND)
Rex Dieter 78fb1bf
     src/search/nepomuksearchengine.cpp
Rex Dieter 78fb1bf
     src/nepomuk/dbusoperators.cpp
Rex Dieter 78fb1bf
     src/nepomuk/queryserviceclient.cpp
Rex Dieter 78fb1bf
-    src/nepomuk/dbusconnectionpool.cpp
Rex Dieter 78fb1bf
     src/nepomuk/result.cpp
Rex Dieter 78fb1bf
   )
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
diff --git a/server/src/dbusconnectionpool.cpp b/server/src/dbusconnectionpool.cpp
Rex Dieter 78fb1bf
new file mode 100644
Rex Dieter 78fb1bf
index 0000000..9aede4f
Rex Dieter 78fb1bf
--- /dev/null
Rex Dieter 78fb1bf
+++ b/server/src/dbusconnectionpool.cpp
Rex Dieter 78fb1bf
@@ -0,0 +1,62 @@
Rex Dieter 78fb1bf
+/*
Rex Dieter 78fb1bf
+ * Copyright (C) 2010 Sebastian Trueg <trueg@kde.org>
Rex Dieter 78fb1bf
+ *
Rex Dieter 78fb1bf
+ * This library is free software; you can redistribute it and/or
Rex Dieter 78fb1bf
+ * modify it under the terms of the GNU Library General Public
Rex Dieter 78fb1bf
+ * License as published by the Free Software Foundation; either
Rex Dieter 78fb1bf
+ * version 2 of the License, or (at your option) any later version.
Rex Dieter 78fb1bf
+ *
Rex Dieter 78fb1bf
+ * This library is distributed in the hope that it will be useful,
Rex Dieter 78fb1bf
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
Rex Dieter 78fb1bf
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Rex Dieter 78fb1bf
+ * Library General Public License for more details.
Rex Dieter 78fb1bf
+ *
Rex Dieter 78fb1bf
+ * You should have received a copy of the GNU Library General Public License
Rex Dieter 78fb1bf
+ * along with this library; see the file COPYING.LIB.  If not, write to
Rex Dieter 78fb1bf
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Rex Dieter 78fb1bf
+ * Boston, MA 02110-1301, USA.
Rex Dieter 78fb1bf
+ */
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+#include "dbusconnectionpool.h"
Rex Dieter 78fb1bf
+#include <QCoreApplication>
Rex Dieter 78fb1bf
+#include <QThread>
Rex Dieter 78fb1bf
+#include <QThreadStorage>
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+namespace {
Rex Dieter 78fb1bf
+QAtomicInt s_connectionCounter;
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+class DBusConnectionPoolPrivate
Rex Dieter 78fb1bf
+{
Rex Dieter 78fb1bf
+public:
Rex Dieter 78fb1bf
+    DBusConnectionPoolPrivate()
Rex Dieter 78fb1bf
+        : m_connection( QDBusConnection::connectToBus(
Rex Dieter 78fb1bf
+                            QDBusConnection::SessionBus,
Rex Dieter 78fb1bf
+                            QString::fromLatin1("AkonadiServer-%1").arg(newNumber()) ) )
Rex Dieter 78fb1bf
+    {
Rex Dieter 78fb1bf
+    }
Rex Dieter 78fb1bf
+    ~DBusConnectionPoolPrivate() {
Rex Dieter 78fb1bf
+        QDBusConnection::disconnectFromBus( m_connection.name() );
Rex Dieter 78fb1bf
+    }
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+    QDBusConnection connection() const { return m_connection; }
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+private:
Rex Dieter 78fb1bf
+    static int newNumber() {
Rex Dieter 78fb1bf
+        return s_connectionCounter.fetchAndAddAcquire( 1 );
Rex Dieter 78fb1bf
+    }
Rex Dieter 78fb1bf
+    QDBusConnection m_connection;
Rex Dieter 78fb1bf
+};
Rex Dieter 78fb1bf
+}
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+QThreadStorage<DBusConnectionPoolPrivate *> s_perThreadConnection;
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+QDBusConnection Akonadi::Server::DBusConnectionPool::threadConnection()
Rex Dieter 78fb1bf
+{
Rex Dieter 78fb1bf
+    if ( !QCoreApplication::instance() || QCoreApplication::instance()->thread() == QThread::currentThread() ) {
Rex Dieter 78fb1bf
+        return QDBusConnection::sessionBus(); // main thread, use the default session bus
Rex Dieter 78fb1bf
+    }
Rex Dieter 78fb1bf
+    if ( !s_perThreadConnection.hasLocalData() ) {
Rex Dieter 78fb1bf
+        s_perThreadConnection.setLocalData( new DBusConnectionPoolPrivate );
Rex Dieter 78fb1bf
+    }
Rex Dieter 78fb1bf
+    return s_perThreadConnection.localData()->connection();
Rex Dieter 78fb1bf
+}
Rex Dieter 78fb1bf
diff --git a/server/src/dbusconnectionpool.h b/server/src/dbusconnectionpool.h
Rex Dieter 78fb1bf
new file mode 100644
Rex Dieter 78fb1bf
index 0000000..4f8a93e
Rex Dieter 78fb1bf
--- /dev/null
Rex Dieter 78fb1bf
+++ b/server/src/dbusconnectionpool.h
Rex Dieter 78fb1bf
@@ -0,0 +1,41 @@
Rex Dieter 78fb1bf
+/*
Rex Dieter 78fb1bf
+ * Copyright (C) 2010 Sebastian Trueg <trueg@kde.org>
Rex Dieter 78fb1bf
+ *
Rex Dieter 78fb1bf
+ * This library is free software; you can redistribute it and/or
Rex Dieter 78fb1bf
+ * modify it under the terms of the GNU Library General Public
Rex Dieter 78fb1bf
+ * License as published by the Free Software Foundation; either
Rex Dieter 78fb1bf
+ * version 2 of the License, or (at your option) any later version.
Rex Dieter 78fb1bf
+ *
Rex Dieter 78fb1bf
+ * This library is distributed in the hope that it will be useful,
Rex Dieter 78fb1bf
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
Rex Dieter 78fb1bf
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Rex Dieter 78fb1bf
+ * Library General Public License for more details.
Rex Dieter 78fb1bf
+ *
Rex Dieter 78fb1bf
+ * You should have received a copy of the GNU Library General Public License
Rex Dieter 78fb1bf
+ * along with this library; see the file COPYING.LIB.  If not, write to
Rex Dieter 78fb1bf
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Rex Dieter 78fb1bf
+ * Boston, MA 02110-1301, USA.
Rex Dieter 78fb1bf
+ */
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+#ifndef DBUSCONNECTIONPOOL_H
Rex Dieter 78fb1bf
+#define DBUSCONNECTIONPOOL_H
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+#include <QDBusConnection>
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+namespace Akonadi {
Rex Dieter 78fb1bf
+namespace Server {
Rex Dieter 78fb1bf
+namespace DBusConnectionPool {
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+/**
Rex Dieter 78fb1bf
+ * Returns a new QDBusConnection for each thread, because QDBusConnection is
Rex Dieter 78fb1bf
+ * not thread-safe in Qt 4.
Rex Dieter 78fb1bf
+ *
Rex Dieter 78fb1bf
+ * FIXME: Remove in KF5
Rex Dieter 78fb1bf
+ */
Rex Dieter 78fb1bf
+QDBusConnection threadConnection();
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+}
Rex Dieter 78fb1bf
+}
Rex Dieter 78fb1bf
+}
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+#endif
Rex Dieter 78fb1bf
diff --git a/server/src/handler/fetchhelper.cpp b/server/src/handler/fetchhelper.cpp
Rex Dieter 78fb1bf
index 6284cc9..a6888a3 100644
Rex Dieter 78fb1bf
--- a/server/src/handler/fetchhelper.cpp
Rex Dieter 78fb1bf
+++ b/server/src/handler/fetchhelper.cpp
Rex Dieter 78fb1bf
@@ -38,6 +38,7 @@
Rex Dieter 78fb1bf
 #include "utils.h"
Rex Dieter 78fb1bf
 #include "intervalcheck.h"
Rex Dieter 78fb1bf
 #include "agentmanagerinterface.h"
Rex Dieter 78fb1bf
+#include "dbusconnectionpool.h"
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
 #include <QtCore/QLocale>
Rex Dieter 78fb1bf
 #include <QtCore/QStringList>
Rex Dieter 78fb1bf
@@ -252,16 +253,12 @@ bool FetchHelper::isScopeLocal( const Scope &scope )
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
   query.next();
Rex Dieter 78fb1bf
   const QString resourceName = query.value( 0 ).toString();
Rex Dieter 78fb1bf
-  // Workaround for QDBusConnectionPrivate not being thread-safe in Qt 4, fixed in Qt 5.2
Rex Dieter 78fb1bf
-  // TODO: Remove in KF5
Rex Dieter 78fb1bf
-  const QDBusConnection connection = QDBusConnection::connectToBus( QDBusConnection::SessionBus,
Rex Dieter 78fb1bf
-                                                                    QString::fromLatin1( mConnection->sessionId() ) );
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
   org::freedesktop::Akonadi::AgentManager manager( AkDBus::serviceName( AkDBus::Control ),
Rex Dieter 78fb1bf
                                                    QLatin1String( "/AgentManager" ),
Rex Dieter 78fb1bf
-                                                   connection );
Rex Dieter 78fb1bf
+                                                   DBusConnectionPool::threadConnection() );
Rex Dieter 78fb1bf
   const QString typeIdentifier = manager.agentInstanceType( resourceName );
Rex Dieter 78fb1bf
   const QVariantMap properties = manager.agentCustomProperties( typeIdentifier );
Rex Dieter 78fb1bf
-  QDBusConnection::disconnectFromBus( QString::fromLatin1( mConnection->sessionId() ) );
Rex Dieter 78fb1bf
   return properties.value( QLatin1String( "HasLocalStorage" ), false ).toBool();
Rex Dieter 78fb1bf
 }
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
diff --git a/server/src/nepomuk/dbusconnectionpool.cpp b/server/src/nepomuk/dbusconnectionpool.cpp
Rex Dieter 78fb1bf
deleted file mode 100644
Rex Dieter 78fb1bf
index 598d16f..0000000
Rex Dieter 78fb1bf
--- a/server/src/nepomuk/dbusconnectionpool.cpp
Rex Dieter 78fb1bf
+++ /dev/null
Rex Dieter 78fb1bf
@@ -1,59 +0,0 @@
Rex Dieter 78fb1bf
-/*
Rex Dieter 78fb1bf
- * This file is part of the Nepomuk KDE project.
Rex Dieter 78fb1bf
- * Copyright (C) 2010 Sebastian Trueg <trueg@kde.org>
Rex Dieter 78fb1bf
- * Copyright (C) 2010 David Faure <faure@kde.org>
Rex Dieter 78fb1bf
- *
Rex Dieter 78fb1bf
- * This library is free software; you can redistribute it and/or
Rex Dieter 78fb1bf
- * modify it under the terms of the GNU Library General Public
Rex Dieter 78fb1bf
- * License as published by the Free Software Foundation; either
Rex Dieter 78fb1bf
- * version 2 of the License, or (at your option) any later version.
Rex Dieter 78fb1bf
- *
Rex Dieter 78fb1bf
- * This library is distributed in the hope that it will be useful,
Rex Dieter 78fb1bf
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
Rex Dieter 78fb1bf
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Rex Dieter 78fb1bf
- * Library General Public License for more details.
Rex Dieter 78fb1bf
- *
Rex Dieter 78fb1bf
- * You should have received a copy of the GNU Library General Public License
Rex Dieter 78fb1bf
- * along with this library; see the file COPYING.LIB.  If not, write to
Rex Dieter 78fb1bf
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Rex Dieter 78fb1bf
- * Boston, MA 02110-1301, USA.
Rex Dieter 78fb1bf
- */
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-#include "dbusconnectionpool.h"
Rex Dieter 78fb1bf
-#include <QThreadStorage>
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-namespace {
Rex Dieter 78fb1bf
-QAtomicInt s_connectionCounter;
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-class DBusConnectionPoolPrivate
Rex Dieter 78fb1bf
-{
Rex Dieter 78fb1bf
-public:
Rex Dieter 78fb1bf
-    DBusConnectionPoolPrivate()
Rex Dieter 78fb1bf
-        : m_connection( QDBusConnection::connectToBus(
Rex Dieter 78fb1bf
-                            QDBusConnection::SessionBus,
Rex Dieter 78fb1bf
-                            QString::fromLatin1( "NepomukQueryServiceConnection%1" ).arg( newNumber() ) ) )
Rex Dieter 78fb1bf
-    {
Rex Dieter 78fb1bf
-    }
Rex Dieter 78fb1bf
-    ~DBusConnectionPoolPrivate() {
Rex Dieter 78fb1bf
-        QDBusConnection::disconnectFromBus( m_connection.name() );
Rex Dieter 78fb1bf
-    }
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-    QDBusConnection connection() const { return m_connection; }
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-private:
Rex Dieter 78fb1bf
-    static int newNumber() {
Rex Dieter 78fb1bf
-        return s_connectionCounter.fetchAndAddAcquire( 1 );
Rex Dieter 78fb1bf
-    }
Rex Dieter 78fb1bf
-    QDBusConnection m_connection;
Rex Dieter 78fb1bf
-};
Rex Dieter 78fb1bf
-}
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-QThreadStorage<DBusConnectionPoolPrivate *> s_perThreadConnection;
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-QDBusConnection DBusConnectionPool::threadConnection()
Rex Dieter 78fb1bf
-{
Rex Dieter 78fb1bf
-    if ( !s_perThreadConnection.hasLocalData() ) {
Rex Dieter 78fb1bf
-        s_perThreadConnection.setLocalData( new DBusConnectionPoolPrivate );
Rex Dieter 78fb1bf
-    }
Rex Dieter 78fb1bf
-    return s_perThreadConnection.localData()->connection();
Rex Dieter 78fb1bf
-}
Rex Dieter 78fb1bf
diff --git a/server/src/nepomuk/dbusconnectionpool.h b/server/src/nepomuk/dbusconnectionpool.h
Rex Dieter 78fb1bf
deleted file mode 100644
Rex Dieter 78fb1bf
index c5ac746..0000000
Rex Dieter 78fb1bf
--- a/server/src/nepomuk/dbusconnectionpool.h
Rex Dieter 78fb1bf
+++ /dev/null
Rex Dieter 78fb1bf
@@ -1,38 +0,0 @@
Rex Dieter 78fb1bf
-/*
Rex Dieter 78fb1bf
- * This file is part of the Nepomuk KDE project.
Rex Dieter 78fb1bf
- * Copyright (C) 2010 Sebastian Trueg <trueg@kde.org>
Rex Dieter 78fb1bf
- *
Rex Dieter 78fb1bf
- * This library is free software; you can redistribute it and/or
Rex Dieter 78fb1bf
- * modify it under the terms of the GNU Library General Public
Rex Dieter 78fb1bf
- * License as published by the Free Software Foundation; either
Rex Dieter 78fb1bf
- * version 2 of the License, or (at your option) any later version.
Rex Dieter 78fb1bf
- *
Rex Dieter 78fb1bf
- * This library is distributed in the hope that it will be useful,
Rex Dieter 78fb1bf
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
Rex Dieter 78fb1bf
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Rex Dieter 78fb1bf
- * Library General Public License for more details.
Rex Dieter 78fb1bf
- *
Rex Dieter 78fb1bf
- * You should have received a copy of the GNU Library General Public License
Rex Dieter 78fb1bf
- * along with this library; see the file COPYING.LIB.  If not, write to
Rex Dieter 78fb1bf
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Rex Dieter 78fb1bf
- * Boston, MA 02110-1301, USA.
Rex Dieter 78fb1bf
- */
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-#ifndef _DBUS_CONNECTION_POOL_H_
Rex Dieter 78fb1bf
-#define _DBUS_CONNECTION_POOL_H_
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-#include <QtDBus/QDBusConnection>
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-namespace DBusConnectionPool
Rex Dieter 78fb1bf
-{
Rex Dieter 78fb1bf
-/**
Rex Dieter 78fb1bf
- * The DBusConnectionPool works around the problem
Rex Dieter 78fb1bf
- * of QDBusConnection not being thread-safe. As soon as that
Rex Dieter 78fb1bf
- * has been fixed (either directly in libdbus or with a work-
Rex Dieter 78fb1bf
- * around in Qt) this method can be dropped in favor of
Rex Dieter 78fb1bf
- * QDBusConnection::sessionBus().
Rex Dieter 78fb1bf
- */
Rex Dieter 78fb1bf
-QDBusConnection threadConnection();
Rex Dieter 78fb1bf
-}
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
-#endif
Rex Dieter 78fb1bf
diff --git a/server/src/nepomuk/queryserviceclient.cpp b/server/src/nepomuk/queryserviceclient.cpp
Rex Dieter 78fb1bf
index 089a80b..b27a751 100644
Rex Dieter 78fb1bf
--- a/server/src/nepomuk/queryserviceclient.cpp
Rex Dieter 78fb1bf
+++ b/server/src/nepomuk/queryserviceclient.cpp
Rex Dieter 78fb1bf
@@ -24,7 +24,7 @@
Rex Dieter 78fb1bf
 #include "result.h"
Rex Dieter 78fb1bf
 #include "queryserviceinterface.h"
Rex Dieter 78fb1bf
 #include "queryinterface.h"
Rex Dieter 78fb1bf
-#include <dbusconnectionpool.h>
Rex Dieter 78fb1bf
+#include "dbusconnectionpool.h"
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
 #include <QtDBus/QDBusInterface>
Rex Dieter 78fb1bf
 #include <QtDBus/QDBusConnection>
Rex Dieter 78fb1bf
@@ -40,7 +40,7 @@ public:
Rex Dieter 78fb1bf
     Private()
Rex Dieter 78fb1bf
         : queryServiceInterface( 0 ),
Rex Dieter 78fb1bf
           queryInterface( 0 ),
Rex Dieter 78fb1bf
-          dbusConnection( DBusConnectionPool::threadConnection() ),
Rex Dieter 78fb1bf
+          dbusConnection( Akonadi::Server::DBusConnectionPool::threadConnection() ),
Rex Dieter 78fb1bf
           m_queryActive( false ),
Rex Dieter 78fb1bf
           loop( 0 ) {
Rex Dieter 78fb1bf
     }
Rex Dieter 78fb1bf
diff --git a/server/src/search/agentsearchinstance.cpp b/server/src/search/agentsearchinstance.cpp
Rex Dieter 78fb1bf
index 54ffab0..ca6ef87 100644
Rex Dieter 78fb1bf
--- a/server/src/search/agentsearchinstance.cpp
Rex Dieter 78fb1bf
+++ b/server/src/search/agentsearchinstance.cpp
Rex Dieter 78fb1bf
@@ -21,6 +21,7 @@
Rex Dieter 78fb1bf
 #include "agentsearchinterface.h"
Rex Dieter 78fb1bf
 #include "searchtaskmanager.h"
Rex Dieter 78fb1bf
 #include "akdbus.h"
Rex Dieter 78fb1bf
+#include "dbusconnectionpool.h"
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
 using namespace Akonadi::Server;
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
@@ -43,7 +44,7 @@ bool AgentSearchInstance::init()
Rex Dieter 78fb1bf
   mInterface = new OrgFreedesktopAkonadiAgentSearchInterface(
Rex Dieter 78fb1bf
       AkDBus::agentServiceName( mId, AkDBus::Agent ),
Rex Dieter 78fb1bf
       QLatin1String( "/Search" ),
Rex Dieter 78fb1bf
-      QDBusConnection::sessionBus() );
Rex Dieter 78fb1bf
+      DBusConnectionPool::threadConnection() );
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
   if ( !mInterface || !mInterface->isValid() ) {
Rex Dieter 78fb1bf
     delete mInterface;
Rex Dieter 78fb1bf
@@ -52,7 +53,7 @@ bool AgentSearchInstance::init()
Rex Dieter 78fb1bf
   }
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
   mServiceWatcher = new QDBusServiceWatcher( AkDBus::agentServiceName( mId, AkDBus::Agent ),
Rex Dieter 78fb1bf
-                                             QDBusConnection::sessionBus(),
Rex Dieter 78fb1bf
+                                             DBusConnectionPool::threadConnection(),
Rex Dieter 78fb1bf
                                              QDBusServiceWatcher::WatchForOwnerChange,
Rex Dieter 78fb1bf
                                              this );
Rex Dieter 78fb1bf
   connect( mServiceWatcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)),
Rex Dieter 78fb1bf
diff --git a/server/src/search/searchmanager.cpp b/server/src/search/searchmanager.cpp
Rex Dieter 78fb1bf
index 139d058..1eafb27 100644
Rex Dieter 78fb1bf
--- a/server/src/search/searchmanager.cpp
Rex Dieter 78fb1bf
+++ b/server/src/search/searchmanager.cpp
Rex Dieter 78fb1bf
@@ -26,6 +26,7 @@
Rex Dieter 78fb1bf
 #include "agentsearchengine.h"
Rex Dieter 78fb1bf
 #include "nepomuksearchengine.h"
Rex Dieter 78fb1bf
 #include "notificationmanager.h"
Rex Dieter 78fb1bf
+#include "dbusconnectionpool.h"
Rex Dieter 78fb1bf
 #include "searchrequest.h"
Rex Dieter 78fb1bf
 #include "searchtaskmanager.h"
Rex Dieter 78fb1bf
 #include "storage/datastore.h"
Rex Dieter 78fb1bf
@@ -98,7 +99,7 @@ SearchManager::SearchManager( const QStringList &searchEngines, QObject *parent
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
   new SearchManagerAdaptor( this );
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
-  QDBusConnection::sessionBus().registerObject(
Rex Dieter 78fb1bf
+  DBusConnectionPool::threadConnection().registerObject(
Rex Dieter 78fb1bf
       QLatin1String( "/SearchManager" ),
Rex Dieter 78fb1bf
       this,
Rex Dieter 78fb1bf
       QDBusConnection::ExportAdaptors );
Rex Dieter 78fb1bf
diff --git a/server/src/search/searchtaskmanager.cpp b/server/src/search/searchtaskmanager.cpp
Rex Dieter 78fb1bf
index 51bb516..e7980a4 100644
Rex Dieter 78fb1bf
--- a/server/src/search/searchtaskmanager.cpp
Rex Dieter 78fb1bf
+++ b/server/src/search/searchtaskmanager.cpp
Rex Dieter 78fb1bf
@@ -23,6 +23,7 @@
Rex Dieter 78fb1bf
 #include "akdbus.h"
Rex Dieter 78fb1bf
 #include "connection.h"
Rex Dieter 78fb1bf
 #include "storage/selectquerybuilder.h"
Rex Dieter 78fb1bf
+#include "dbusconnectionpool.h"
Rex Dieter 78fb1bf
 #include <entities.h>
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
 #include <QSqlError>
Rex Dieter 78fb1bf
@@ -36,9 +37,6 @@ SearchTaskManager *SearchTaskManager::sInstance = 0;
Rex Dieter 78fb1bf
 SearchTaskManager::SearchTaskManager()
Rex Dieter 78fb1bf
   : QObject()
Rex Dieter 78fb1bf
   , mShouldStop( false )
Rex Dieter 78fb1bf
-  , mAgentManager( AkDBus::serviceName( AkDBus::Control ), QLatin1String( "/AgentManager" ),
Rex Dieter 78fb1bf
-                   QDBusConnection::sessionBus() )
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
 {
Rex Dieter 78fb1bf
   sInstance = this;
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
@@ -125,13 +123,16 @@ void SearchTaskManager::addTask( SearchTask *task )
Rex Dieter 78fb1bf
   }
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
   mInstancesLock.lock();
Rex Dieter 78fb1bf
+
Rex Dieter 78fb1bf
+  org::freedesktop::Akonadi::AgentManager agentManager( AkDBus::serviceName( AkDBus::Control ), QLatin1String( "/AgentManager" ),
Rex Dieter 78fb1bf
+                                                        DBusConnectionPool::threadConnection() );
Rex Dieter 78fb1bf
   do {
Rex Dieter 78fb1bf
     const QString resourceId = query.value( 1 ).toString();
Rex Dieter 78fb1bf
     if ( !mInstances.contains( resourceId ) ) {
Rex Dieter 78fb1bf
       akDebug() << "Resource" << resourceId << "does not implement Search interface, skipping";
Rex Dieter 78fb1bf
-    } else if ( !mAgentManager.agentInstanceOnline( resourceId ) ) {
Rex Dieter 78fb1bf
+    } else if ( !agentManager.agentInstanceOnline( resourceId ) ) {
Rex Dieter 78fb1bf
       akDebug() << "Agent" << resourceId << "is offline, skipping";
Rex Dieter 78fb1bf
-    } else if ( mAgentManager.agentInstanceStatus( resourceId ) > 2 ) { // 2 == Broken, 3 == Not Configured
Rex Dieter 78fb1bf
+    } else if ( agentManager.agentInstanceStatus( resourceId ) > 2 ) { // 2 == Broken, 3 == Not Configured
Rex Dieter 78fb1bf
       akDebug() << "Agent" << resourceId << "is broken or not configured";
Rex Dieter 78fb1bf
     } else {
Rex Dieter 78fb1bf
       const qint64 collectionId = query.value( 0 ).toLongLong();
Rex Dieter 78fb1bf
diff --git a/server/src/search/searchtaskmanager.h b/server/src/search/searchtaskmanager.h
Rex Dieter 78fb1bf
index 06e1b52..9b7972b 100644
Rex Dieter 78fb1bf
--- a/server/src/search/searchtaskmanager.h
Rex Dieter 78fb1bf
+++ b/server/src/search/searchtaskmanager.h
Rex Dieter 78fb1bf
@@ -97,8 +97,6 @@ class SearchTaskManager : public QObject
Rex Dieter 78fb1bf
     TasksMap::Iterator cancelRunningTask( TasksMap::Iterator &iter );
Rex Dieter 78fb1bf
     bool allResourceTasksCompleted( SearchTask* ) const;
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
-    org::freedesktop::Akonadi::AgentManager mAgentManager;
Rex Dieter 78fb1bf
-
Rex Dieter 78fb1bf
     QMap<QString, AgentSearchInstance* > mInstances;
Rex Dieter 78fb1bf
     QMutex mInstancesLock;
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
diff --git a/server/src/storage/itemretrievalmanager.cpp b/server/src/storage/itemretrievalmanager.cpp
Rex Dieter 78fb1bf
index d49ba66..ce88410 100644
Rex Dieter 78fb1bf
--- a/server/src/storage/itemretrievalmanager.cpp
Rex Dieter 78fb1bf
+++ b/server/src/storage/itemretrievalmanager.cpp
Rex Dieter 78fb1bf
@@ -20,6 +20,7 @@
Rex Dieter 78fb1bf
 #include "itemretrievalmanager.h"
Rex Dieter 78fb1bf
 #include "itemretrievalrequest.h"
Rex Dieter 78fb1bf
 #include "itemretrievaljob.h"
Rex Dieter 78fb1bf
+#include "dbusconnectionpool.h"
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
 #include "resourceinterface.h"
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
@@ -40,10 +41,7 @@ ItemRetrievalManager *ItemRetrievalManager::sInstance = 0;
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
 ItemRetrievalManager::ItemRetrievalManager( QObject *parent )
Rex Dieter 78fb1bf
   : QObject( parent ),
Rex Dieter 78fb1bf
-    mDBusConnection(
Rex Dieter 78fb1bf
-      QDBusConnection::connectToBus(
Rex Dieter 78fb1bf
-          QDBusConnection::SessionBus,
Rex Dieter 78fb1bf
-          QString::fromLatin1( "AkonadiServerItemRetrievalManager" ) ) )
Rex Dieter 78fb1bf
+    mDBusConnection( DBusConnectionPool::threadConnection() )
Rex Dieter 78fb1bf
 {
Rex Dieter 78fb1bf
   // make sure we are created from the retrieval thread and only once
Rex Dieter 78fb1bf
   Q_ASSERT( QThread::currentThread() != QCoreApplication::instance()->thread() );
Rex Dieter 78fb1bf
diff --git a/server/src/storagejanitor.cpp b/server/src/storagejanitor.cpp
Rex Dieter 78fb1bf
index ebe7a24..af1a407 100644
Rex Dieter 78fb1bf
--- a/server/src/storagejanitor.cpp
Rex Dieter 78fb1bf
+++ b/server/src/storagejanitor.cpp
Rex Dieter 78fb1bf
@@ -26,6 +26,7 @@
Rex Dieter 78fb1bf
 #include "storage/parthelper.h"
Rex Dieter 78fb1bf
 #include "resourcemanager.h"
Rex Dieter 78fb1bf
 #include "entities.h"
Rex Dieter 78fb1bf
+#include "dbusconnectionpool.h"
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
 #include <akdbus.h>
Rex Dieter 78fb1bf
 #include <akdebug.h>
Rex Dieter 78fb1bf
@@ -63,7 +64,7 @@ void StorageJanitorThread::run()
Rex Dieter 78fb1bf
 
Rex Dieter 78fb1bf
 StorageJanitor::StorageJanitor( QObject *parent )
Rex Dieter 78fb1bf
   : QObject( parent )
Rex Dieter 78fb1bf
-  , m_connection( QDBusConnection::connectToBus( QDBusConnection::SessionBus, QLatin1String( staticMetaObject.className() ) ) )
Rex Dieter 78fb1bf
+  , m_connection( DBusConnectionPool::threadConnection() )
Rex Dieter 78fb1bf
   , m_lostFoundCollectionId( -1 )
Rex Dieter 78fb1bf
 {
Rex Dieter 78fb1bf
   DataStore::self();
Rex Dieter 78fb1bf
-- 
Rex Dieter 78fb1bf
1.9.3
Rex Dieter 78fb1bf