34 #include <QMutexLocker>
45 QString GetCacheDir (
const QString& subpath)
52 : QNetworkDiskCache (parent)
54 , InsertRemoveMutex_ (QMutex::Recursive)
55 , GcGuard_ (NetworkDiskCacheGC::Instance ().RegisterDirectory (GetCacheDir (subpath),
56 [this] {
return maximumCacheSize (); }))
58 setCacheDirectory (GetCacheDir (subpath));
61 qint64 NetworkDiskCache::cacheSize ()
const
66 QIODevice* NetworkDiskCache::data (
const QUrl& url)
68 QMutexLocker lock (&InsertRemoveMutex_);
69 return QNetworkDiskCache::data (url);
72 void NetworkDiskCache::insert (QIODevice *device)
74 QMutexLocker lock (&InsertRemoveMutex_);
75 if (!PendingDev2Url_.contains (device))
77 qWarning () << Q_FUNC_INFO
78 <<
"stall device detected";
82 PendingUrl2Devs_ [PendingDev2Url_.take (device)].removeAll (device);
84 CurrentSize_ += device->size ();
85 QNetworkDiskCache::insert (device);
88 QNetworkCacheMetaData NetworkDiskCache::metaData (
const QUrl& url)
90 QMutexLocker lock (&InsertRemoveMutex_);
91 return QNetworkDiskCache::metaData (url);
94 QIODevice* NetworkDiskCache::prepare (
const QNetworkCacheMetaData& metadata)
96 QMutexLocker lock (&InsertRemoveMutex_);
97 const auto dev = QNetworkDiskCache::prepare (metadata);
98 PendingDev2Url_ [dev] = metadata.url ();
99 PendingUrl2Devs_ [metadata.url ()] << dev;
103 bool NetworkDiskCache::remove (
const QUrl& url)
105 QMutexLocker lock (&InsertRemoveMutex_);
106 for (
const auto dev : PendingUrl2Devs_.take (url))
107 PendingDev2Url_.remove (dev);
108 return QNetworkDiskCache::remove (url);
111 void NetworkDiskCache::updateMetaData (
const QNetworkCacheMetaData& metaData)
113 QMutexLocker lock (&InsertRemoveMutex_);
114 QNetworkDiskCache::updateMetaData (metaData);
117 qint64 NetworkDiskCache::expire ()
119 if (CurrentSize_ < 0)
121 const auto& dir = cacheDirectory ();
122 Util::Sequence (
this, NetworkDiskCacheGC::Instance ().GetCurrentSize (dir)) >>
123 [
this] (qint64 res) { CurrentSize_ = res; };
125 return maximumCacheSize () * 8 / 10;