WebKit Bugzilla
Attachment 373431 Details for
Bug 199470
: Make CacheStorage::Engine directory listing operations in a background thread
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-199470-20190703162803.patch (text/plain), 7.23 KB, created by
youenn fablet
on 2019-07-03 16:28:04 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2019-07-03 16:28:04 PDT
Size:
7.23 KB
patch
obsolete
>Subversion Revision: 247073 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 55ad41e93362af9b65c192d618e4116feea8ac7e..e06391055158f232a8054d018543d5a190a774b1 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,23 @@ >+2019-07-03 Youenn Fablet <youenn@apple.com> >+ >+ Make CacheStorage::Engine directory listing operations in a background thread >+ https://bugs.webkit.org/show_bug.cgi?id=199470 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Use the io work queue to get the list of directories. >+ Then go back to main thread and trigger clear/fetch operation as currently done. >+ >+ * NetworkProcess/cache/CacheStorageEngine.cpp: >+ (WebKit::CacheStorage::ReadOriginsTaskCounter::create): >+ (WebKit::CacheStorage::ReadOriginsTaskCounter::ReadOriginsTaskCounter): >+ (WebKit::CacheStorage::Engine::getDirectories): >+ (WebKit::CacheStorage::Engine::fetchEntries): >+ (WebKit::CacheStorage::Engine::fetchDirectoryEntries): >+ (WebKit::CacheStorage::Engine::clearCachesForOriginFromDisk): >+ (WebKit::CacheStorage::Engine::clearCachesForOriginFromDirectories): >+ * NetworkProcess/cache/CacheStorageEngine.h: >+ > 2019-07-03 Youenn Fablet <youenn@apple.com> > > Isolate CacheStorage::Engine path when hopping to a background thread >diff --git a/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp b/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp >index ac3cdb93046cb5743082c0215840f3e017b231e5..9811260a94cf6cbdc6ae22ad239d43d747da727f 100644 >--- a/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp >+++ b/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp >@@ -459,7 +459,7 @@ void Engine::removeFile(const String& filename) > > class ReadOriginsTaskCounter : public RefCounted<ReadOriginsTaskCounter> { > public: >- static Ref<ReadOriginsTaskCounter> create(WTF::CompletionHandler<void(Vector<WebsiteData::Entry>)>&& callback) >+ static Ref<ReadOriginsTaskCounter> create(CompletionHandler<void(Vector<WebsiteData::Entry>)>&& callback) > { > return adoptRef(*new ReadOriginsTaskCounter(WTFMove(callback))); > } >@@ -475,16 +475,31 @@ public: > } > > private: >- explicit ReadOriginsTaskCounter(WTF::CompletionHandler<void(Vector<WebsiteData::Entry>)>&& callback) >+ explicit ReadOriginsTaskCounter(CompletionHandler<void(Vector<WebsiteData::Entry>)>&& callback) > : m_callback(WTFMove(callback)) > { > } > >- WTF::CompletionHandler<void(Vector<WebsiteData::Entry>)> m_callback; >+ CompletionHandler<void(Vector<WebsiteData::Entry>)> m_callback; > Vector<WebsiteData::Entry> m_entries; > }; > >-void Engine::fetchEntries(bool shouldComputeSize, WTF::CompletionHandler<void(Vector<WebsiteData::Entry>)>&& completionHandler) >+void Engine::getDirectories(CompletionHandler<void(const Vector<String>&)>&& completionHandler) >+{ >+ m_ioQueue->dispatch([path = m_rootPath.isolatedCopy(), completionHandler = WTFMove(completionHandler)]() mutable { >+ Vector<String> folderPaths; >+ for (auto& filename : FileSystem::listDirectory(path, "*")) { >+ if (FileSystem::fileIsDirectory(filename, FileSystem::ShouldFollowSymbolicLinks::No)) >+ folderPaths.append(filename.isolatedCopy()); >+ } >+ >+ RunLoop::main().dispatch([folderPaths = WTFMove(folderPaths), completionHandler = WTFMove(completionHandler)]() mutable { >+ completionHandler(folderPaths); >+ }); >+ }); >+} >+ >+void Engine::fetchEntries(bool shouldComputeSize, CompletionHandler<void(Vector<WebsiteData::Entry>)>&& completionHandler) > { > if (!shouldPersist()) { > auto entries = WTF::map(m_caches, [] (auto& pair) { >@@ -494,10 +509,17 @@ void Engine::fetchEntries(bool shouldComputeSize, WTF::CompletionHandler<void(Ve > return; > } > >+ getDirectories([this, weakThis = makeWeakPtr(this), path = m_rootPath.isolatedCopy(), shouldComputeSize, completionHandler = WTFMove(completionHandler)](const auto& folderPaths) mutable { >+ if (!weakThis) >+ return completionHandler({ }); >+ fetchDirectoryEntries(shouldComputeSize, folderPaths, WTFMove(completionHandler)); >+ }); >+} >+ >+void Engine::fetchDirectoryEntries(bool shouldComputeSize, const Vector<String>& folderPaths, CompletionHandler<void(Vector<WebsiteData::Entry>)>&& completionHandler) >+{ > auto taskCounter = ReadOriginsTaskCounter::create(WTFMove(completionHandler)); >- for (auto& folderPath : FileSystem::listDirectory(m_rootPath, "*")) { >- if (!FileSystem::fileIsDirectory(folderPath, FileSystem::ShouldFollowSymbolicLinks::No)) >- continue; >+ for (auto& folderPath : folderPaths) { > Caches::retrieveOriginFromDirectory(folderPath, *m_ioQueue, [protectedThis = makeRef(*this), shouldComputeSize, taskCounter = taskCounter.copyRef()] (auto&& origin) mutable { > ASSERT(RunLoop::isMain()); > if (!origin) >@@ -569,12 +591,17 @@ void Engine::clearCachesForOrigin(const WebCore::SecurityOriginData& origin, Com > void Engine::clearCachesForOriginFromDisk(const WebCore::SecurityOriginData& origin, CompletionHandler<void()>&& completionHandler) > { > ASSERT(RunLoop::isMain()); >+ getDirectories([this, weakThis = makeWeakPtr(this), origin, completionHandler = WTFMove(completionHandler)](const auto& folderPaths) mutable { >+ if (!weakThis) >+ return completionHandler(); >+ clearCachesForOriginFromDirectories(folderPaths, origin, WTFMove(completionHandler)); >+ }); >+} > >+void Engine::clearCachesForOriginFromDirectories(const Vector<String>& folderPaths, const WebCore::SecurityOriginData& origin, CompletionHandler<void()>&& completionHandler) >+{ > auto callbackAggregator = CallbackAggregator::create(WTFMove(completionHandler)); >- >- for (auto& folderPath : FileSystem::listDirectory(m_rootPath, "*")) { >- if (!FileSystem::fileIsDirectory(folderPath, FileSystem::ShouldFollowSymbolicLinks::No)) >- continue; >+ for (auto& folderPath : folderPaths) { > Caches::retrieveOriginFromDirectory(folderPath, *m_ioQueue, [this, protectedThis = makeRef(*this), origin, callbackAggregator = callbackAggregator.copyRef(), folderPath] (Optional<WebCore::ClientOrigin>&& folderOrigin) mutable { > if (!folderOrigin) > return; >diff --git a/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h b/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h >index 176850149af3ec1ce516db4e6c262ed7b83b2dee..8aa4732a0440d27f94394b6274ac41cbd1342f8e 100644 >--- a/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h >+++ b/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h >@@ -119,6 +119,10 @@ private: > > void fetchEntries(bool /* shouldComputeSize */, CompletionHandler<void(Vector<WebsiteData::Entry>)>&&); > >+ void getDirectories(CompletionHandler<void(const Vector<String>&)>&&); >+ void fetchDirectoryEntries(bool shouldComputeSize, const Vector<String>& folderPaths, CompletionHandler<void(Vector<WebsiteData::Entry>)>&&); >+ void clearCachesForOriginFromDirectories(const Vector<String>&, const WebCore::SecurityOriginData&, CompletionHandler<void()>&&); >+ > void initialize(WebCore::DOMCacheEngine::CompletionCallback&&); > > using CachesOrError = Expected<std::reference_wrapper<Caches>, WebCore::DOMCacheEngine::Error>;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 199470
:
373423
| 373431