Changeset 276183 in webkit
- Timestamp:
- Apr 16, 2021, 4:55:21 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
r276179 r276183 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/76727548 223 224 Create WebIDBServer only when it is needed 225 https://bugs.webkit.org/show_bug.cgi?id=224305 226 rdar://71962196 227 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 not 231 in use. There are two cases where network process needs a WebIDBServer: 232 1. handle requests from UI process to collect or remove data 233 2. handle requests from Web process to perform IDB operations 234 235 Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web 236 process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message 237 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 binded 240 with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of 241 pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove 242 WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the 243 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-d52691b4dbfc 273 274 2021-04-12 Sihui Liu <sihui_liu@apple.com> 275 276 Create WebIDBServer only when it is needed 277 https://bugs.webkit.org/show_bug.cgi?id=224305 278 rdar://71962196 279 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 not 283 in use. There are two cases where network process needs a WebIDBServer: 284 1. handle requests from UI process to collect or remove data 285 2. handle requests from Web process to perform IDB operations 286 287 Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web 288 process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message 289 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 binded 292 with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of 293 pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove 294 WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the 295 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): 219 323 220 324 2021-04-15 Russell Epstein <repstein@apple.com> -
branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp
r276179 r276183 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
r276179 r276183 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
r276179 r276183 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
r276179 r276183 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
r276179 r276183 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
r276179 r276183 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 … … 548 552 m_storageManagerSet->remove(sessionID); 549 553 550 #if ENABLE(INDEXED_DATABASE)551 removeWebIDBServerIfPossible(sessionID);552 #endif553 554 } 554 555 … … 2327 2328 } 2328 2329 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 }); 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)); 2333 2337 } 2334 2338 … … 2359 2363 sessionStorageQuotaManager->setIDBRootPath(idbRootPath); 2360 2364 } 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 2365 #endif // ENABLE(INDEXED_DATABASE) 2381 2366 … … 2655 2640 ASSERT(webIDBServer); 2656 2641 webIDBServer->removeConnection(connection); 2657 removeWebIDBServerIfPossible(sessionID);2658 2642 #endif 2659 2643 } -
branches/safari-611-branch/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp
r276179 r276183 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.