Title: [259316] trunk/Source
Revision
259316
Author
[email protected]
Date
2020-03-31 15:19:25 -0700 (Tue, 31 Mar 2020)

Log Message

IndexedDB: destroy WebIDBServer when session is removed in network process
https://bugs.webkit.org/show_bug.cgi?id=209606
<rdar://problem/59310081>

Reviewed by Geoffrey Garen.

Source/WebCore:

Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure
everything in database finishes correctly.

* Modules/indexeddb/server/IDBServer.cpp:
(WebCore::IDBServer::IDBServer::~IDBServer):
(WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
(WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
* Modules/indexeddb/server/UniqueIDBDatabase.cpp:
(WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
(WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
* Modules/indexeddb/server/UniqueIDBDatabase.h:

Source/WebKit:

Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.

* NetworkProcess/IndexedDB/WebIDBServer.cpp:
(WebKit::WebIDBServer::~WebIDBServer):
(WebKit::WebIDBServer::addConnection):
(WebKit::WebIDBServer::removeConnection):
(WebKit::WebIDBServer::close):
* NetworkProcess/IndexedDB/WebIDBServer.h:
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::destroySession):
(WebKit::NetworkProcess::connectionToWebProcessClosed):

Source/WTF:

Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before
thread finishes.

* wtf/CrossThreadTaskHandler.cpp:
(WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
(WTF::CrossThreadTaskHandler::setCompletionCallback):
(WTF::CrossThreadTaskHandler::kill):
* wtf/CrossThreadTaskHandler.h:

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (259315 => 259316)


--- trunk/Source/WTF/ChangeLog	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WTF/ChangeLog	2020-03-31 22:19:25 UTC (rev 259316)
@@ -1,3 +1,20 @@
+2020-03-31  Sihui Liu  <[email protected]>
+
+        IndexedDB: destroy WebIDBServer when session is removed in network process
+        https://bugs.webkit.org/show_bug.cgi?id=209606
+        <rdar://problem/59310081>
+
+        Reviewed by Geoffrey Garen.
+
+        Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before 
+        thread finishes.
+
+        * wtf/CrossThreadTaskHandler.cpp:
+        (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
+        (WTF::CrossThreadTaskHandler::setCompletionCallback):
+        (WTF::CrossThreadTaskHandler::kill):
+        * wtf/CrossThreadTaskHandler.h:
+
 2020-03-30  David Kilzer  <[email protected]>
 
         Fix "Dead nested assignment" static analyzer warning in monthFromDayInYear()

Modified: trunk/Source/WTF/wtf/CrossThreadTaskHandler.cpp (259315 => 259316)


--- trunk/Source/WTF/wtf/CrossThreadTaskHandler.cpp	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WTF/wtf/CrossThreadTaskHandler.cpp	2020-03-31 22:19:25 UTC (rev 259316)
@@ -37,6 +37,9 @@
     Locker<Lock> locker(m_taskThreadCreationLock);
     Thread::create(threadName, [this] {
         taskRunLoop();
+
+        if (m_completionCallback)
+            m_completionCallback();
     })->detach();
 }
 
@@ -89,4 +92,15 @@
         task->performTask();
 }
 
+void CrossThreadTaskHandler::setCompletionCallback(Function<void ()>&& completionCallback)
+{
+    m_completionCallback = WTFMove(completionCallback);
+}
+
+void CrossThreadTaskHandler::kill()
+{
+    m_taskQueue.kill();
+    m_taskReplyQueue.kill();
+}
+
 } // namespace WTF

Modified: trunk/Source/WTF/wtf/CrossThreadTaskHandler.h (259315 => 259316)


--- trunk/Source/WTF/wtf/CrossThreadTaskHandler.h	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WTF/wtf/CrossThreadTaskHandler.h	2020-03-31 22:19:25 UTC (rev 259316)
@@ -46,6 +46,9 @@
     WTF_EXPORT_PRIVATE void postTask(CrossThreadTask&&);
     WTF_EXPORT_PRIVATE void postTaskReply(CrossThreadTask&&);
 
+    WTF_EXPORT_PRIVATE void kill();
+    WTF_EXPORT_PRIVATE void setCompletionCallback(Function<void ()>&&);
+
 private:
     void handleTaskRepliesOnMainThread();
     void taskRunLoop();
@@ -58,6 +61,8 @@
 
     CrossThreadQueue<CrossThreadTask> m_taskQueue;
     CrossThreadQueue<CrossThreadTask> m_taskReplyQueue;
+
+    Function<void ()> m_completionCallback;
 };
 
 } // namespace WTF

