diff --git a/frameworks/core/image/image_cache.cpp b/frameworks/core/image/image_cache.cpp index f6b75b38f707886de992e509a8d0eb7769dd349a..568497762fa69c576fe77b9b55b23ed40035adb2 100644 --- a/frameworks/core/image/image_cache.cpp +++ b/frameworks/core/image/image_cache.cpp @@ -77,6 +77,24 @@ T ImageCache::GetCacheObjWithCountLimitLRU( } } +bool ImageCache::GetFromCacheFile(const std::string& filePath) +{ + std::lock_guard lock(cacheFileInfoMutex_); + return GetFromCacheFileInner(filePath); +} + +bool ImageCache::GetFromCacheFileInner(const std::string& filePath) +{ + std::list::iterator iter = std::find_if(cacheFileInfo_.begin(), cacheFileInfo_.end(), + [&filePath](const FileInfo& fileInfo) { return fileInfo.filePath == filePath; }); + if (iter == cacheFileInfo_.end()) { + return false; + } + iter->accessTime = time(nullptr); + cacheFileInfo_.splice(cacheFileInfo_.end(), cacheFileInfo_, iter); + return true; +} + void ImageCache::CacheImage(const std::string& key, const std::shared_ptr& image) { if (key.empty() || capacity_ == 0) { @@ -173,6 +191,14 @@ void ImageCache::WriteCacheFile(const std::string& url, const void * const data, std::vector removeVector; std::string cacheNetworkFilePath = GetImageCacheFilePath(url); + std::lock_guard lock(cacheFileInfoMutex_); + // 1. first check if file has been cached. + if (ImageCache::GetFromCacheFileInner(cacheNetworkFilePath)) { + LOGI("file has been wrote %{private}s", cacheNetworkFilePath.c_str()); + return; + } + + // 2. if not in dist, write file into disk. #ifdef WINDOWS_PLATFORM std::ofstream outFile(cacheNetworkFilePath, std::ios::binary); #else @@ -180,26 +206,24 @@ void ImageCache::WriteCacheFile(const std::string& url, const void * const data, #endif outFile.write(reinterpret_cast(data), size); - { - std::lock_guard lock(cacheFileInfoMutex_); - cacheFileSize_ += size; - cacheFileInfo_.emplace_back(cacheNetworkFilePath, size, time(nullptr)); - // check if cache files too big. - if (cacheFileSize_ > static_cast(cacheFileLimit_)) { - int32_t removeCount = cacheFileInfo_.size() * clearCacheFileRatio_; - int32_t removeSize = 0; - auto iter = cacheFileInfo_.begin(); - int32_t count = 0; - while (count < removeCount) { - removeSize += iter->fileSize; - removeVector.push_back(iter->filePath); - iter++; - count++; - } - cacheFileInfo_.erase(cacheFileInfo_.begin(), iter); - cacheFileSize_ -= removeSize; + cacheFileSize_ += size; + cacheFileInfo_.emplace_back(cacheNetworkFilePath, size, time(nullptr)); + // check if cache files too big. + if (cacheFileSize_ > static_cast(cacheFileLimit_)) { + int32_t removeCount = cacheFileInfo_.size() * clearCacheFileRatio_; + int32_t removeSize = 0; + auto iter = cacheFileInfo_.begin(); + int32_t count = 0; + while (count < removeCount) { + removeSize += iter->fileSize; + removeVector.push_back(iter->filePath); + iter++; + count++; } + cacheFileInfo_.erase(cacheFileInfo_.begin(), iter); + cacheFileSize_ -= removeSize; } + // 3. clear files removed from cache list. ClearCacheFile(removeVector); } diff --git a/frameworks/core/image/image_cache.h b/frameworks/core/image/image_cache.h index ca2a9ec18fd618c05d7cafc4df84580a9bb6a93c..3cf11e7322b65e681f5d5492b3d99015aaaca6ec 100644 --- a/frameworks/core/image/image_cache.h +++ b/frameworks/core/image/image_cache.h @@ -162,18 +162,7 @@ public: clearCacheFileRatio_ = clearRatio; } - static bool GetFromCacheFile(const std::string& filePath) - { - std::lock_guard lock(cacheFileInfoMutex_); - std::list::iterator iter = std::find_if(cacheFileInfo_.begin(), cacheFileInfo_.end(), - [&filePath](const FileInfo& fileInfo) { return fileInfo.filePath == filePath; }); - if (iter == cacheFileInfo_.end()) { - return false; - } - iter->accessTime = time(nullptr); - cacheFileInfo_.splice(cacheFileInfo_.end(), cacheFileInfo_, iter); - return true; - } + static bool GetFromCacheFile(const std::string& filePath); virtual void Clear() = 0; @@ -196,6 +185,8 @@ protected: std::list>& cacheList, std::unordered_map>::iterator>& cache); + static bool GetFromCacheFileInner(const std::string& filePath); + bool processImageDataCacheInner(size_t dataSize); mutable std::mutex cacheListMutex_;