aboutsummaryrefslogtreecommitdiff
path: root/libcontextsubscriber
diff options
context:
space:
mode:
authorMarja Hassinen <ext-marja.2.hassinen@nokia.com>2009-09-11 13:48:35 +0300
committerMarja Hassinen <ext-marja.2.hassinen@nokia.com>2009-09-11 13:48:35 +0300
commitd6acc231d31ca1f7321d6ed11e932b825b168126 (patch)
tree1892d1253f879475fbfd0100e6240135d7fe7678 /libcontextsubscriber
parent97d436aca10ce605678a85924321cba2bf68b489 (diff)
libcontextsubscriber: Modifying the locking in ContextPropertyInfo so that emitting signals
and listeners accessing cached values doesn't create a deadlock. Adding a pluginChanged signal.
Diffstat (limited to 'libcontextsubscriber')
-rw-r--r--libcontextsubscriber/src/contextpropertyinfo.cpp47
-rw-r--r--libcontextsubscriber/src/contextpropertyinfo.h8
2 files changed, 41 insertions, 14 deletions
diff --git a/libcontextsubscriber/src/contextpropertyinfo.cpp b/libcontextsubscriber/src/contextpropertyinfo.cpp
index 1e23f2db..30cfd8b7 100644
--- a/libcontextsubscriber/src/contextpropertyinfo.cpp
+++ b/libcontextsubscriber/src/contextpropertyinfo.cpp
@@ -303,29 +303,48 @@ void ContextPropertyInfo::onKeyDataChanged(const QString& key)
if (key != keyName)
return;
+ // Update caches and store old values
+ QString oldType = cachedType;
QString newType = InfoBackend::instance()->typeForKey(keyName);
- if (cachedType != newType) {
+ cachedType = newType;
- if (cachedType == "")
+ cachedDoc = InfoBackend::instance()->docForKey(keyName);
+
+ QString oldPlugin = cachedPlugin;
+ QString oldConstructionString = cachedConstructionString;
+ QString newPlugin = InfoBackend::instance()->pluginForKey(keyName);
+ QString newConstructionString = InfoBackend::instance()->constructionStringForKey(keyName);
+ cachedPlugin = newPlugin;
+ cachedConstructionString = newConstructionString;
+
+ // Release the lock before emitting the signals; otherwise
+ // listeners trying to access cached values would create a
+ // deadlock.
+ lock.unlock();
+
+ // Emit the needed signals
+ if (oldType != newType) {
+
+ if (oldType == "")
emit existsChanged(true);
if (newType == "")
emit existsChanged(false);
- cachedType = newType;
emit typeChanged(cachedType);
}
- cachedDoc = InfoBackend::instance()->docForKey(keyName);
-
- // TBD: obsolete the providerChanged signal and add pluginChanged or sth?
- QString newPlugin = InfoBackend::instance()->pluginForKey(keyName);
- if (cachedPlugin == "contextkit-dbus" || newPlugin == "contextkit-dbus") {
- cachedPlugin = newPlugin;
- cachedConstructionString = InfoBackend::instance()->constructionStringForKey(keyName);
- QString newProvider = "";
- if (newPlugin == "contextkit-dbus") {
- newProvider = cachedConstructionString.split(":").last();
+ // TBD: obsolete the providerChanged & providerDBusTypeChanged signals?
+ if (oldPlugin != newPlugin || oldConstructionString != newConstructionString) {
+ if (oldPlugin == "contextkit-dbus" || newPlugin == "contextkit-dbus") {
+ QString newProvider = "";
+ if (newPlugin == "contextkit-dbus") {
+ newProvider = cachedConstructionString.split(":").last();
+ }
+ emit providerChanged(newProvider);
+ // Note: we don't emit providerDBusTypeChanged any
+ // more. It would be cumbersome, and there's no real use
+ // case for listening to it.
}
- emit providerChanged(newProvider);
+ emit pluginChanged(newPlugin, newConstructionString);
}
}
diff --git a/libcontextsubscriber/src/contextpropertyinfo.h b/libcontextsubscriber/src/contextpropertyinfo.h
index 3ba6b255..e83aebb9 100644
--- a/libcontextsubscriber/src/contextpropertyinfo.h
+++ b/libcontextsubscriber/src/contextpropertyinfo.h
@@ -85,6 +85,14 @@ signals:
/// signal you can wait (watch) for various keys to become available.
/// \param exists The new state of the key.
void existsChanged(bool exists);
+
+ /// Emitted when the libcontextsubscriber plugin providing the key
+ /// changes, or the construction parameter to give to the plugin
+ /// changes.. The \a plugin is the name of the new plugin
+ /// providing the key and the \a constructionString is the new
+ /// construction parameter to give to the plugin.
+ void pluginChanged(QString plugin, QString constructionString);
+
};
#endif // CONTEXTPROPERTYINFO_H