Modified: trunk/Source/WebCore/ChangeLog (259315 => 259316)


--- trunk/Source/WebCore/ChangeLog	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WebCore/ChangeLog	2020-03-31 22:19:25 UTC (rev 259316)
@@ -1,3 +1,23 @@
+2020-03-31  Sihui Liu  <[email protected]>
+
+        IndexedDB: destroy WebIDBServer when session is removed in network process
+        https://bugs.webkit.org/show_bug.cgi?id=209606
+        <rdar://problem/59310081>
+
+        Reviewed by Geoffrey Garen.
+
+        Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure 
+        everything in database finishes correctly.
+
+        * Modules/indexeddb/server/IDBServer.cpp:
+        (WebCore::IDBServer::IDBServer::~IDBServer):
+        (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
+        (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
+        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+        (WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
+        (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
+        * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
 2020-03-31  Chris Dumez  <[email protected]>
 
         Regression(r253357) DeviceMotionEvent acceleration and rotationRate are null

Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (259315 => 259316)


--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2020-03-31 22:19:25 UTC (rev 259316)
@@ -60,6 +60,9 @@
 IDBServer::~IDBServer()
 {
     ASSERT(!isMainThread());
+
+    for (auto& database : m_uniqueIDBDatabaseMap.values())
+        database->immediateClose();
 }
 
 void IDBServer::registerConnection(IDBConnectionToClient& connection)
@@ -544,7 +547,7 @@
 
     HashSet<UniqueIDBDatabase*> openDatabases;
     for (auto& database : m_uniqueIDBDatabaseMap.values())
-        database->immediateCloseForUserDelete();
+        database->immediateClose();
 
     m_uniqueIDBDatabaseMap.clear();
 
@@ -571,7 +574,7 @@
     }
 
     for (auto& database : openDatabases) {
-        database->immediateCloseForUserDelete();
+        database->immediateClose();
         m_uniqueIDBDatabaseMap.remove(database->identifier());
     }
 

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (259315 => 259316)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2020-03-31 22:19:25 UTC (rev 259316)
@@ -1124,9 +1124,9 @@
         request.connection().didDeleteDatabase(result);
 }
 
-void UniqueIDBDatabase::immediateCloseForUserDelete()
+void UniqueIDBDatabase::immediateClose()
 {
-    LOG(IndexedDB, "UniqueIDBDatabase::immediateCloseForUserDelete");
+    LOG(IndexedDB, "UniqueIDBDatabase::immediateClose");
 
     // Error out all transactions.
     // Pending transactions must be cleared before in-progress transactions,

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (259315 => 259316)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h	2020-03-31 22:19:25 UTC (rev 259316)
@@ -107,7 +107,7 @@
     void enqueueTransaction(Ref<UniqueIDBDatabaseTransaction>&&);
 
     void handleDelete(IDBConnectionToClient&, const IDBRequestData&);
-    void immediateCloseForUserDelete();
+    void immediateClose();
 
     void abortActiveTransactions();
     bool tryClose();

Modified: trunk/Source/WebKit/ChangeLog (259315 => 259316)


--- trunk/Source/WebKit/ChangeLog	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WebKit/ChangeLog	2020-03-31 22:19:25 UTC (rev 259316)
@@ -1,3 +1,23 @@
+2020-03-31  Sihui Liu  <[email protected]>
+
+        IndexedDB: destroy WebIDBServer when session is removed in network process
+        https://bugs.webkit.org/show_bug.cgi?id=209606
+        <rdar://problem/59310081>
+
+        Reviewed by Geoffrey Garen.
+
+        Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.
+
+        * NetworkProcess/IndexedDB/WebIDBServer.cpp:
+        (WebKit::WebIDBServer::~WebIDBServer):
+        (WebKit::WebIDBServer::addConnection):
+        (WebKit::WebIDBServer::removeConnection):
+        (WebKit::WebIDBServer::close):
+        * NetworkProcess/IndexedDB/WebIDBServer.h:
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::destroySession):
+        (WebKit::NetworkProcess::connectionToWebProcessClosed):
+
 2020-03-31  Chris Dumez  <[email protected]>
 
         Regression(r253357) DeviceMotionEvent acceleration and rotationRate are null

Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp (259315 => 259316)


--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp	2020-03-31 22:19:25 UTC (rev 259316)
@@ -53,7 +53,12 @@
     });
     semaphore.wait();
 }
