Title: [259994] branches/safari-609-branch/Source
Revision
259994
Author
[email protected]
Date
2020-04-12 20:48:36 -0700 (Sun, 12 Apr 2020)

Log Message

Cherry-pick r259316. rdar://problem/61269751

    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:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259316 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Diff

Modified: branches/safari-609-branch/Source/WTF/ChangeLog (259993 => 259994)


--- branches/safari-609-branch/Source/WTF/ChangeLog	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WTF/ChangeLog	2020-04-13 03:48:36 UTC (rev 259994)
@@ -1,3 +1,71 @@
+2020-04-12  Alan Coon  <[email protected]>
+
+        Cherry-pick r259316. rdar://problem/61269751
+
+    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:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259316 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-04-09  Alan Coon  <[email protected]>
 
         Revert r259689. rdar://problem/61269751

Modified: branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.cpp (259993 => 259994)


--- branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.cpp	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.cpp	2020-04-13 03:48:36 UTC (rev 259994)
@@ -37,6 +37,9 @@
     Locker<Lock> locker(m_taskThreadCreationLock);
     Thread::create(threadName, [this] {
         taskRunLoop();
+
+        if (m_completionCallback)
+            m_completionCallback();
     })->detach();
 }
 
@@ -132,4 +135,15 @@
     }
 }
 
+void CrossThreadTaskHandler::setCompletionCallback(Function<void ()>&& completionCallback)
+{
+    m_completionCallback = WTFMove(completionCallback);
+}
+
+void CrossThreadTaskHandler::kill()
+{
+    m_taskQueue.kill();
+    m_taskReplyQueue.kill();
+}
+
 } // namespace WTF

Modified: branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.h (259993 => 259994)


--- branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.h	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.h	2020-04-13 03:48:36 UTC (rev 259994)
@@ -48,6 +48,9 @@
     WTF_EXPORT_PRIVATE void suspendAndWait();
     WTF_EXPORT_PRIVATE void resume();
 
+    WTF_EXPORT_PRIVATE void kill();
+    WTF_EXPORT_PRIVATE void setCompletionCallback(Function<void ()>&&);
+
 private:
     void handleTaskRepliesOnMainThread();
     void taskRunLoop();
@@ -68,6 +71,8 @@
 
     CrossThreadQueue<CrossThreadTask> m_taskQueue;
     CrossThreadQueue<CrossThreadTask> m_taskReplyQueue;
+
+    Function<void ()> m_completionCallback;
 };
 
 } // namespace WTF

Modified: branches/safari-609-branch/Source/WebCore/ChangeLog (259993 => 259994)


--- branches/safari-609-branch/Source/WebCore/ChangeLog	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebCore/ChangeLog	2020-04-13 03:48:36 UTC (rev 259994)
@@ -1,5 +1,76 @@
 2020-04-12  Alan Coon  <[email protected]>
 
+        Cherry-pick r259316. rdar://problem/61269751
+
+    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:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259316 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-04-12  Alan Coon  <[email protected]>
+
         Cherry-pick r257901. rdar://problem/61269751
 
     Remove unused variable m_allUniqueIDBDatabases in IDBServer

Modified: branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (259993 => 259994)


--- branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2020-04-13 03:48:36 UTC (rev 259994)
@@ -60,6 +60,9 @@
 IDBServer::~IDBServer()
 {
     ASSERT(!isMainThread());
+
+    for (auto& database : m_uniqueIDBDatabaseMap.values())
+        database->immediateClose();
 }
 
 void IDBServer::registerConnection(IDBConnectionToClient& connection)
@@ -534,7 +537,7 @@
 
     HashSet<UniqueIDBDatabase*> openDatabases;
     for (auto& database : m_uniqueIDBDatabaseMap.values())
-        database->immediateCloseForUserDelete();
+        database->immediateClose();
 
     m_uniqueIDBDatabaseMap.clear();
 
@@ -561,7 +564,7 @@
     }
 
     for (auto& database : openDatabases) {
-        database->immediateCloseForUserDelete();
+        database->immediateClose();
         m_uniqueIDBDatabaseMap.remove(database->identifier());
     }
 

Modified: branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (259993 => 259994)


--- branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2020-04-13 03:48:36 UTC (rev 259994)
@@ -1144,9 +1144,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: branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (259993 => 259994)


--- branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h	2020-04-13 03:48:36 UTC (rev 259994)
@@ -107,7 +107,7 @@
     void enqueueTransaction(Ref<UniqueIDBDatabaseTransaction>&&);
 
     void handleDelete(IDBConnectionToClient&, const IDBRequestData&);
-    void immediateCloseForUserDelete();
+    void immediateClose();
 
     void abortActiveTransactions();
 

Modified: branches/safari-609-branch/Source/WebKit/ChangeLog (259993 => 259994)


--- branches/safari-609-branch/Source/WebKit/ChangeLog	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebKit/ChangeLog	2020-04-13 03:48:36 UTC (rev 259994)
@@ -1,3 +1,74 @@
+2020-04-12  Alan Coon  <[email protected]>
+
+        Cherry-pick r259316. rdar://problem/61269751
+
+    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:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259316 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-04-10  Alan Coon  <[email protected]>
 
         Cherry-pick r259802. rdar://problem/61477495

Modified: branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp (259993 => 259994)


--- branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp	2020-04-13 03:48:36 UTC (rev 259994)
@@ -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: branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h (259993 => 259994)


--- branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2020-04-13 03:48:36 UTC (rev 259994)
@@ -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: branches/safari-609-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp (259993 => 259994)


--- branches/safari-609-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-04-13 03:48:36 UTC (rev 259994)
@@ -578,6 +578,8 @@
 #endif
 
     m_storageManagerSet->remove(sessionID);
+    if (auto webIDBServer = m_webIDBServers.take(sessionID))
+        webIDBServer->close();
 }
 
 #if ENABLE(RESOURCE_LOAD_STATISTICS)
@@ -2544,7 +2546,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