[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kactivities] /: Made caching threadsafe so that kwin doesn't break
From: Ivan Čukić <ivan.cukic () kde ! org>
Date: 2012-09-29 8:27:27
Message-ID: 20120929082727.7BA05A6042 () git ! kde ! org
[Download RAW message or body]
Git commit d78f4ad88a2f82e1d17491b83bb806c93908d464 by Ivan Čukić.
Committed on 29/09/2012 at 10:26.
Pushed by ivan into branch 'master'.
Made caching threadsafe so that kwin doesn't break
M +1 -0 .gitignore
M +4 -3 src/lib/consumer.cpp
M +17 -6 src/lib/utils_p.h
http://commits.kde.org/kactivities/d78f4ad88a2f82e1d17491b83bb806c93908d464
diff --git a/.gitignore b/.gitignore
index d4d6f64..f670441 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,5 @@ _tests
*swp
*~
.kdev4
+.cmake-params
kactivities.kdev4
diff --git a/src/lib/consumer.cpp b/src/lib/consumer.cpp
index 3c0090b..e6c8d77 100644
--- a/src/lib/consumer.cpp
+++ b/src/lib/consumer.cpp
@@ -69,6 +69,9 @@ ConsumerPrivate::ConsumerPrivate()
connect(Manager::self(), SIGNAL(servicePresenceChanged(bool)),
this, SLOT(setServicePresent(bool)));
+ kDebug() << "We are checking whether the service is present" <<
+ Manager::isServicePresent();
+
if (Manager::isServicePresent()) {
initializeCachedData();
}
@@ -131,8 +134,6 @@ void ConsumerPrivate::setActivityState(const QString & activity, int state)
}
}
-
-
Consumer::Consumer(QObject * parent)
: QObject(parent), d(ConsumerPrivate::self(this))
{
@@ -160,7 +161,7 @@ QStringList Consumer::listActivities(Info::State state) const
if (state == Info::Running) {
if (!Manager::isServicePresent()) return QStringList(nulluuid);
- waitForCallFinished(d->runningActivitiesCallWatcher);
+ waitForCallFinished(d->runningActivitiesCallWatcher, &d->runningActivitiesMutex);
kDebug() << "Returning the running activities" << d->runningActivities;
diff --git a/src/lib/utils_p.h b/src/lib/utils_p.h
index a57c638..f503a04 100644
--- a/src/lib/utils_p.h
+++ b/src/lib/utils_p.h
@@ -19,15 +19,19 @@
#include <QDBusPendingCallWatcher>
+#include <QMutex>
+
#include <KDebug>
#include <KLocalizedString>
// Creates an async call to retrieve a value from the dbus service
// and initializes the call watcher
#define KAMD_RETRIEVE_REMOTE_VALUE(Variable, MethodToCall, Target) \
+ kDebug() << "Locking mutex for" << #Variable; \
+ Variable##Mutex.lock(); \
const QDBusPendingCall & Variable##Call = Manager::activities()->MethodToCall; \
- Variable##CallWatcher = new QDBusPendingCallWatcher(Variable##Call, Target); \
- \
+ Variable##CallWatcher = new QDBusPendingCallWatcher(Variable##Call, Target); \
+ \
QObject::connect(Variable##CallWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), \
Target, SLOT(Variable##CallFinished(QDBusPendingCallWatcher*)))
@@ -35,7 +39,8 @@
// without a handler for when a call is finished
#define KAMD_REMOTE_VALUE_CUSTOM_HANDLER(Type, Name) \
mutable Type Name; \
- QDBusPendingCallWatcher * Name##CallWatcher
+ QDBusPendingCallWatcher * Name##CallWatcher; \
+ QMutex Name##Mutex
// Defines a variable and handlers for a variable on a dbus service
#define KAMD_REMOTE_VALUE(Type, Name) \
@@ -61,7 +66,7 @@
// Defines a handler for pre-fetching of the activity info
#define KAMD_RETRIEVE_REMOTE_VALUE_HANDLER(ReturnType, Namespace, Variable, DefaultValue) \
- void Namespace::Variable##CallFinished(QDBusPendingCallWatcher * call) \
+ void Namespace::Variable##CallFinished(QDBusPendingCallWatcher * call) \
{ \
QDBusPendingReply <ReturnType> reply = * call; \
\
@@ -70,7 +75,9 @@
: reply.argumentAt<0>(); \
\
Variable##CallWatcher = 0; \
+ Variable##Mutex.unlock(); \
call->deleteLater(); \
+ kDebug() << "Unlocked mutex"; \
}
// Implements a value getter
@@ -78,14 +85,18 @@
ReturnType Namespace::Variable() const \
{ \
if (!Manager::isServicePresent()) return Default; \
- waitForCallFinished(d->Variable##CallWatcher); \
+ waitForCallFinished(d->Variable##CallWatcher, &d->Variable##Mutex); \
kDebug() << "Returning" << #Variable << d->Variable; \
return d->Variable; \
}
-static inline void waitForCallFinished(QDBusPendingCallWatcher * watcher)
+static inline void waitForCallFinished(QDBusPendingCallWatcher * watcher, QMutex * mutex)
{
if (watcher) {
watcher->waitForFinished();
+
+ kDebug() << "Trying to lock mutex";
+ mutex->lock();
+ mutex->unlock();
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic