Changeset 259316 in webkit
- Timestamp:
- Mar 31, 2020, 3:19:25 PM (6 years ago)
- Location:
- trunk/Source
- Files:
-
- 11 edited
-
WTF/ChangeLog (modified) (1 diff)
-
WTF/wtf/CrossThreadTaskHandler.cpp (modified) (2 diffs)
-
WTF/wtf/CrossThreadTaskHandler.h (modified) (2 diffs)
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/Modules/indexeddb/server/IDBServer.cpp (modified) (3 diffs)
-
WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (modified) (1 diff)
-
WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (modified) (1 diff)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp (modified) (4 diffs)
-
WebKit/NetworkProcess/IndexedDB/WebIDBServer.h (modified) (2 diffs)
-
WebKit/NetworkProcess/NetworkProcess.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r259202 r259316 1 2020-03-31 Sihui Liu <sihui_liu@apple.com> 2 3 IndexedDB: destroy WebIDBServer when session is removed in network process 4 https://bugs.webkit.org/show_bug.cgi?id=209606 5 <rdar://problem/59310081> 6 7 Reviewed by Geoffrey Garen. 8 9 Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before 10 thread finishes. 11 12 * wtf/CrossThreadTaskHandler.cpp: 13 (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler): 14 (WTF::CrossThreadTaskHandler::setCompletionCallback): 15 (WTF::CrossThreadTaskHandler::kill): 16 * wtf/CrossThreadTaskHandler.h: 17 1 18 2020-03-30 David Kilzer <ddkilzer@apple.com> 2 19 -
trunk/Source/WTF/wtf/CrossThreadTaskHandler.cpp
r259016 r259316 38 38 Thread::create(threadName, [this] { 39 39 taskRunLoop(); 40 41 if (m_completionCallback) 42 m_completionCallback(); 40 43 })->detach(); 41 44 } … … 90 93 } 91 94 95 void CrossThreadTaskHandler::setCompletionCallback(Function<void ()>&& completionCallback) 96 { 97 m_completionCallback = WTFMove(completionCallback); 98 } 99 100 void CrossThreadTaskHandler::kill() 101 { 102 m_taskQueue.kill(); 103 m_taskReplyQueue.kill(); 104 } 105 92 106 } // namespace WTF -
trunk/Source/WTF/wtf/CrossThreadTaskHandler.h
r259016 r259316 47 47 WTF_EXPORT_PRIVATE void postTaskReply(CrossThreadTask&&); 48 48 49 WTF_EXPORT_PRIVATE void kill(); 50 WTF_EXPORT_PRIVATE void setCompletionCallback(Function<void ()>&&); 51 49 52 private: 50 53 void handleTaskRepliesOnMainThread(); … … 59 62 CrossThreadQueue<CrossThreadTask> m_taskQueue; 60 63 CrossThreadQueue<CrossThreadTask> m_taskReplyQueue; 64 65 Function<void ()> m_completionCallback; 61 66 }; 62 67 -
trunk/Source/WebCore/ChangeLog
r259315 r259316 1 2020-03-31 Sihui Liu <sihui_liu@apple.com> 2 3 IndexedDB: destroy WebIDBServer when session is removed in network process 4 https://bugs.webkit.org/show_bug.cgi?id=209606 5 <rdar://problem/59310081> 6 7 Reviewed by Geoffrey Garen. 8 9 Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure 10 everything in database finishes correctly. 11 12 * Modules/indexeddb/server/IDBServer.cpp: 13 (WebCore::IDBServer::IDBServer::~IDBServer): 14 (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince): 15 (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins): 16 * Modules/indexeddb/server/UniqueIDBDatabase.cpp: 17 (WebCore::IDBServer::UniqueIDBDatabase::immediateClose): 18 (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted. 19 * Modules/indexeddb/server/UniqueIDBDatabase.h: 20 1 21 2020-03-31 Chris Dumez <cdumez@apple.com> 2 22 -
trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp
r259215 r259316 61 61 { 62 62 ASSERT(!isMainThread()); 63 64 for (auto& database : m_uniqueIDBDatabaseMap.values()) 65 database->immediateClose(); 63 66 } 64 67 … … 545 548 HashSet<UniqueIDBDatabase*> openDatabases; 546 549 for (auto& database : m_uniqueIDBDatabaseMap.values()) 547 database->immediateClose ForUserDelete();550 database->immediateClose(); 548 551 549 552 m_uniqueIDBDatabaseMap.clear(); … … 572 575 573 576 for (auto& database : openDatabases) { 574 database->immediateClose ForUserDelete();577 database->immediateClose(); 575 578 m_uniqueIDBDatabaseMap.remove(database->identifier()); 576 579 } -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp
r259215 r259316 1125 1125 } 1126 1126 1127 void UniqueIDBDatabase::immediateClose ForUserDelete()1128 { 1129 LOG(IndexedDB, "UniqueIDBDatabase::immediateClose ForUserDelete");1127 void UniqueIDBDatabase::immediateClose() 1128 { 1129 LOG(IndexedDB, "UniqueIDBDatabase::immediateClose"); 1130 1130 1131 1131 // Error out all transactions. -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h
r259215 r259316 108 108 109 109 void handleDelete(IDBConnectionToClient&, const IDBRequestData&); 110 void immediateClose ForUserDelete();110 void immediateClose(); 111 111 112 112 void abortActiveTransactions(); -
trunk/Source/WebKit/ChangeLog
r259315 r259316 1 2020-03-31 Sihui Liu <sihui_liu@apple.com> 2 3 IndexedDB: destroy WebIDBServer when session is removed in network process 4 https://bugs.webkit.org/show_bug.cgi?id=209606 5 <rdar://problem/59310081> 6 7 Reviewed by Geoffrey Garen. 8 9 Tested manually to verify WebIDBServer is removed and its thread ends when session is removed. 10 11 * NetworkProcess/IndexedDB/WebIDBServer.cpp: 12 (WebKit::WebIDBServer::~WebIDBServer): 13 (WebKit::WebIDBServer::addConnection): 14 (WebKit::WebIDBServer::removeConnection): 15 (WebKit::WebIDBServer::close): 16 * NetworkProcess/IndexedDB/WebIDBServer.h: 17 * NetworkProcess/NetworkProcess.cpp: 18 (WebKit::NetworkProcess::destroySession): 19 (WebKit::NetworkProcess::connectionToWebProcessClosed): 20 1 21 2020-03-31 Chris Dumez <cdumez@apple.com> 2 22 -
trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp
r257103 r259316 54 54 semaphore.wait(); 55 55 } 56 56 57 WebIDBServer::~WebIDBServer() 58 { 59 ASSERT(RunLoop::isMain()); 60 } 61 57 62 void WebIDBServer::closeAndDeleteDatabasesModifiedSince(WallTime modificationTime, CompletionHandler<void()>&& callback) 58 63 { … … 336 341 m_server->registerConnection(iter->value->connectionToClient()); 337 342 }); 343 m_connections.add(&connection); 338 344 connection.addThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName(), this); 339 345 } … … 343 349 ASSERT(RunLoop::isMain()); 344 350 351 m_connections.remove(&connection); 345 352 connection.removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName()); 346 353 postTask([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()] { … … 366 373 } 367 374 375 void WebIDBServer::close() 376 { 377 ASSERT(RunLoop::isMain()); 378 379 // Remove the references held by IPC::Connection. 380 for (auto* connection : m_connections) 381 connection->removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName()); 382 383 CrossThreadTaskHandler::setCompletionCallback([protectedThis = makeRef(*this)]() mutable { 384 ASSERT(!RunLoop::isMain()); 385 callOnMainRunLoop([protectedThis = WTFMove(protectedThis)]() mutable { }); 386 }); 387 388 postTask([this]() mutable { 389 m_connectionMap.clear(); 390 m_server = nullptr; 391 392 CrossThreadTaskHandler::kill(); 393 }); 394 } 395 368 396 } // namespace WebKit 369 397 #endif -
trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h
r253740 r259316 88 88 void didReceiveMessage(IPC::Connection&, IPC::Decoder&); 89 89 void dispatchToThread(WTF::Function<void()>&&); 90 void close(); 90 91 91 92 private: 92 93 WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&); 94 ~WebIDBServer(); 93 95 94 96 void postTask(WTF::Function<void()>&&); … … 98 100 99 101 HashMap<IPC::Connection::UniqueID, std::unique_ptr<WebIDBConnectionToClient>> m_connectionMap; 102 HashSet<IPC::Connection*> m_connections; 100 103 }; 101 104 -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r259275 r259316 592 592 593 593 m_storageManagerSet->remove(sessionID); 594 if (auto webIDBServer = m_webIDBServers.take(sessionID)) 595 webIDBServer->close(); 594 596 } 595 597 … … 2635 2637 { 2636 2638 m_storageManagerSet->removeConnection(connection); 2637 webIDBServer(sessionID).removeConnection(connection); 2639 if (auto* webIDBServer = m_webIDBServers.get(sessionID)) 2640 webIDBServer->removeConnection(connection); 2638 2641 } 2639 2642
Note:
See TracChangeset
for help on using the changeset viewer.