Changeset 276556 in webkit
- Timestamp:
- Apr 24, 2021, 2:21:24 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) (6 diffs)
-
WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-611-branch/Source/WebKit/ChangeLog
r276555 r276556 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/76727548 501 502 Create WebIDBServer only when it is needed 503 https://bugs.webkit.org/show_bug.cgi?id=224305 504 rdar://71962196 505 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 not 509 in use. There are two cases where network process needs a WebIDBServer: 510 1. handle requests from UI process to collect or remove data 511 2. handle requests from Web process to perform IDB operations 512 513 Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web 514 process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message 515 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 binded 518 with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of 519 pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove 520 WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the 521 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-d52691b4dbfc 551 552 2021-04-12 Sihui Liu <sihui_liu@apple.com> 553 554 Create WebIDBServer only when it is needed 555 https://bugs.webkit.org/show_bug.cgi?id=224305 556 rdar://71962196 557 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 not 561 in use. There are two cases where network process needs a WebIDBServer: 562 1. handle requests from UI process to collect or remove data 563 2. handle requests from Web process to perform IDB operations 564 565 Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web 566 process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message 567 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 binded 570 with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of 571 pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove 572 WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the 573 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): 497 601 498 602 2021-04-15 Russell Epstein <repstein@apple.com> -
branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp
r276555 r276556 37 37 namespace WebKit { 38 38 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 )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) 45 45 : CrossThreadTaskHandler("com.apple.WebKit.IndexedDBServer", WTF::CrossThreadTaskHandler::AutodrainedPoolForRunLoop::Use) 46 , m_dataTaskCounter([this](RefCounterEvent) { tryClose(); }) 47 , m_closeCallback(WTFMove(closeCallback)) 46 48 { 47 49 ASSERT(RunLoop::isMain()); … … 58 60 { 59 61 ASSERT(RunLoop::isMain()); 62 // close() has to be called to make sure thread exits. 63 ASSERT(!m_closeCallback); 60 64 } 61 65 … … 64 68 ASSERT(RunLoop::isMain()); 65 69 66 postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback) ]() mutable {70 postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable { 67 71 ASSERT(!RunLoop::isMain()); 68 72 69 73 LockHolder locker(m_server->lock()); 70 postTaskReply(CrossThreadTask([callback = WTFMove(callback), origins = crossThreadCopy(m_server->getOrigins())]() mutable {74 postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token), origins = crossThreadCopy(m_server->getOrigins())]() mutable { 71 75 callback(WTFMove(origins)); 72 76 })); … … 78 82 ASSERT(RunLoop::isMain()); 79 83 80 postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback) ]() mutable {84 postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable { 81 85 ASSERT(!RunLoop::isMain()); 82 86 83 87 LockHolder locker(m_server->lock()); 84 88 m_server->closeAndDeleteDatabasesModifiedSince(modificationTime); 85 postTaskReply(CrossThreadTask([callback = WTFMove(callback) ]() mutable {89 postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable { 86 90 callback(); 87 91 })); … … 93 97 ASSERT(RunLoop::isMain()); 94 98 95 postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback) ] () mutable {99 postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable { 96 100 ASSERT(!RunLoop::isMain()); 97 101 98 102 LockHolder locker(m_server->lock()); 99 103 m_server->closeAndDeleteDatabasesForOrigins(originDatas); 100 postTaskReply(CrossThreadTask([callback = WTFMove(callback) ]() mutable {104 postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable { 101 105 callback(); 102 106 })); … … 108 112 ASSERT(RunLoop::isMain()); 109 113 110 postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback) ] () mutable {114 postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable { 111 115 ASSERT(!RunLoop::isMain()); 112 116 113 117 LockHolder locker(m_server->lock()); 114 118 m_server->renameOrigin(oldOrigin, newOrigin); 115 postTaskReply(CrossThreadTask(WTFMove(callback))); 119 postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable { 120 callback(); 121 })); 116 122 }); 117 123 } … … 373 379 ASSERT(RunLoop::isMain()); 374 380 375 m_connections.remove(&connection); 376 connection.removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName()); 381 auto* takenConnection = m_connections.take(&connection); 382 if (!takenConnection) 383 return; 384 385 takenConnection->removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName()); 377 386 postTask([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()] { 378 387 auto connection = m_connectionMap.take(connectionID); … … 383 392 m_server->unregisterConnection(connection->connectionToClient()); 384 393 }); 394 395 tryClose(); 385 396 } 386 397 … … 400 411 { 401 412 ASSERT(RunLoop::isMain()); 413 if (!m_closeCallback) 414 return; 402 415 403 416 // Remove the references held by IPC::Connection. … … 416 429 CrossThreadTaskHandler::kill(); 417 430 }); 431 432 m_closeCallback(); 433 } 434 435 void WebIDBServer::tryClose() 436 { 437 if (!m_connections.isEmpty() || m_dataTaskCounter.value()) 438 return; 439 440 close(); 418 441 } 419 442 -
branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h
r276555 r276556 34 34 #include <WebCore/StorageQuotaManager.h> 35 35 #include <wtf/CrossThreadTaskHandler.h> 36 #include <wtf/RefCounter.h> 36 37 37 38 namespace WebCore { … … 46 47 class WebIDBServer final : public CrossThreadTaskHandler, public IPC::Connection::ThreadMessageReceiverRefCounted { 47 48 public: 48 static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& );49 static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&, CompletionHandler<void()>&&); 49 50 50 51 void getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&&); … … 91 92 void close(); 92 93 93 bool hasConnection() const { return !m_connections.isEmpty(); }94 94 private: 95 WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& );95 WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&, CompletionHandler<void()>&&); 96 96 ~WebIDBServer(); 97 97 98 98 void postTask(WTF::Function<void()>&&); 99 100 void tryClose(); 99 101 100 102 std::unique_ptr<WebCore::IDBServer::IDBServer> m_server; … … 103 105 HashMap<IPC::Connection::UniqueID, std::unique_ptr<WebIDBConnectionToClient>> m_connectionMap; 104 106 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; 105 113 }; 106 114 -
branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp
r276555 r276556 1171 1171 } 1172 1172 1173 void NetworkConnectionToWebProcess::addIDBConnection() 1174 { 1175 m_networkProcess->webIDBServer(m_sessionID).addConnection(m_connection.get(), m_webProcessIdentifier); 1176 } 1177 1173 1178 } // namespace WebKit 1174 1179 -
branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h
r276555 r276556 177 177 void broadcastConsoleMessage(JSC::MessageSource, JSC::MessageLevel, const String& message); 178 178 179 void addIDBConnection(); 180 179 181 private: 180 182 NetworkConnectionToWebProcess(NetworkProcess&, WebCore::ProcessIdentifier, PAL::SessionID, IPC::Connection::Identifier); -
branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in
r276555 r276556 102 102 UpdateActivePages(String name, Vector<String> activePagesOrigins, audit_token_t auditToken) 103 103 #endif 104 105 AddIDBConnection() 104 106 } -
branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r276555 r276556 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(); 270 274 } 271 275 … … 384 388 385 389 m_storageManagerSet->addConnection(connection.connection()); 386 387 #if ENABLE(INDEXED_DATABASE)388 webIDBServer(sessionID).addConnection(connection.connection(), identifier);389 #endif390 390 } 391 391 … … 548 548 m_storageManagerSet->remove(sessionID); 549 549 550 #if ENABLE(INDEXED_DATABASE)551 removeWebIDBServerIfPossible(sessionID);552 #endif553 550 } 554 551 … … 2327 2324 } 2328 2325 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 }); 2326 auto spaceRequester = [protectedThis = makeRef(*this), sessionID](const auto& origin, uint64_t spaceRequested) { 2327 return protectedThis->storageQuotaManager(sessionID, origin)->requestSpaceOnBackgroundThread(spaceRequested); 2328 }; 2329 auto closeHandler = [protectedThis = makeRef(*this), sessionID]() { 2330 protectedThis->m_webIDBServers.remove(sessionID); 2331 }; 2332 return WebIDBServer::create(sessionID, path, WTFMove(spaceRequester), WTFMove(closeHandler)); 2333 2333 } 2334 2334 … … 2359 2359 sessionStorageQuotaManager->setIDBRootPath(idbRootPath); 2360 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 2380 2361 #endif // ENABLE(INDEXED_DATABASE) 2381 2362 … … 2652 2633 2653 2634 #if ENABLE(INDEXED_DATABASE) 2654 auto* webIDBServer = m_webIDBServers.get(sessionID); 2655 ASSERT(webIDBServer); 2656 webIDBServer->removeConnection(connection); 2657 removeWebIDBServerIfPossible(sessionID); 2635 if (auto* server = m_webIDBServers.get(sessionID)) 2636 server->removeConnection(connection); 2658 2637 #endif 2659 2638 } -
branches/safari-611-branch/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp
r276555 r276556 62 62 : m_connectionToServer(IDBClient::IDBConnectionToServer::create(*this)) 63 63 { 64 send(Messages::NetworkConnectionToWebProcess::AddIDBConnection()); 64 65 } 65 66
Note:
See TracChangeset
for help on using the changeset viewer.