Title: [276555] branches/safari-611-branch/Source/WebKit

Diff

Modified: branches/safari-611-branch/Source/WebKit/ChangeLog (276554 => 276555)


--- branches/safari-611-branch/Source/WebKit/ChangeLog	2021-04-24 19:36:27 UTC (rev 276554)
+++ branches/safari-611-branch/Source/WebKit/ChangeLog	2021-04-24 21:14:23 UTC (rev 276555)
@@ -497,110 +497,6 @@
 
 2021-04-15  Russell Epstein  <[email protected]>
 
-        Cherry-pick r275846. rdar://problem/76727548
-
-    Create WebIDBServer only when it is needed
-    https://bugs.webkit.org/show_bug.cgi?id=224305
-    rdar://71962196
-    
-    Reviewed by Alex Christensen.
-    
-    Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not
-    in use. There are two cases where network process needs a WebIDBServer:
-    1. handle requests from UI process to collect or remove data
-    2. handle requests from Web process to perform IDB operations
-    
-    Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web
-    process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message
-    AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation.
-    
-    Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded
-    with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of
-    pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove
-    WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the
-    reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits.
-    
-    * NetworkProcess/IndexedDB/WebIDBServer.cpp:
-    (WebKit::WebIDBServer::create):
-    (WebKit::WebIDBServer::WebIDBServer):
-    (WebKit::m_closeCallback):
-    (WebKit::WebIDBServer::~WebIDBServer):
-    (WebKit::WebIDBServer::getOrigins):
-    (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):
-    (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):
-    (WebKit::WebIDBServer::renameOrigin):
-    (WebKit::WebIDBServer::removeConnection):
-    (WebKit::WebIDBServer::close):
-    (WebKit::WebIDBServer::tryClose):
-    * NetworkProcess/IndexedDB/WebIDBServer.h:
-    * NetworkProcess/NetworkConnectionToWebProcess.cpp:
-    (WebKit::NetworkConnectionToWebProcess::addIDBConnection):
-    * NetworkProcess/NetworkConnectionToWebProcess.h:
-    * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
-    * NetworkProcess/NetworkProcess.cpp:
-    (WebKit::NetworkProcess::didClose):
-    (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
-    (WebKit::NetworkProcess::destroySession):
-    (WebKit::NetworkProcess::createWebIDBServer):
-    (WebKit::NetworkProcess::connectionToWebProcessClosed):
-    (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer.
-    * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
-    (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer):
-    
-    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275846 268f45cc-cd09-0410-ab3c-d52691b4dbfc
-
-    2021-04-12  Sihui Liu  <[email protected]>
-
-            Create WebIDBServer only when it is needed
-            https://bugs.webkit.org/show_bug.cgi?id=224305
-            rdar://71962196
-
-            Reviewed by Alex Christensen.
-
-            Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not
-            in use. There are two cases where network process needs a WebIDBServer:
-            1. handle requests from UI process to collect or remove data
-            2. handle requests from Web process to perform IDB operations
-
-            Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web
-            process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message
-            AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation.
-
-            Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded
-            with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of
-            pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove
-            WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the
-            reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits.
-
-            * NetworkProcess/IndexedDB/WebIDBServer.cpp:
-            (WebKit::WebIDBServer::create):
-            (WebKit::WebIDBServer::WebIDBServer):
-            (WebKit::m_closeCallback):
-            (WebKit::WebIDBServer::~WebIDBServer):
-            (WebKit::WebIDBServer::getOrigins):
-            (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):
-            (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):
-            (WebKit::WebIDBServer::renameOrigin):
-            (WebKit::WebIDBServer::removeConnection):
-            (WebKit::WebIDBServer::close):
-            (WebKit::WebIDBServer::tryClose):
-            * NetworkProcess/IndexedDB/WebIDBServer.h:
-            * NetworkProcess/NetworkConnectionToWebProcess.cpp:
-            (WebKit::NetworkConnectionToWebProcess::addIDBConnection):
-            * NetworkProcess/NetworkConnectionToWebProcess.h:
-            * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
-            * NetworkProcess/NetworkProcess.cpp:
-            (WebKit::NetworkProcess::didClose):
-            (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
-            (WebKit::NetworkProcess::destroySession):
-            (WebKit::NetworkProcess::createWebIDBServer):
-            (WebKit::NetworkProcess::connectionToWebProcessClosed):
-            (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer.
-            * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
-            (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer):
-
-2021-04-15  Russell Epstein  <[email protected]>
-
         Cherry-pick r275680. rdar://problem/76727557
 
     Cache NSInvocation objects on _WKRemoteObjectInterface

Modified: branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp (276554 => 276555)


--- branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp	2021-04-24 19:36:27 UTC (rev 276554)
+++ branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp	2021-04-24 21:14:23 UTC (rev 276555)
@@ -36,15 +36,13 @@
 
 namespace WebKit {
 
-Ref<WebIDBServer> WebIDBServer::create(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester, CompletionHandler<void()>&& closeCallback)
+Ref<WebIDBServer> WebIDBServer::create(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester)
 {
-    return adoptRef(*new WebIDBServer(sessionID, directory, WTFMove(spaceRequester), WTFMove(closeCallback)));
+    return adoptRef(*new WebIDBServer(sessionID, directory, WTFMove(spaceRequester)));
 }
 
-WebIDBServer::WebIDBServer(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester, CompletionHandler<void()>&& closeCallback)
+WebIDBServer::WebIDBServer(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester)
     : CrossThreadTaskHandler("com.apple.WebKit.IndexedDBServer", WTF::CrossThreadTaskHandler::AutodrainedPoolForRunLoop::Use)
-    , m_dataTaskCounter([this](RefCounterEvent) { tryClose(); })
-    , m_closeCallback(WTFMove(closeCallback))
 {
     ASSERT(RunLoop::isMain());
 
@@ -59,8 +57,6 @@
 WebIDBServer::~WebIDBServer()
 {
     ASSERT(RunLoop::isMain());
-    // close() has to be called to make sure thread exits.
-    ASSERT(!m_closeCallback);
 }
 
 void WebIDBServer::getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&& callback)
@@ -67,11 +63,11 @@
 {
     ASSERT(RunLoop::isMain());
 
-    postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable {
+    postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback)]() mutable {
         ASSERT(!RunLoop::isMain());
 
         LockHolder locker(m_server->lock());
-        postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token), origins = crossThreadCopy(m_server->getOrigins())]() mutable {
+        postTaskReply(CrossThreadTask([callback = WTFMove(callback), origins = crossThreadCopy(m_server->getOrigins())]() mutable {
             callback(WTFMove(origins));
         }));
     });
@@ -81,12 +77,12 @@
 {
     ASSERT(RunLoop::isMain());
 
-    postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable {
+    postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback)]() mutable {
         ASSERT(!RunLoop::isMain());
 
         LockHolder locker(m_server->lock());
         m_server->closeAndDeleteDatabasesModifiedSince(modificationTime);
-        postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
+        postTaskReply(CrossThreadTask([callback = WTFMove(callback)]() mutable {
             callback();
         }));
     });
@@ -96,12 +92,12 @@
 {
     ASSERT(RunLoop::isMain());
 
-    postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable {
+    postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback)] () mutable {
         ASSERT(!RunLoop::isMain());
 
         LockHolder locker(m_server->lock());
         m_server->closeAndDeleteDatabasesForOrigins(originDatas);
-        postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
+        postTaskReply(CrossThreadTask([callback = WTFMove(callback)]() mutable {
             callback();
         }));
     });
@@ -111,14 +107,12 @@
 {
     ASSERT(RunLoop::isMain());
 
-    postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable {
+    postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback)] () mutable {
         ASSERT(!RunLoop::isMain());
 
         LockHolder locker(m_server->lock());
         m_server->renameOrigin(oldOrigin, newOrigin);
-        postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
-            callback();
-        }));
+        postTaskReply(CrossThreadTask(WTFMove(callback)));
     });
 }
 
