mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-20 04:25:42 +08:00
refs #659 Add the method CData::admit() which causes a value with deferred loading to be loaded.
This commit is contained in:
@@ -145,6 +145,12 @@ namespace BlackMisc
|
|||||||
QTimer::singleShot(0, &m_serializer, [this, key] { m_revision.deferValue(key); });
|
QTimer::singleShot(0, &m_serializer, [this, key] { m_revision.deferValue(key); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CDataCache::admitValue(const QString &key, bool triggerLoad)
|
||||||
|
{
|
||||||
|
QTimer::singleShot(0, &m_serializer, [this, key] { m_revision.admitValue(key); });
|
||||||
|
if (triggerLoad) { loadFromStoreAsync(); }
|
||||||
|
}
|
||||||
|
|
||||||
QString lockFileError(const QLockFile &lock)
|
QString lockFileError(const QLockFile &lock)
|
||||||
{
|
{
|
||||||
switch (lock.error())
|
switch (lock.error())
|
||||||
@@ -361,7 +367,7 @@ namespace BlackMisc
|
|||||||
auto deferrals = fromJson(json.value("deferrals").toArray());
|
auto deferrals = fromJson(json.value("deferrals").toArray());
|
||||||
for (const auto &key : m_timestamps.keys())
|
for (const auto &key : m_timestamps.keys())
|
||||||
{
|
{
|
||||||
if (deferrals.contains(key)) { m_timestamps.remove(key); }
|
if (deferrals.contains(key) && ! m_admittedValues.contains(key)) { m_timestamps.remove(key); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (revisionFile.size() > 0)
|
else if (revisionFile.size() > 0)
|
||||||
@@ -561,6 +567,13 @@ namespace BlackMisc
|
|||||||
m_deferredValues.insert(key);
|
m_deferredValues.insert(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CDataCacheRevision::admitValue(const QString &key)
|
||||||
|
{
|
||||||
|
Q_ASSERT(! m_updateInProgress);
|
||||||
|
|
||||||
|
m_admittedValues.insert(key);
|
||||||
|
}
|
||||||
|
|
||||||
QJsonObject CDataCacheRevision::toJson(const QMap<QString, qint64> ×tamps)
|
QJsonObject CDataCacheRevision::toJson(const QMap<QString, qint64> ×tamps)
|
||||||
{
|
{
|
||||||
QJsonObject result;
|
QJsonObject result;
|
||||||
|
|||||||
@@ -147,6 +147,9 @@ namespace BlackMisc
|
|||||||
//! Set the flag which will cause the value to be deferred-loaded.
|
//! Set the flag which will cause the value to be deferred-loaded.
|
||||||
void deferValue(const QString &key);
|
void deferValue(const QString &key);
|
||||||
|
|
||||||
|
//! Set the flag which will cause a deferred-load value to be loaded.
|
||||||
|
void admitValue(const QString &key);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable QMutex m_mutex { QMutex::Recursive };
|
mutable QMutex m_mutex { QMutex::Recursive };
|
||||||
bool m_updateInProgress = false;
|
bool m_updateInProgress = false;
|
||||||
@@ -159,6 +162,7 @@ namespace BlackMisc
|
|||||||
QMap<QString, qint64> m_timesToLive;
|
QMap<QString, qint64> m_timesToLive;
|
||||||
QSet<QString> m_pinnedValues;
|
QSet<QString> m_pinnedValues;
|
||||||
QSet<QString> m_deferredValues;
|
QSet<QString> m_deferredValues;
|
||||||
|
QSet<QString> m_admittedValues;
|
||||||
std::vector<std::promise<void>> m_promises;
|
std::vector<std::promise<void>> m_promises;
|
||||||
|
|
||||||
static QJsonObject toJson(const QMap<QString, qint64> ×tamps);
|
static QJsonObject toJson(const QMap<QString, qint64> ×tamps);
|
||||||
@@ -242,6 +246,9 @@ namespace BlackMisc
|
|||||||
//! Method used for implementing deferring values.
|
//! Method used for implementing deferring values.
|
||||||
void deferValue(const QString &key);
|
void deferValue(const QString &key);
|
||||||
|
|
||||||
|
//! Method used for implementing deferring values.
|
||||||
|
void admitValue(const QString &key, bool triggerLoad);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CDataCache();
|
CDataCache();
|
||||||
|
|
||||||
@@ -284,6 +291,13 @@ namespace BlackMisc
|
|||||||
static_assert(! (Trait::isPinned() && Trait::isDeferred()), "trait can not be both pinned and deferred");
|
static_assert(! (Trait::isPinned() && Trait::isDeferred()), "trait can not be both pinned and deferred");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! \copydoc BlackMisc::CCached::set
|
||||||
|
CStatusMessage set(const typename Trait::type &value, qint64 timestamp = 0)
|
||||||
|
{
|
||||||
|
CDataCache::instance()->admitValue(Trait::key(), false);
|
||||||
|
return CCached<typename Trait::type>::set(value, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
//! Reset the data to its default value.
|
//! Reset the data to its default value.
|
||||||
void setDefault() { this->set(Trait::defaultValue()); }
|
void setDefault() { this->set(Trait::defaultValue()); }
|
||||||
|
|
||||||
@@ -296,12 +310,17 @@ namespace BlackMisc
|
|||||||
//! Don't change the value, but write a new timestamp, to extend the life of the value.
|
//! Don't change the value, but write a new timestamp, to extend the life of the value.
|
||||||
void renewTimestamp(qint64 timestamp) { return CDataCache::instance()->renewTimestamp(this->getKey(), timestamp); }
|
void renewTimestamp(qint64 timestamp) { return CDataCache::instance()->renewTimestamp(this->getKey(), timestamp); }
|
||||||
|
|
||||||
|
//! If the value is load-deferred, trigger the deferred load (async).
|
||||||
|
void admit() { CDataCache::instance()->admitValue(Trait::key(), true); }
|
||||||
|
|
||||||
//! If the value is currently being loaded, wait for it to finish loading, and call the notification slot, if any.
|
//! If the value is currently being loaded, wait for it to finish loading, and call the notification slot, if any.
|
||||||
void synchronize()
|
void synchronize()
|
||||||
{
|
{
|
||||||
auto *queue = this->m_page.template findChild<Private::CDataPageQueue *>();
|
auto *queue = this->m_page.template findChild<Private::CDataPageQueue *>();
|
||||||
Q_ASSERT(queue);
|
Q_ASSERT(queue);
|
||||||
|
admit();
|
||||||
CDataCache::instance()->synchronize(this->getKey());
|
CDataCache::instance()->synchronize(this->getKey());
|
||||||
|
CDataCache::instance()->synchronize(this->getKey()); // if load was in progress when admit() was called, synchronize with the next load
|
||||||
queue->setQueuedValueFromCache(this->getKey());
|
queue->setQueuedValueFromCache(this->getKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user