kdesupport/akonadi/server/src/search
David Faure
faure at kde.org
Tue Feb 9 11:53:58 CET 2010
SVN commit 1087546 by dfaure:
And now the real fix for the dbus connection leak problem :/
Next step: doing the same (but not the same) in kdelibs/nepomuk.
But at least the akonadiserver leak (triggered by kmail) is fixed by this.
CCMAIL: release-team at kde.org
M +23 -10 queryserviceclient.cpp
--- trunk/kdesupport/akonadi/server/src/search/queryserviceclient.cpp #1087545:1087546
@@ -40,21 +40,34 @@
{
public:
QDBusConnectionPerThreadHelper()
- : m_counter( 0 ) {
+ : m_connection( QDBusConnection::connectToBus(
+ QDBusConnection::SessionBus,
+ QString::fromLatin1("NepomukQueryServiceConnection%1").arg(newNumber()) ) )
+ {
}
-
- QDBusConnection newConnection() {
- QMutexLocker lock( &m_mutex );
- return QDBusConnection::connectToBus( QDBusConnection::SessionBus,
- QString::fromLatin1("NepomukQueryServiceConnection%1").arg(++m_counter) );
+ ~QDBusConnectionPerThreadHelper() {
+ QDBusConnection::disconnectFromBus( m_connection.name() );
}
+ static QDBusConnection threadConnection();
+
private:
- int m_counter;
- QMutex m_mutex;
+ int newNumber() {
+ return m_counter.fetchAndAddAcquire(1);
+ }
+ QAtomicInt m_counter;
+ QDBusConnection m_connection;
};
- Q_GLOBAL_STATIC(QDBusConnectionPerThreadHelper, s_globalDBusConnectionPerThreadHelper)
+ QThreadStorage<QDBusConnectionPerThreadHelper *> s_perThreadConnection;
+
+ QDBusConnection QDBusConnectionPerThreadHelper::threadConnection()
+ {
+ if (!s_perThreadConnection.hasLocalData()) {
+ s_perThreadConnection.setLocalData(new QDBusConnectionPerThreadHelper);
+ }
+ return s_perThreadConnection.localData()->m_connection;
+ }
}
@@ -64,7 +77,7 @@
Private()
: queryServiceInterface( 0 ),
queryInterface( 0 ),
- dbusConnection( s_globalDBusConnectionPerThreadHelper()->newConnection() ),
+ dbusConnection( QDBusConnectionPerThreadHelper::threadConnection() ),
loop( 0 ) {
}
More information about the release-team
mailing list