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