From 122655758ded78762f0467802b50f9b6ae4a4055 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sat, 26 May 2012 21:14:48 +0300 Subject: [PATCH] Fix caching issues in last commit --- src/webui/btjson.cpp | 26 +++++++++++++++++++------- src/webui/jsondict.cpp | 5 ++--- src/webui/jsondict.h | 1 + src/webui/jsonlist.cpp | 5 ++--- src/webui/jsonlist.h | 1 + 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/webui/btjson.cpp b/src/webui/btjson.cpp index 8e328fa0e..b02e0c032 100644 --- a/src/webui/btjson.cpp +++ b/src/webui/btjson.cpp @@ -49,6 +49,16 @@ using namespace libtorrent; cacheTimer.start(); \ VAR.clear() +#define CACHED_VARIABLE_FOR_HASH(VARTYPE, VAR, DUR, HASH) \ + static VARTYPE VAR; \ + static QString prev_hash; \ + static QElapsedTimer cacheTimer; \ + if (prev_hash == HASH && !cacheTimer.hasExpired(DUR)) \ + return VAR.toString(); \ + prev_hash = HASH; \ + cacheTimer.start(); \ + VAR.clear() + // Numerical constants static const int CACHE_DURATION_MS = 1500; // 1500ms @@ -196,7 +206,7 @@ QString btjson::getTorrents() */ QString btjson::getTrackersForTorrent(const QString& hash) { - CACHED_VARIABLE(JsonList, tracker_list, CACHE_DURATION_MS); + CACHED_VARIABLE_FOR_HASH(JsonList, tracker_list, CACHE_DURATION_MS, hash); try { QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); QHash trackers_data = QBtSession::instance()->getTrackersInfo(hash); @@ -223,8 +233,8 @@ QString btjson::getTrackersForTorrent(const QString& hash) tracker_list.append(tracker_dict); } - } catch(const std::exception&) { - qWarning() << "getTrackersForTorrent() called with invalid torrent"; + } catch(const std::exception& e) { + qWarning() << Q_FUNC_INFO << "Invalid torrent: " << e.what(); return QString(); } @@ -251,7 +261,7 @@ QString btjson::getTrackersForTorrent(const QString& hash) */ QString btjson::getPropertiesForTorrent(const QString& hash) { - CACHED_VARIABLE(JsonDict, data, CACHE_DURATION_MS); + CACHED_VARIABLE_FOR_HASH(JsonDict, data, CACHE_DURATION_MS, hash); try { QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); @@ -284,7 +294,8 @@ QString btjson::getPropertiesForTorrent(const QString& hash) data.add(KEY_PROP_CONNECT_COUNT, QString(QString::number(h.num_connections()) + " (" + tr("%1 max", "e.g. 10 max").arg(QString::number(h.connections_limit())) + ")")); const qreal ratio = QBtSession::instance()->getRealRatio(h.hash()); data.add(KEY_PROP_RATIO, ratio > 100. ? QString::fromUtf8("∞") : QString::number(ratio, 'f', 1)); - } catch(const std::exception&) { + } catch(const std::exception& e) { + qWarning() << Q_FUNC_INFO << "Invalid torrent: " << e.what(); return QString(); } @@ -304,7 +315,7 @@ QString btjson::getPropertiesForTorrent(const QString& hash) */ QString btjson::getFilesForTorrent(const QString& hash) { - CACHED_VARIABLE(JsonList, file_list, CACHE_DURATION_MS); + CACHED_VARIABLE_FOR_HASH(JsonList, file_list, CACHE_DURATION_MS, hash); try { QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); if (!h.has_metadata()) @@ -325,7 +336,8 @@ QString btjson::getFilesForTorrent(const QString& hash) file_list.append(file_dict); } - } catch (const std::exception&) { + } catch (const std::exception& e) { + qWarning() << Q_FUNC_INFO << "Invalid torrent: " << e.what(); return QString(); } diff --git a/src/webui/jsondict.cpp b/src/webui/jsondict.cpp index d57f4f912..3cf48ac99 100644 --- a/src/webui/jsondict.cpp +++ b/src/webui/jsondict.cpp @@ -49,10 +49,9 @@ void JsonDict::add(const QString& key, const QVariant& value) const QString& JsonDict::toString() const { - static QString str; if (m_dirty) { - str = "{" + m_items.join(",") + "}"; + m_json = "{" + m_items.join(",") + "}"; m_dirty = false; } - return str; + return m_json; } diff --git a/src/webui/jsondict.h b/src/webui/jsondict.h index ba41af150..c653da821 100644 --- a/src/webui/jsondict.h +++ b/src/webui/jsondict.h @@ -43,6 +43,7 @@ public: private: mutable bool m_dirty; + mutable QString m_json; QStringList m_items; }; diff --git a/src/webui/jsonlist.cpp b/src/webui/jsonlist.cpp index 4e6d2681f..6743ba447 100644 --- a/src/webui/jsonlist.cpp +++ b/src/webui/jsonlist.cpp @@ -37,12 +37,11 @@ JsonList::JsonList() : m_dirty(false) const QString& JsonList::toString() const { - static QString str; if (m_dirty) { - str = "[" + m_items.join(",") + "]"; + m_json = "[" + m_items.join(",") + "]"; m_dirty = false; } - return str; + return m_json; } void JsonList::clear() diff --git a/src/webui/jsonlist.h b/src/webui/jsonlist.h index d480349e6..8a21ea62e 100644 --- a/src/webui/jsonlist.h +++ b/src/webui/jsonlist.h @@ -45,6 +45,7 @@ public: private: mutable bool m_dirty; + mutable QString m_json; QStringList m_items; };