⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 276555 in webkit


Ignore:
Timestamp:
Apr 24, 2021, 2:14:23 PM (5 years ago)
Author:
Russell Epstein
Message:

Revert "Re-land Cherry-pick r275846. rdar://problem/76727548"

This reverts commit r276398.

Location:
branches/safari-611-branch/Source/WebKit
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-611-branch/Source/WebKit/ChangeLog

    r276517 r276555  
    495495            * WebProcess/WebCoreSupport/WebChromeClient.cpp:
    496496            (WebKit::WebChromeClient::createWindow):
    497 
    498 2021-04-15  Russell Epstein  <repstein@apple.com>
    499 
    500         Cherry-pick r275846. rdar://problem/76727548
    501 
    502     Create WebIDBServer only when it is needed
    503     https://bugs.webkit.org/show_bug.cgi?id=224305
    504     rdar://71962196
    505    
    506     Reviewed by Alex Christensen.
    507    
    508     Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not
    509     in use. There are two cases where network process needs a WebIDBServer:
    510     1. handle requests from UI process to collect or remove data
    511     2. handle requests from Web process to perform IDB operations
    512    
    513     Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web
    514     process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message
    515     AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation.
    516    
    517     Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded
    518     with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of
    519     pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove
    520     WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the
    521     reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits.
    522    
    523     * NetworkProcess/IndexedDB/WebIDBServer.cpp:
    524     (WebKit::WebIDBServer::create):
    525     (WebKit::WebIDBServer::WebIDBServer):
    526     (WebKit::m_closeCallback):
    527     (WebKit::WebIDBServer::~WebIDBServer):
    528     (WebKit::WebIDBServer::getOrigins):
    529     (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):
    530     (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):
    531     (WebKit::WebIDBServer::renameOrigin):
    532     (WebKit::WebIDBServer::removeConnection):
    533     (WebKit::WebIDBServer::close):
    534     (WebKit::WebIDBServer::tryClose):
    535     * NetworkProcess/IndexedDB/WebIDBServer.h:
    536     * NetworkProcess/NetworkConnectionToWebProcess.cpp:
    537     (WebKit::NetworkConnectionToWebProcess::addIDBConnection):
    538     * NetworkProcess/NetworkConnectionToWebProcess.h:
    539     * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
    540     * NetworkProcess/NetworkProcess.cpp:
    541     (WebKit::NetworkProcess::didClose):
    542     (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
    543     (WebKit::NetworkProcess::destroySession):
    544     (WebKit::NetworkProcess::createWebIDBServer):
    545     (WebKit::NetworkProcess::connectionToWebProcessClosed):
    546     (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer.
    547     * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
    548     (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer):
    549    
    550     git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275846 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    551 
    552     2021-04-12  Sihui Liu  <sihui_liu@apple.com>
    553 
    554             Create WebIDBServer only when it is needed
    555             https://bugs.webkit.org/show_bug.cgi?id=224305
    556             rdar://71962196
    557 
    558             Reviewed by Alex Christensen.
    559 
    560             Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not
    561             in use. There are two cases where network process needs a WebIDBServer:
    562             1. handle requests from UI process to collect or remove data
    563             2. handle requests from Web process to perform IDB operations
    564 
    565             Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web
    566             process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message
    567             AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation.
    568 
    569             Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded
    570             with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of
    571             pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove
    572             WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the
    573             reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits.
    574 
    575             * NetworkProcess/IndexedDB/WebIDBServer.cpp:
    576             (WebKit::WebIDBServer::create):
    577             (WebKit::WebIDBServer::WebIDBServer):
    578             (WebKit::m_closeCallback):
    579             (WebKit::WebIDBServer::~WebIDBServer):
    580             (WebKit::WebIDBServer::getOrigins):
    581             (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):
    582             (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):
    583             (WebKit::WebIDBServer::renameOrigin):
    584             (WebKit::WebIDBServer::removeConnection):
    585             (WebKit::WebIDBServer::close):
    586             (WebKit::WebIDBServer::tryClose):
    587             * NetworkProcess/IndexedDB/WebIDBServer.h:
    588             * NetworkProcess/NetworkConnectionToWebProcess.cpp:
    589             (WebKit::NetworkConnectionToWebProcess::addIDBConnection):
    590             * NetworkProcess/NetworkConnectionToWebProcess.h:
    591             * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
    592             * NetworkProcess/NetworkProcess.cpp:
    593             (WebKit::NetworkProcess::didClose):
    594             (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
    595             (WebKit::NetworkProcess::destroySession):
    596             (WebKit::NetworkProcess::createWebIDBServer):
    597             (WebKit::NetworkProcess::connectionToWebProcessClosed):
    598             (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer.
    599             * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
    600             (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer):
    601497
    6024982021-04-15  Russell Epstein  <repstein@apple.com>
  • branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp

    r276183 r276555  
    3737namespace WebKit {
    3838
    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)
     39Ref<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
     44WebIDBServer::WebIDBServer(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester)
    4545    : CrossThreadTaskHandler("com.apple.WebKit.IndexedDBServer", WTF::CrossThreadTaskHandler::AutodrainedPoolForRunLoop::Use)
    46     , m_dataTaskCounter([this](RefCounterEvent) { tryClose(); })
    47     , m_closeCallback(WTFMove(closeCallback))
    4846{
    4947    ASSERT(RunLoop::isMain());
     
    6058{
    6159    ASSERT(RunLoop::isMain());
    62     // close() has to be called to make sure thread exits.
    63     ASSERT(!m_closeCallback);
    6460}
    6561
     
    6864    ASSERT(RunLoop::isMain());
    6965
    70     postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable {
     66    postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback)]() mutable {
    7167        ASSERT(!RunLoop::isMain());
    7268
    7369        LockHolder locker(m_server->lock());
    74         postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token), origins = crossThreadCopy(m_server->getOrigins())]() mutable {
     70        postTaskReply(CrossThreadTask([callback = WTFMove(callback), origins = crossThreadCopy(m_server->getOrigins())]() mutable {
    7571            callback(WTFMove(origins));
    7672        }));
     
    8278    ASSERT(RunLoop::isMain());
    8379
    84     postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable {
     80    postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback)]() mutable {
    8581        ASSERT(!RunLoop::isMain());
    8682
    8783        LockHolder locker(m_server->lock());
    8884        m_server->closeAndDeleteDatabasesModifiedSince(modificationTime);
    89         postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
     85        postTaskReply(CrossThreadTask([callback = WTFMove(callback)]() mutable {
    9086            callback();
    9187        }));
     
    9793    ASSERT(RunLoop::isMain());
    9894
    99     postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable {
     95    postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback)] () mutable {
    10096        ASSERT(!RunLoop::isMain());
    10197
    10298        LockHolder locker(m_server->lock());
    10399        m_server->closeAndDeleteDatabasesForOrigins(originDatas);
    104         postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
     100        postTaskReply(CrossThreadTask([callback = WTFMove(callback)]() mutable {
    105101            callback();
    106102        }));
     
    112108    ASSERT(RunLoop::isMain());
    113109
    114     postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable {
     110    postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback)] () mutable {
    115111        ASSERT(!RunLoop::isMain());
    116112
    117113        LockHolder locker(m_server->lock());
    118114        m_server->renameOrigin(oldOrigin, newOrigin);
    119         postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
    120             callback();
    121         }));
     115        postTaskReply(CrossThreadTask(WTFMove(callback)));
    122116    });
    123117}
     
    379373    ASSERT(RunLoop::isMain());
    380374
    381     auto* takenConnection = m_connections.take(&connection);
    382     if (!takenConnection)
    383         return;
    384 
    385     takenConnection->removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
     375    m_connections.remove(&connection);
     376    connection.removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
    386377    postTask([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()] {
    387378        auto connection = m_connectionMap.take(connectionID);
     
    392383        m_server->unregisterConnection(connection->connectionToClient());
    393384    });
    394 
    395     tryClose();
    396385}
    397386
     
    411400{
    412401    ASSERT(RunLoop::isMain());
    413     if (!m_closeCallback)
    414         return;
    415402
    416403    // Remove the references held by IPC::Connection.
     
    429416        CrossThreadTaskHandler::kill();
    430417    });
    431 
    432     m_closeCallback();
    433 }
    434 
    435 void WebIDBServer::tryClose()
    436 {
    437     if (!m_connections.isEmpty() || m_dataTaskCounter.value())
    438         return;
    439 
    440     close();
    441418}
    442419
  • branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h

    r276183 r276555  
    3434#include <WebCore/StorageQuotaManager.h>
    3535#include <wtf/CrossThreadTaskHandler.h>
    36 #include <wtf/RefCounter.h>
    3736
    3837namespace WebCore {
     
    4746class WebIDBServer final : public CrossThreadTaskHandler, public IPC::Connection::ThreadMessageReceiverRefCounted {
    4847public:
    49     static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&, CompletionHandler<void()>&&);
     48    static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
    5049
    5150    void getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&&);
     
    9291    void close();
    9392
     93    bool hasConnection() const { return !m_connections.isEmpty(); }
    9494private:
    95     WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&, CompletionHandler<void()>&&);
     95    WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
    9696    ~WebIDBServer();
    9797
    9898    void postTask(WTF::Function<void()>&&);
    99 
    100     void tryClose();
    10199
    102100    std::unique_ptr<WebCore::IDBServer::IDBServer> m_server;
     
    105103    HashMap<IPC::Connection::UniqueID, std::unique_ptr<WebIDBConnectionToClient>> m_connectionMap;
    106104    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;
    113105};
    114106
  • branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp

    r276183 r276555  
    11711171}
    11721172
    1173 void NetworkConnectionToWebProcess::addIDBConnection()
    1174 {
    1175     m_networkProcess->webIDBServer(m_sessionID).addConnection(m_connection.get(), m_webProcessIdentifier);
    1176 }
    1177 
    11781173} // namespace WebKit
    11791174
  • branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h

    r276183 r276555  
    177177    void broadcastConsoleMessage(JSC::MessageSource, JSC::MessageLevel, const String& message);
    178178
    179     void addIDBConnection();
    180 
    181179private:
    182180    NetworkConnectionToWebProcess(NetworkProcess&, WebCore::ProcessIdentifier, PAL::SessionID, IPC::Connection::Identifier);
  • branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in

    r276183 r276555  
    102102    UpdateActivePages(String name, Vector<String> activePagesOrigins, audit_token_t auditToken)
    103103#endif
    104 
    105     AddIDBConnection()
    106104}
  • branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r276183 r276555  
    268268        platformFlushCookies(networkSession.sessionID(), [callbackAggregator] { });
    269269    });
    270 
    271     // Make sure references to NetworkProcess in spaceRequester and closeHandler is removed.
    272     for (auto& server : m_webIDBServers.values())
    273         server->close();
    274270}
    275271
     
    552548    m_storageManagerSet->remove(sessionID);
    553549
     550#if ENABLE(INDEXED_DATABASE)
     551    removeWebIDBServerIfPossible(sessionID);
     552#endif
    554553}
    555554
     
    23282327    }
    23292328
    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));
     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    });
    23372333}
    23382334
     
    23632359    sessionStorageQuotaManager->setIDBRootPath(idbRootPath);
    23642360}
     2361
     2362void 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
    23652380#endif // ENABLE(INDEXED_DATABASE)
    23662381
     
    26402655    ASSERT(webIDBServer);
    26412656    webIDBServer->removeConnection(connection);
     2657    removeWebIDBServerIfPossible(sessionID);
    26422658#endif
    26432659}
  • branches/safari-611-branch/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp

    r276183 r276555  
    6262    : m_connectionToServer(IDBClient::IDBConnectionToServer::create(*this))
    6363{
    64     send(Messages::NetworkConnectionToWebProcess::AddIDBConnection());
    6564}
    6665
Note: See TracChangeset for help on using the changeset viewer.