-    
+
+WebIDBServer::~WebIDBServer()
+{
+    ASSERT(RunLoop::isMain());
+}
+
 void WebIDBServer::closeAndDeleteDatabasesModifiedSince(WallTime modificationTime, CompletionHandler<void()>&& callback)
 {
     ASSERT(RunLoop::isMain());
@@ -335,6 +340,7 @@
         LockHolder locker(m_server->lock());
         m_server->registerConnection(iter->value->connectionToClient());
     });
+    m_connections.add(&connection);
     connection.addThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName(), this);
 }
 
@@ -342,6 +348,7 @@
 {
     ASSERT(RunLoop::isMain());
 
+    m_connections.remove(&connection);
     connection.removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
     postTask([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()] {
         auto connection = m_connectionMap.take(connectionID);
@@ -365,5 +372,26 @@
     CrossThreadTaskHandler::postTask(CrossThreadTask(WTFMove(task)));
 }
 
+void WebIDBServer::close()
+{
+    ASSERT(RunLoop::isMain());
+
+    // Remove the references held by IPC::Connection.
+    for (auto* connection : m_connections)
+        connection->removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
+
+    CrossThreadTaskHandler::setCompletionCallback([protectedThis = makeRef(*this)]() mutable {
+        ASSERT(!RunLoop::isMain());
+        callOnMainRunLoop([protectedThis = WTFMove(protectedThis)]() mutable { });
+    });
+
+    postTask([this]() mutable {
+        m_connectionMap.clear();
+        m_server = nullptr;
+
+        CrossThreadTaskHandler::kill();
+    });
+}
+
 } // namespace WebKit
 #endif

Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h (259315 => 259316)


--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2020-03-31 22:19:25 UTC (rev 259316)
@@ -87,9 +87,11 @@
 
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
     void dispatchToThread(WTF::Function<void()>&&);
+    void close();
 
 private:
     WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
+    ~WebIDBServer();
 
     void postTask(WTF::Function<void()>&&);
 
@@ -97,6 +99,7 @@
     bool m_isSuspended { false };
 
     HashMap<IPC::Connection::UniqueID, std::unique_ptr<WebIDBConnectionToClient>> m_connectionMap;
+    HashSet<IPC::Connection*> m_connections;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (259315 => 259316)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-03-31 22:09:46 UTC (rev 259315)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-03-31 22:19:25 UTC (rev 259316)
@@ -591,6 +591,8 @@
 #endif
 
     m_storageManagerSet->remove(sessionID);
+    if (auto webIDBServer = m_webIDBServers.take(sessionID))
+        webIDBServer->close();
 }
 
 #if ENABLE(RESOURCE_LOAD_STATISTICS)
@@ -2634,7 +2636,8 @@
 void NetworkProcess::connectionToWebProcessClosed(IPC::Connection& connection, PAL::SessionID sessionID)
 {
     m_storageManagerSet->removeConnection(connection);
-    webIDBServer(sessionID).removeConnection(connection);
+    if (auto* webIDBServer = m_webIDBServers.get(sessionID))
+        webIDBServer->removeConnection(connection);
 }
 
 NetworkConnectionToWebProcess* NetworkProcess::webProcessConnection(ProcessIdentifier identifier) const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to