Changeset 276555 in webkit
- Timestamp:
- Apr 24, 2021, 2:14:23 PM (5 years ago)
- Location:
- branches/safari-611-branch/Source/WebKit
- Files:
-
- 8 edited
-
ChangeLog (modified) (1 diff)
-
NetworkProcess/IndexedDB/WebIDBServer.cpp (modified) (10 diffs)
-
NetworkProcess/IndexedDB/WebIDBServer.h (modified) (4 diffs)
-
NetworkProcess/NetworkConnectionToWebProcess.cpp (modified) (1 diff)
-
NetworkProcess/NetworkConnectionToWebProcess.h (modified) (1 diff)
-
NetworkProcess/NetworkConnectionToWebProcess.messages.in (modified) (1 diff)
-
NetworkProcess/NetworkProcess.cpp (modified) (5 diffs)
-
WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-611-branch/Source/WebKit/ChangeLog
r276517 r276555 495 495 * WebProcess/WebCoreSupport/WebChromeClient.cpp: 496 496 (WebKit::WebChromeClient::createWindow): 497 498 2021-04-15 Russell Epstein <repstein@apple.com>499 500 Cherry-pick r275846. rdar://problem/76727548501 502 Create WebIDBServer only when it is needed503 https://bugs.webkit.org/show_bug.cgi?id=224305504 rdar://71962196505 506 Reviewed by Alex Christensen.507 508 Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not509 in use. There are two cases where network process needs a WebIDBServer:510 1. handle requests from UI process to collect or remove data511 2. handle requests from Web process to perform IDB operations512 513 Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web514 process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message515 AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation.516 517 Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded518 with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of519 pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove520 WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the521 reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits.522 523 * NetworkProcess/IndexedDB/WebIDBServer.cpp:524 (WebKit::WebIDBServer::create):525 (WebKit::WebIDBServer::WebIDBServer):526 (WebKit::m_closeCallback):527 (WebKit::WebIDBServer::~WebIDBServer):528 (WebKit::WebIDBServer::getOrigins):529 (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):530 (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):531 (WebKit::WebIDBServer::renameOrigin):532 (WebKit::WebIDBServer::removeConnection):533 (WebKit::WebIDBServer::close):534 (WebKit::WebIDBServer::tryClose):535 * NetworkProcess/IndexedDB/WebIDBServer.h:536 * NetworkProcess/NetworkConnectionToWebProcess.cpp:537 (WebKit::NetworkConnectionToWebProcess::addIDBConnection):538 * NetworkProcess/NetworkConnectionToWebProcess.h:539 * NetworkProcess/NetworkConnectionToWebProcess.messages.in:540 * NetworkProcess/NetworkProcess.cpp:541 (WebKit::NetworkProcess::didClose):542 (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):543 (WebKit::NetworkProcess::destroySession):544 (WebKit::NetworkProcess::createWebIDBServer):545 (WebKit::NetworkProcess::connectionToWebProcessClosed):546 (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer.547 * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:548 (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer):549 550 git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275846 268f45cc-cd09-0410-ab3c-d52691b4dbfc551 552 2021-04-12 Sihui Liu <sihui_liu@apple.com>553 554 Create WebIDBServer only when it is needed555 https://bugs.webkit.org/show_bug.cgi?id=224305556 rdar://71962196557 558 Reviewed by Alex Christensen.559 560 Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not561 in use. There are two cases where network process needs a WebIDBServer:562 1. handle requests from UI process to collect or remove data563 2. handle requests from Web process to perform IDB operations564 565 Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web566 process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message567 AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation.568 569 Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded570 with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of571 pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove572 WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the573 reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits.574 575 * NetworkProcess/IndexedDB/WebIDBServer.cpp:576 (WebKit::WebIDBServer::create):577 (WebKit::WebIDBServer::WebIDBServer):578 (WebKit::m_closeCallback):579 (WebKit::WebIDBServer::~WebIDBServer):580 (WebKit::WebIDBServer::getOrigins):581 (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):582 (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):583 (WebKit::WebIDBServer::renameOrigin):584 (WebKit::WebIDBServer::removeConnection):585 (WebKit::WebIDBServer::close):586 (WebKit::WebIDBServer::tryClose):587 * NetworkProcess/IndexedDB/WebIDBServer.h:588 * NetworkProcess/NetworkConnectionToWebProcess.cpp:589 (WebKit::NetworkConnectionToWebProcess::addIDBConnection):590 * NetworkProcess/NetworkConnectionToWebProcess.h:591 * NetworkProcess/NetworkConnectionToWebProcess.messages.in:592 * NetworkProcess/NetworkProcess.cpp:593 (WebKit::NetworkProcess::didClose):594 (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):595 (WebKit::NetworkProcess::destroySession):596 (WebKit::NetworkProcess::createWebIDBServer):597 (WebKit::NetworkProcess::connectionToWebProcessClosed):598 (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer.599 * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:600 (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer):601 497 602 498 2021-04-15 Russell Epstein <repstein@apple.com> -
branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp
r276183 r276555 37 37 namespace WebKit { 38 38 39 Ref<WebIDBServer> WebIDBServer::create(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester , CompletionHandler<void()>&& closeCallback)40 { 41 return adoptRef(*new WebIDBServer(sessionID, directory, WTFMove(spaceRequester) , WTFMove(closeCallback)));42 } 43 44 WebIDBServer::WebIDBServer(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester , CompletionHandler<void()>&& closeCallback)39 Ref<WebIDBServer> WebIDBServer::create(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester) 40 { 41 return adoptRef(*new WebIDBServer(sessionID, directory, WTFMove(spaceRequester))); 42 } 43 44 WebIDBServer::WebIDBServer(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester) 45 45 : CrossThreadTaskHandler("com.apple.WebKit.IndexedDBServer", WTF::CrossThreadTaskHandler::AutodrainedPoolForRunLoop::Use) 46 , m_dataTaskCounter([this](RefCounterEvent) { tryClose(); })47 , m_closeCallback(WTFMove(closeCallback))48 46 { 49 47 ASSERT(RunLoop::isMain()); … … 60 58 { 61 59 ASSERT(RunLoop::isMain()); 62 // close() has to be called to make sure thread exits.63 ASSERT(!m_closeCallback);64 60 } 65 61 … … 68 64 ASSERT(RunLoop::isMain()); 69 65 70 postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback) , token = m_dataTaskCounter.count()]() mutable {66 postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback)]() mutable { 71 67 ASSERT(!RunLoop::isMain()); 72 68 73 69 LockHolder locker(m_server->lock()); 74 postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token),origins = crossThreadCopy(m_server->getOrigins())]() mutable {70 postTaskReply(CrossThreadTask([callback = WTFMove(callback), origins = crossThreadCopy(m_server->getOrigins())]() mutable { 75 71 callback(WTFMove(origins)); 76 72 })); … … 82 78 ASSERT(RunLoop::isMain()); 83 79 84 postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback) , token = m_dataTaskCounter.count()]() mutable {80 postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback)]() mutable { 85 81 ASSERT(!RunLoop::isMain()); 86 82 87 83 LockHolder locker(m_server->lock()); 88 84 m_server->closeAndDeleteDatabasesModifiedSince(modificationTime); 89 postTaskReply(CrossThreadTask([callback = WTFMove(callback) , token = WTFMove(token)]() mutable {85 postTaskReply(CrossThreadTask([callback = WTFMove(callback)]() mutable { 90 86 callback(); 91 87 })); … … 97 93 ASSERT(RunLoop::isMain()); 98 94 99 postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback) , token = m_dataTaskCounter.count()] () mutable {95 postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback)] () mutable { 100 96 ASSERT(!RunLoop::isMain()); 101 97 102 98 LockHolder locker(m_server->lock()); 103 99 m_server->closeAndDeleteDatabasesForOrigins(originDatas); 104 postTaskReply(CrossThreadTask([callback = WTFMove(callback) , token = WTFMove(token)]() mutable {100 postTaskReply(CrossThreadTask([callback = WTFMove(callback)]() mutable { 105 101 callback(); 106 102 })); … … 112 108 ASSERT(RunLoop::isMain()); 113 109 114 postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback) , token = m_dataTaskCounter.count()] () mutable {110 postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback)] () mutable { 115 111 ASSERT(!RunLoop::isMain()); 116 112 117 113 LockHolder locker(m_server->lock()); 118 114 m_server->renameOrigin(oldOrigin, newOrigin); 119 postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable { 120 callback(); 121 })); 115 postTaskReply(CrossThreadTask(WTFMove(callback))); 122 116 }); 123 117 } … … 379 373 ASSERT(RunLoop::isMain()); 380 374 381 auto* takenConnection = m_connections.take(&connection); 382 if (!takenConnection) 383 return; 384 385 takenConnection->removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName()); 375 m_connections.remove(&connection); 376 connection.removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName()); 386 377 postTask([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()] { 387 378 auto connection = m_connectionMap.take(connectionID); … … 392 383 m_server->unregisterConnection(connection->connectionToClient()); 393 384 }); 394 395 tryClose();396 385 } 397 386 … … 411 400 { 412 401 ASSERT(RunLoop::isMain()); 413 if (!m_closeCallback)414 return;415 402 416 403 // Remove the references held by IPC::Connection. … … 429 416 CrossThreadTaskHandler::kill(); 430 417 }); 431 432 m_closeCallback();433 }434 435 void WebIDBServer::tryClose()436 {437 if (!m_connections.isEmpty() || m_dataTaskCounter.value())438 return;439 440 close();441 418 } 442 419 -
branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h
r276183 r276555 34 34 #include <WebCore/StorageQuotaManager.h> 35 35 #include <wtf/CrossThreadTaskHandler.h> 36 #include <wtf/RefCounter.h>37 36 38 37 namespace WebCore { … … 47 46 class WebIDBServer final : public CrossThreadTaskHandler, public IPC::Connection::ThreadMessageReceiverRefCounted { 48 47 public: 49 static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& , CompletionHandler<void()>&&);48 static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&); 50 49 51 50 void getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&&); … … 92 91 void close(); 93 92 93 bool hasConnection() const { return !m_connections.isEmpty(); } 94 94 private: 95 WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& , CompletionHandler<void()>&&);95 WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&); 96 96 ~WebIDBServer(); 97 97 98 98 void postTask(WTF::Function<void()>&&); 99 100 void tryClose();101 99 102 100 std::unique_ptr<WebCore::IDBServer::IDBServer> m_server; … … 105 103 HashMap<IPC::Connection::UniqueID, std::unique_ptr<WebIDBConnectionToClient>> m_connectionMap; 106 104 HashSet<IPC::Connection*> m_connections; 107 108 enum DataTaskCounterType { };109 using DataTaskCounter = RefCounter<DataTaskCounterType>;110 using DataTaskCounterToken = DataTaskCounter::Token;111 DataTaskCounter m_dataTaskCounter;112 CompletionHandler<void()> m_closeCallback;113 105 }; 114 106 -
branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp
r276183 r276555 1171 1171 } 1172 1172 1173 void NetworkConnectionToWebProcess::addIDBConnection()1174 {1175 m_networkProcess->webIDBServer(m_sessionID).addConnection(m_connection.get(), m_webProcessIdentifier);1176 }1177 1178 1173 } // namespace WebKit 1179 1174 -
branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h
r276183 r276555 177 177 void broadcastConsoleMessage(JSC::MessageSource, JSC::MessageLevel, const String& message); 178 178 179 void addIDBConnection();180 181 179 private: 182 180 NetworkConnectionToWebProcess(NetworkProcess&, WebCore::ProcessIdentifier, PAL::SessionID, IPC::Connection::Identifier); -
branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in
r276183 r276555 102 102 UpdateActivePages(String name, Vector<String> activePagesOrigins, audit_token_t auditToken) 103 103 #endif 104 105 AddIDBConnection()106 104 } -
branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r276183 r276555 268 268 platformFlushCookies(networkSession.sessionID(), [callbackAggregator] { }); 269 269 }); 270 271 // Make sure references to NetworkProcess in spaceRequester and closeHandler is removed.272 for (auto& server : m_webIDBServers.values())273 server->close();274 270 } 275 271 … … 552 548 m_storageManagerSet->remove(sessionID); 553 549 550 #if ENABLE(INDEXED_DATABASE) 551 removeWebIDBServerIfPossible(sessionID); 552 #endif 554 553 } 555 554 … … 2328 2327 } 2329 2328 2330 auto spaceRequester = [protectedThis = makeRef(*this), sessionID](const auto& origin, uint64_t spaceRequested) { 2331 return protectedThis->storageQuotaManager(sessionID, origin)->requestSpaceOnBackgroundThread(spaceRequested); 2332 }; 2333 auto closeHandler = [protectedThis = makeRef(*this), sessionID]() { 2334 protectedThis->m_webIDBServers.remove(sessionID); 2335 }; 2336 return WebIDBServer::create(sessionID, path, WTFMove(spaceRequester), WTFMove(closeHandler)); 2329 return WebIDBServer::create(sessionID, path, [this, weakThis = makeWeakPtr(this), sessionID](const auto& origin, uint64_t spaceRequested) { 2330 RefPtr<StorageQuotaManager> storageQuotaManager = weakThis ? this->storageQuotaManager(sessionID, origin) : nullptr; 2331 return storageQuotaManager ? storageQuotaManager->requestSpaceOnBackgroundThread(spaceRequested) : StorageQuotaManager::Decision::Deny; 2332 }); 2337 2333 } 2338 2334 … … 2363 2359 sessionStorageQuotaManager->setIDBRootPath(idbRootPath); 2364 2360 } 2361 2362 void NetworkProcess::removeWebIDBServerIfPossible(PAL::SessionID sessionID) 2363 { 2364 ASSERT(RunLoop::isMain()); 2365 2366 auto iterator = m_webIDBServers.find(sessionID); 2367 if (iterator == m_webIDBServers.end()) 2368 return; 2369 2370 if (m_networkSessions.contains(sessionID)) 2371 return; 2372 2373 if (iterator->value->hasConnection()) 2374 return; 2375 2376 iterator->value->close(); 2377 m_webIDBServers.remove(iterator); 2378 } 2379 2365 2380 #endif // ENABLE(INDEXED_DATABASE) 2366 2381 … … 2640 2655 ASSERT(webIDBServer); 2641 2656 webIDBServer->removeConnection(connection); 2657 removeWebIDBServerIfPossible(sessionID); 2642 2658 #endif 2643 2659 } -
branches/safari-611-branch/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp
r276183 r276555 62 62 : m_connectionToServer(IDBClient::IDBConnectionToServer::create(*this)) 63 63 { 64 send(Messages::NetworkConnectionToWebProcess::AddIDBConnection());65 64 } 66 65
Note:
See TracChangeset
for help on using the changeset viewer.