@@ -378,11 +372,8 @@
 {
     ASSERT(RunLoop::isMain());
 
-    auto* takenConnection = m_connections.take(&connection);
-    if (!takenConnection)
-        return;
-
-    takenConnection->removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
+    m_connections.remove(&connection);
+    connection.removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
     postTask([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()] {
         auto connection = m_connectionMap.take(connectionID);
 
@@ -391,8 +382,6 @@
         LockHolder locker(m_server->lock());
         m_server->unregisterConnection(connection->connectionToClient());
     });
-
-    tryClose();
 }
 
 void WebIDBServer::postTask(Function<void()>&& task)
@@ -410,8 +399,6 @@
 void WebIDBServer::close()
 {
     ASSERT(RunLoop::isMain());
-    if (!m_closeCallback)
-        return;
 
     // Remove the references held by IPC::Connection.
     for (auto* connection : m_connections)
@@ -428,17 +415,7 @@
 
         CrossThreadTaskHandler::kill();
     });
-
-    m_closeCallback();
 }
 
-void WebIDBServer::tryClose()
-{
-    if (!m_connections.isEmpty() || m_dataTaskCounter.value())
-        return;
-
-    close();
-}
-
 } // namespace WebKit
 #endif

Modified: branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h (276554 => 276555)


--- branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2021-04-24 19:36:27 UTC (rev 276554)
+++ branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2021-04-24 21:14:23 UTC (rev 276555)
@@ -33,7 +33,6 @@
 #include <WebCore/IDBServer.h>
 #include <WebCore/StorageQuotaManager.h>
 #include <wtf/CrossThreadTaskHandler.h>
-#include <wtf/RefCounter.h>
 
 namespace WebCore {
 class StorageQuotaManager;
@@ -46,7 +45,7 @@
 
 class WebIDBServer final : public CrossThreadTaskHandler, public IPC::Connection::ThreadMessageReceiverRefCounted {
 public:
-    static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&, CompletionHandler<void()>&&);
+    static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
 
     void getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&&);
     void closeAndDeleteDatabasesModifiedSince(WallTime, CompletionHandler<void()>&& callback);
@@ -91,25 +90,18 @@
     void dispatchToThread(WTF::Function<void()>&&);
     void close();
 
+    bool hasConnection() const { return !m_connections.isEmpty(); }
 private:
-    WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&, CompletionHandler<void()>&&);
+    WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
     ~WebIDBServer();
 
     void postTask(WTF::Function<void()>&&);
 
-    void tryClose();
-
     std::unique_ptr<WebCore::IDBServer::IDBServer> m_server;
     bool m_isSuspended { false };
 
     HashMap<IPC::Connection::UniqueID, std::unique_ptr<WebIDBConnectionToClient>> m_connectionMap;
     HashSet<IPC::Connection*> m_connections;
-
-    enum DataTaskCounterType { };
-    using DataTaskCounter = RefCounter<DataTaskCounterType>;
-    using DataTaskCounterToken = DataTaskCounter::Token;
-    DataTaskCounter m_dataTaskCounter;
-    CompletionHandler<void()> m_closeCallback;
 };
 
 } // namespace WebKit

Modified: branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (276554 => 276555)


--- branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2021-04-24 19:36:27 UTC (rev 276554)
+++ branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2021-04-24 21:14:23 UTC (rev 276555)
@@ -1170,11 +1170,6 @@
     networkProcess().setCORSDisablingPatterns(pageIdentifier, WTFMove(patterns));
 }
 
-void NetworkConnectionToWebProcess::addIDBConnection()
-{
-    m_networkProcess->webIDBServer(m_sessionID).addConnection(m_connection.get(), m_webProcessIdentifier);
-}
-
 } // namespace WebKit
 
 #undef NETWORK_PROCESS_MESSAGE_CHECK_COMPLETION

Modified: branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (276554 => 276555)


--- branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h	2021-04-24 19:36:27 UTC (rev 276554)
+++ branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h	2021-04-24 21:14:23 UTC (rev 276555)
@@ -176,8 +176,6 @@
 
     void broadcastConsoleMessage(JSC::MessageSource, JSC::MessageLevel, const String& message);
 
-    void addIDBConnection();
-
 private:
     NetworkConnectionToWebProcess(NetworkProcess&, WebCore::ProcessIdentifier, PAL::SessionID, IPC::Connection::Identifier);
 

Modified: branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (276554 => 276555)


--- branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in	2021-04-24 19:36:27 UTC (rev 276554)
+++ branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in	2021-04-24 21:14:23 UTC (rev 276555)
@@ -101,6 +101,4 @@
 #if PLATFORM(MAC)
     UpdateActivePages(String name, Vector<String> activePagesOrigins, audit_token_t auditToken)
 #endif
-
-    AddIDBConnection()
 }

Modified: branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp (276554 => 276555)


--- branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2021-04-24 19:36:27 UTC (rev 276554)
+++ branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2021-04-24 21:14:23 UTC (rev 276555)
@@ -267,10 +267,6 @@
     forEachNetworkSession([&] (auto& networkSession) {
         platformFlushCookies(networkSession.sessionID(), [callbackAggregator] { });
     });
-
-    // Make sure references to NetworkProcess in spaceRequester and closeHandler is removed.
-    for (auto& server : m_webIDBServers.values())
-        server->close();
 }
 
 void NetworkProcess::didCreateDownload()
@@ -551,6 +547,9 @@
 
     m_storageManagerSet->remove(sessionID);
 
+#if ENABLE(INDEXED_DATABASE)
+    removeWebIDBServerIfPossible(sessionID);
+#endif
 }
 
 #if ENABLE(RESOURCE_LOAD_STATISTICS)
@@ -2327,13 +2326,10 @@
         path = m_idbDatabasePaths.get(sessionID);
     }
 
-    auto spaceRequester = [protectedThis = makeRef(*this), sessionID](const auto& origin, uint64_t spaceRequested) {
-        return protectedThis->storageQuotaManager(sessionID, origin)->requestSpaceOnBackgroundThread(spaceRequested);
-    };
-    auto closeHandler = [protectedThis = makeRef(*this), sessionID]() {
-        protectedThis->m_webIDBServers.remove(sessionID);
-    };
-    return WebIDBServer::create(sessionID, path, WTFMove(spaceRequester), WTFMove(closeHandler));
+    return WebIDBServer::create(sessionID, path, [this, weakThis = makeWeakPtr(this), sessionID](const auto& origin, uint64_t spaceRequested) {
+        RefPtr<StorageQuotaManager> storageQuotaManager = weakThis ? this->storageQuotaManager(sessionID, origin) : nullptr;
+        return storageQuotaManager ? storageQuotaManager->requestSpaceOnBackgroundThread(spaceRequested) : StorageQuotaManager::Decision::Deny;
+    });
 }
 
 WebIDBServer& NetworkProcess::webIDBServer(PAL::SessionID sessionID)
@@ -2362,6 +2358,25 @@
     ASSERT(sessionStorageQuotaManager);
     sessionStorageQuotaManager->setIDBRootPath(idbRootPath);
 }
+
+void NetworkProcess::removeWebIDBServerIfPossible(PAL::SessionID sessionID)
+{
+    ASSERT(RunLoop::isMain());
+
+    auto iterator = m_webIDBServers.find(sessionID);
+    if (iterator == m_webIDBServers.end())
+        return;
+
+    if (m_networkSessions.contains(sessionID))
+        return;
+
+    if (iterator->value->hasConnection())
+        return;
+
+    iterator->value->close();
+    m_webIDBServers.remove(iterator);
+}
+
 #endif // ENABLE(INDEXED_DATABASE)
 
 void NetworkProcess::syncLocalStorage(CompletionHandler<void()>&& completionHandler)
@@ -2639,6 +2654,7 @@
     auto* webIDBServer = m_webIDBServers.get(sessionID);
     ASSERT(webIDBServer);
     webIDBServer->removeConnection(connection);
+    removeWebIDBServerIfPossible(sessionID);
 #endif
 }
 

Modified: branches/safari-611-branch/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp (276554 => 276555)


--- branches/safari-611-branch/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp	2021-04-24 19:36:27 UTC (rev 276554)
+++ branches/safari-611-branch/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp	2021-04-24 21:14:23 UTC (rev 276555)
@@ -61,7 +61,6 @@
 WebIDBConnectionToServer::WebIDBConnectionToServer()
     : m_connectionToServer(IDBClient::IDBConnectionToServer::create(*this))
 {
-    send(Messages::NetworkConnectionToWebProcess::AddIDBConnection());
 }
 
 WebIDBConnectionToServer::~WebIDBConnectionToServer()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to