Changeset 276179 in webkit
- Timestamp:
- Apr 16, 2021, 4:32:49 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) (4 diffs)
-
WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-611-branch/Source/WebKit/ChangeLog
r276158 r276179 217 217 * WebProcess/WebCoreSupport/WebChromeClient.cpp: 218 218 (WebKit::WebChromeClient::createWindow): 219 220 2021-04-15 Russell Epstein <repstein@apple.com>221 222 Cherry-pick r275846. rdar://problem/76727548223 224 Create WebIDBServer only when it is needed225 https://bugs.webkit.org/show_bug.cgi?id=224305226 rdar://71962196227 228 Reviewed by Alex Christensen.229 230 Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not231 in use. There are two cases where network process needs a WebIDBServer:232 1. handle requests from UI process to collect or remove data233 2. handle requests from Web process to perform IDB operations234 235 Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web236 process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message237 AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation.238 239 Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded240 with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of241 pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove242 WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the243 reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits.244 245 * NetworkProcess/IndexedDB/WebIDBServer.cpp:246 (WebKit::WebIDBServer::create):247 (WebKit::WebIDBServer::WebIDBServer):248 (WebKit::m_closeCallback):249 (WebKit::WebIDBServer::~WebIDBServer):250 (WebKit::WebIDBServer::getOrigins):251 (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):252 (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):253 (WebKit::WebIDBServer::renameOrigin):254 (WebKit::WebIDBServer::removeConnection):255 (WebKit::WebIDBServer::close):256 (WebKit::WebIDBServer::tryClose):257 * NetworkProcess/IndexedDB/WebIDBServer.h:258 * NetworkProcess/NetworkConnectionToWebProcess.cpp:259 (WebKit::NetworkConnectionToWebProcess::addIDBConnection):260 * NetworkProcess/NetworkConnectionToWebProcess.h:261 * NetworkProcess/NetworkConnectionToWebProcess.messages.in:262 * NetworkProcess/NetworkProcess.cpp:263 (WebKit::NetworkProcess::didClose):264 (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):265 (WebKit::NetworkProcess::destroySession):266 (WebKit::NetworkProcess::createWebIDBServer):267 (WebKit::NetworkProcess::connectionToWebProcessClosed):268 (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer.269 * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:270 (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer):271 272 git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275846 268f45cc-cd09-0410-ab3c-d52691b4dbfc273 274 2021-04-12 Sihui Liu <sihui_liu@apple.com>275 276 Create WebIDBServer only when it is needed277 https://bugs.webkit.org/show_bug.cgi?id=224305278 rdar://71962196279 280 Reviewed by Alex Christensen.281 282 Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not283 in use. There are two cases where network process needs a WebIDBServer:284 1. handle requests from UI process to collect or remove data285 2. handle requests from Web process to perform IDB operations286 287 Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web288 process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message289 AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation.290 291 Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded292 with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of293 pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove294 WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the295 reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits.296 297 * NetworkProcess/IndexedDB/WebIDBServer.cpp:298 (WebKit::WebIDBServer::create):299 (WebKit::WebIDBServer::WebIDBServer):300 (WebKit::m_closeCallback):301 (WebKit::WebIDBServer::~WebIDBServer):302 (WebKit::WebIDBServer::getOrigins):303 (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):304 (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):305 (WebKit::WebIDBServer::renameOrigin):306 (WebKit::WebIDBServer::removeConnection):307 (WebKit::WebIDBServer::close):308 (WebKit::WebIDBServer::tryClose):309 * NetworkProcess/IndexedDB/WebIDBServer.h:310 * NetworkProcess/NetworkConnectionToWebProcess.cpp:311 (WebKit::NetworkConnectionToWebProcess::addIDBConnection):312 * NetworkProcess/NetworkConnectionToWebProcess.h:313 * NetworkProcess/NetworkConnectionToWebProcess.messages.in:314 * NetworkProcess/NetworkProcess.cpp:315 (WebKit::NetworkProcess::didClose):316 (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):317 (WebKit::NetworkProcess::destroySession):318 (WebKit::NetworkProcess::createWebIDBServer):319 (WebKit::NetworkProcess::connectionToWebProcessClosed):320 (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer.321 * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:322 (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer):323 219 324 220 2021-04-15 Russell Epstein <repstein@apple.com> -
branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp
r276116 r276179 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
r276116 r276179 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
r276116 r276179 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
r276116 r276179 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
r276116 r276179 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
r276116 r276179 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 … … 2331 2327 } 2332 2328 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)); 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 }); 2340 2333 } 2341 2334 … … 2366 2359 sessionStorageQuotaManager->setIDBRootPath(idbRootPath); 2367 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 2368 2380 #endif // ENABLE(INDEXED_DATABASE) 2369 2381 … … 2643 2655 ASSERT(webIDBServer); 2644 2656 webIDBServer->removeConnection(connection); 2657 removeWebIDBServerIfPossible(sessionID); 2645 2658 #endif 2646 2659 } -
branches/safari-611-branch/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp
r276116 r276179 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.