From d762f7f02355f5ee324adb10ed2d21d5b7984c34 Mon Sep 17 00:00:00 2001 From: Mirko Waechter <mirko.waechter@kit.edu> Date: Fri, 15 Jul 2016 14:47:58 +0200 Subject: [PATCH] fixed timestamp bug in plugincache --- .../libraries/ArmarXGuiBase/PluginCache.cpp | 51 ++++++++++++++----- .../libraries/ArmarXGuiBase/PluginCache.h | 2 + 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.cpp b/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.cpp index 57f673dc..9929d045 100644 --- a/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.cpp +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.cpp @@ -16,7 +16,8 @@ namespace armarx PluginCache::PluginCache(ArmarXManagerPtr manager) : cachePath(GetIconCachePath()), - manager(manager) + manager(manager), + s(settingsOrganization, settingsApplicationName) { QDir dir(cachePath); if (!dir.exists()) @@ -24,7 +25,7 @@ namespace armarx dir.mkpath("."); } - QSettings s(settingsOrganization, settingsApplicationName); + auto map = s.value("widgets").toMap(); for (QString key : map.keys()) { @@ -32,11 +33,12 @@ namespace armarx QStringList keyparts = key.split(":"); if (w.size() == 3) { - pluginData[key].pluginPath = keyparts[0]; - pluginData[key].lastModified = QDateTime::fromMSecsSinceEpoch(w[0].toLongLong()); - pluginData[key].hash = w[1].toAscii(); + auto& elem = pluginData[keyparts[0]]; + elem.pluginPath = keyparts[0]; + elem.lastModified = QDateTime::fromMSecsSinceEpoch(w[0].toLongLong()); + elem.hash = w[1].toAscii(); ARMARX_INFO_S << "Widget: " << w[2]; - pluginData[key].widgets[w[2]] = ArmarXWidgetInfoPtr(); + elem.widgets[w[2]] = ArmarXWidgetInfoPtr(); } } } @@ -71,7 +73,8 @@ namespace armarx } else if (getHash(pluginPath) == elem.hash) { - ARMARX_DEBUG_S << "Same hash"; + ARMARX_DEBUG_S << "Same hash - timestamps " << info.lastModified().toString() << " <> " << elem.lastModified.toString() ; + updateLastModifiedTimestamp(pluginPath); found = true; } else @@ -223,7 +226,7 @@ namespace armarx void PluginCache::clearCacheFile() { - QSettings s(settingsOrganization, settingsApplicationName); + ScopedRecursiveLock lock(cacheMutex); s.clear(); } @@ -239,6 +242,24 @@ namespace armarx return hashData.toHex(); } + void PluginCache::updateLastModifiedTimestamp(const QString& pluginPath) + { + QDateTime time = QFileInfo(pluginPath).lastModified(); + ScopedRecursiveLock lock(cacheMutex); + QMap<QString, QVariant> widgetMap = s.value("widgets").toMap(); + ARMARX_DEBUG_S << "Updating last modified timestamp of plugin " << pluginPath << " to " << time.toString(); + auto& pluginDataElement = pluginData[pluginPath]; + for (auto & widget : pluginDataElement.widgets) + { + widgetMap[pluginPath + ":" + widget.first] = QString::number(time.toMSecsSinceEpoch()) + ":" + pluginDataElement.hash + ":" + widget.first; + } + + assert(QString::number(time.toMSecsSinceEpoch()).toLongLong() == time.toMSecsSinceEpoch()); + + pluginDataElement.lastModified = time; + s.setValue("widgets", widgetMap); + } + void PluginCache::writeToCache(const QString& pluginPath) { auto start = IceUtil::Time::now(); @@ -246,8 +267,9 @@ namespace armarx ARMARX_DEBUG_S << "Hashing took " << (IceUtil::Time::now() - start).toMicroSecondsDouble(); QSharedPointer<QPluginLoader> loader(new QPluginLoader(pluginPath)); auto widgets = loadPlugin(loader); - QSettings s(settingsOrganization, settingsApplicationName); + copyResourcesToCache(); ARMARX_INFO_S << "Writing plugin " << pluginPath << " to cache"; + ScopedRecursiveLock lock(cacheMutex); QMap<QString, QVariant> widgetMap = s.value("widgets").toMap(); QDateTime time = QFileInfo(pluginPath).lastModified(); for (auto & elem : widgets) @@ -258,8 +280,7 @@ namespace armarx s.setValue("widgets", widgetMap); - copyResourcesToCache(); - ScopedRecursiveLock lock(cacheMutex); + pluginData[pluginPath] = {loader, pluginPath, hashData, time, widgets}; } @@ -267,13 +288,17 @@ namespace armarx PluginData PluginCache::loadFromCache(const QString& widgetName) { ARMARX_INFO_S << "Loading widget " << widgetName << " from cache "; - QSettings s(settingsOrganization, settingsApplicationName); + QString pluginPath; QSharedPointer<QPluginLoader> loader; WidgetCreatorMap widgets; QDateTime time; QByteArray hash; - auto map = s.value("widgets").toMap(); + QMap<QString, QVariant> map; + { + ScopedRecursiveLock lock(cacheMutex); + map = s.value("widgets").toMap(); + } for (auto key : map.keys()) { QStringList w = map[key].toString().split(":"); diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.h b/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.h index 864ee7b0..877ebad9 100644 --- a/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.h +++ b/source/ArmarXGui/libraries/ArmarXGuiBase/PluginCache.h @@ -50,12 +50,14 @@ namespace armarx QByteArray getHash(const QString& pluginPath); protected: + void updateLastModifiedTimestamp(const QString& pluginPath); void writeToCache(const QString& pluginPath); PluginData loadFromCache(const QString& pluginPath); WidgetCreatorMap loadPlugin(QSharedPointer<QPluginLoader> loader); const QString cachePath; QMap<QString, PluginData> pluginData; ArmarXManagerPtr manager; + QSettings s; mutable RecursiveMutex cacheMutex; std::future<void> preloadFuture; bool shutdown = false; -- GitLab