Changeset 275846 in webkit
- Timestamp:
- Apr 12, 2021 4:43:49 PM (3 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r275839 r275846 1 2021-04-12 Sihui Liu <sihui_liu@apple.com> 2 3 Create WebIDBServer only when it is needed 4 https://bugs.webkit.org/show_bug.cgi?id=224305 5 rdar://71962196 6 7 Reviewed by Alex Christensen. 8 9 Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not 10 in use. There are two cases where network process needs a WebIDBServer: 11 1. handle requests from UI process to collect or remove data 12 2. handle requests from Web process to perform IDB operations 13 14 Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web 15 process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message 16 AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation. 17 18 Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded 19 with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of 20 pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove 21 WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the 22 reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits. 23 24 * NetworkProcess/IndexedDB/WebIDBServer.cpp: 25 (WebKit::WebIDBServer::create): 26 (WebKit::WebIDBServer::WebIDBServer): 27 (WebKit::m_closeCallback): 28 (WebKit::WebIDBServer::~WebIDBServer): 29 (WebKit::WebIDBServer::getOrigins): 30 (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince): 31 (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins): 32 (WebKit::WebIDBServer::renameOrigin): 33 (WebKit::WebIDBServer::removeConnection): 34 (WebKit::WebIDBServer::close): 35 (WebKit::WebIDBServer::tryClose): 36 * NetworkProcess/IndexedDB/WebIDBServer.h: 37 * NetworkProcess/NetworkConnectionToWebProcess.cpp: 38 (WebKit::NetworkConnectionToWebProcess::addIDBConnection): 39 * NetworkProcess/NetworkConnectionToWebProcess.h: 40 * NetworkProcess/NetworkConnectionToWebProcess.messages.in: 41 * NetworkProcess/NetworkProcess.cpp: 42 (WebKit::NetworkProcess::didClose): 43 (WebKit::NetworkProcess::createNetworkConnectionToWebProcess): 44 (WebKit::NetworkProcess::destroySession): 45 (WebKit::NetworkProcess::createWebIDBServer): 46 (WebKit::NetworkProcess::connectionToWebProcessClosed): 47 (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer. 48 * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp: 49 (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer): 50 1 51 2021-04-12 Chris Dumez <cdumez@apple.com> 2 52 -
trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp
r275799 r275846 35 35 namespace WebKit { 36 36 37 Ref<WebIDBServer> WebIDBServer::create(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester )38 { 39 return adoptRef(*new WebIDBServer(sessionID, directory, WTFMove(spaceRequester) ));40 } 41 42 WebIDBServer::WebIDBServer(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester )37 Ref<WebIDBServer> WebIDBServer::create(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester, CompletionHandler<void()>&& closeCallback) 38 { 39 return adoptRef(*new WebIDBServer(sessionID, directory, WTFMove(spaceRequester), WTFMove(closeCallback))); 40 } 41 42 WebIDBServer::WebIDBServer(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester, CompletionHandler<void()>&& closeCallback) 43 43 : CrossThreadTaskHandler("com.apple.WebKit.IndexedDBServer", WTF::CrossThreadTaskHandler::AutodrainedPoolForRunLoop::Use) 44 , m_dataTaskCounter([this](RefCounterEvent) { tryClose(); }) 45 , m_closeCallback(WTFMove(closeCallback)) 44 46 { 45 47 ASSERT(RunLoop::isMain()); … … 56 58 { 57 59 ASSERT(RunLoop::isMain()); 60 // close() has to be called to make sure thread exits. 61 ASSERT(!m_closeCallback); 58 62 } 59 63 … … 62 66 ASSERT(RunLoop::isMain()); 63 67 64 postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback) ]() mutable {68 postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable { 65 69 ASSERT(!RunLoop::isMain()); 66 70 67 71 LockHolder locker(m_server->lock()); 68 postTaskReply(CrossThreadTask([callback = WTFMove(callback), origins = crossThreadCopy(m_server->getOrigins())]() mutable {72 postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token), origins = crossThreadCopy(m_server->getOrigins())]() mutable { 69 73 callback(WTFMove(origins)); 70 74 })); … … 76 80 ASSERT(RunLoop::isMain()); 77 81 78 postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback) ]() mutable {82 postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable { 79 83 ASSERT(!RunLoop::isMain()); 80 84 81 85 LockHolder locker(m_server->lock()); 82 86 m_server->closeAndDeleteDatabasesModifiedSince(modificationTime); 83 postTaskReply(CrossThreadTask([callback = WTFMove(callback) ]() mutable {87 postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable { 84 88 callback(); 85 89 })); … … 91 95 ASSERT(RunLoop::isMain()); 92 96 93 postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback) ] () mutable {97 postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable { 94 98 ASSERT(!RunLoop::isMain()); 95 99 96 100 LockHolder locker(m_server->lock()); 97 101 m_server->closeAndDeleteDatabasesForOrigins(originDatas); 98 postTaskReply(CrossThreadTask([callback = WTFMove(callback) ]() mutable {102 postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable { 99 103 callback(); 100 104 })); … … 106 110 ASSERT(RunLoop::isMain()); 107 111 108 postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback) ] () mutable {112 postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable { 109 113 ASSERT(!RunLoop::isMain()); 110 114 111 115 LockHolder locker(m_server->lock()); 112 116 m_server->renameOrigin(oldOrigin, newOrigin); 113 postTaskReply(CrossThreadTask(WTFMove(callback))); 117 postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable { 118 callback(); 119 })); 114 120 }); 115 121 } … … 371 377 ASSERT(RunLoop::isMain()); 372 378 373 m_connections.remove(&connection); 374 connection.removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName()); 379 auto* takenConnection = m_connections.take(&connection); 380 if (!takenConnection) 381 return; 382 383 takenConnection->removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName()); 375 384 postTask([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()] { 376 385 auto connection = m_connectionMap.take(connectionID); … … 381 390 m_server->unregisterConnection(connection->connectionToClient()); 382 391 }); 392 393 tryClose(); 383 394 } 384 395 … … 398 409 { 399 410 ASSERT(RunLoop::isMain()); 411 if (!m_closeCallback) 412 return; 400 413 401 414 // Remove the references held by IPC::Connection. … … 414 427 CrossThreadTaskHandler::kill(); 415 428 }); 429 430 m_closeCallback(); 431 } 432 433 void WebIDBServer::tryClose() 434 { 435 if (!m_connections.isEmpty() || m_dataTaskCounter.value()) 436 return; 437 438 close(); 416 439 } 417 440 -
trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h
r275799 r275846 32 32 #include <WebCore/StorageQuotaManager.h> 33 33 #include <wtf/CrossThreadTaskHandler.h> 34 #include <wtf/RefCounter.h> 34 35 35 36 namespace WebCore { … … 44 45 class WebIDBServer final : public CrossThreadTaskHandler, public IPC::Connection::ThreadMessageReceiverRefCounted { 45 46 public: 46 static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& );47 static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&, CompletionHandler<void()>&&); 47 48 48 49 void getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&&); … … 89 90 void close(); 90 91 91 bool hasConnection() const { return !m_connections.isEmpty(); }92 92 private: 93 WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& );93 WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&, CompletionHandler<void()>&&); 94 94 ~WebIDBServer(); 95 95 96 96 void postTask(WTF::Function<void()>&&); 97 98 void tryClose(); 97 99 98 100 std::unique_ptr<WebCore::IDBServer::IDBServer> m_server; … … 101 103 HashMap<IPC::Connection::UniqueID, std::unique_ptr<WebIDBConnectionToClient>> m_connectionMap; 102 104 HashSet<IPC::Connection*> m_connections; 105 106 enum DataTaskCounterType { }; 107 using DataTaskCounter = RefCounter<DataTaskCounterType>; 108 using DataTaskCounterToken = DataTaskCounter::Token; 109 DataTaskCounter m_dataTaskCounter; 110 CompletionHandler<void()> m_closeCallback; 103 111 }; 104 112 -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp
r275799 r275846 1242 1242 } 1243 1243 1244 void NetworkConnectionToWebProcess::addIDBConnection() 1245 { 1246 m_networkProcess->webIDBServer(m_sessionID).addConnection(m_connection.get(), m_webProcessIdentifier); 1247 } 1244 1248 1245 1249 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h
r275799 r275846 187 187 void broadcastConsoleMessage(JSC::MessageSource, JSC::MessageLevel, const String& message); 188 188 189 void addIDBConnection(); 190 189 191 private: 190 192 NetworkConnectionToWebProcess(NetworkProcess&, WebCore::ProcessIdentifier, PAL::SessionID, IPC::Connection::Identifier); -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in
r275799 r275846 108 108 SetResourceLoadSchedulingMode(WebCore::PageIdentifier webPageID, enum:uint8_t WebCore::LoadSchedulingMode mode) 109 109 PrioritizeResourceLoads(Vector<uint64_t> loadIdentifiers) 110 111 AddIDBConnection() 110 112 } -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r275799 r275846 273 273 platformFlushCookies(networkSession.sessionID(), [callbackAggregator] { }); 274 274 }); 275 276 // Make sure references to NetworkProcess in spaceRequester and closeHandler is removed. 277 for (auto& server : m_webIDBServers.values()) 278 server->close(); 275 279 } 276 280 … … 392 396 393 397 m_storageManagerSet->addConnection(connection.connection()); 394 395 webIDBServer(sessionID).addConnection(connection.connection(), identifier);396 398 } 397 399 … … 553 555 554 556 m_storageManagerSet->remove(sessionID); 555 556 removeWebIDBServerIfPossible(sessionID);557 557 } 558 558 … … 2331 2331 } 2332 2332 2333 return WebIDBServer::create(sessionID, path, [this, weakThis = makeWeakPtr(this), sessionID](const auto& origin, uint64_t spaceRequested) { 2334 RefPtr<StorageQuotaManager> storageQuotaManager = weakThis ? this->storageQuotaManager(sessionID, origin) : nullptr; 2335 return storageQuotaManager ? storageQuotaManager->requestSpaceOnBackgroundThread(spaceRequested) : StorageQuotaManager::Decision::Deny; 2336 }); 2333 auto spaceRequester = [protectedThis = makeRef(*this), sessionID](const auto& origin, uint64_t spaceRequested) { 2334 return protectedThis->storageQuotaManager(sessionID, origin)->requestSpaceOnBackgroundThread(spaceRequested); 2335 }; 2336 auto closeHandler = [protectedThis = makeRef(*this), sessionID]() { 2337 protectedThis->m_webIDBServers.remove(sessionID); 2338 }; 2339 return WebIDBServer::create(sessionID, path, WTFMove(spaceRequester), WTFMove(closeHandler)); 2337 2340 } 2338 2341 … … 2362 2365 ASSERT(sessionStorageQuotaManager); 2363 2366 sessionStorageQuotaManager->setIDBRootPath(idbRootPath); 2364 }2365 2366 void NetworkProcess::removeWebIDBServerIfPossible(PAL::SessionID sessionID)2367 {2368 ASSERT(RunLoop::isMain());2369 2370 auto iterator = m_webIDBServers.find(sessionID);2371 if (iterator == m_webIDBServers.end())2372 return;2373 2374 if (m_networkSessions.contains(sessionID))2375 return;2376 2377 if (iterator->value->hasConnection())2378 return;2379 2380 iterator->value->close();2381 m_webIDBServers.remove(iterator);2382 2367 } 2383 2368 … … 2668 2653 m_storageManagerSet->removeConnection(connection); 2669 2654 2670 auto* webIDBServer = m_webIDBServers.get(sessionID); 2671 ASSERT(webIDBServer); 2672 webIDBServer->removeConnection(connection); 2673 removeWebIDBServerIfPossible(sessionID); 2655 if (auto* server = m_webIDBServers.get(sessionID)) 2656 server->removeConnection(connection); 2674 2657 } 2675 2658 -
trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp
r275799 r275846 60 60 : m_connectionToServer(IDBClient::IDBConnectionToServer::create(*this)) 61 61 { 62 send(Messages::NetworkConnectionToWebProcess::AddIDBConnection()); 62 63 } 63 64
Note: See TracChangeset
for help on using the changeset viewer.