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

Changeset 276179 in webkit


Ignore:
Timestamp:
Apr 16, 2021, 4:32:49 PM (5 years ago)
Author:
Russell Epstein
Message:

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

This reverts commit r276116.

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

Legend:

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

    r276158 r276179  
    217217            * WebProcess/WebCoreSupport/WebChromeClient.cpp:
    218218            (WebKit::WebChromeClient::createWindow):
    219 
    220 2021-04-15  Russell Epstein  <repstein@apple.com>
    221 
    222         Cherry-pick r275846. rdar://problem/76727548
    223 
    224     Create WebIDBServer only when it is needed
    225     https://bugs.webkit.org/show_bug.cgi?id=224305
    226     rdar://71962196
    227    
    228     Reviewed by Alex Christensen.
    229    
    230     Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not
    231     in use. There are two cases where network process needs a WebIDBServer:
    232     1. handle requests from UI process to collect or remove data
    233     2. handle requests from Web process to perform IDB operations
    234    
    235     Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web
    236     process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message
    237     AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation.
    238    
    239     Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded
    240     with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of
    241     pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove
    242     WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the
    243     reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits.
    244    
    245     * NetworkProcess/IndexedDB/WebIDBServer.cpp:
    246     (WebKit::WebIDBServer::create):
    247     (WebKit::WebIDBServer::WebIDBServer):
    248     (WebKit::m_closeCallback):
    249     (WebKit::WebIDBServer::~WebIDBServer):
    250     (WebKit::WebIDBServer::getOrigins):
    251     (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):
    252     (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):
    253     (WebKit::WebIDBServer::renameOrigin):
    254     (WebKit::WebIDBServer::removeConnection):
    255     (WebKit::WebIDBServer::close):
    256     (WebKit::WebIDBServer::tryClose):
    257     * NetworkProcess/IndexedDB/WebIDBServer.h:
    258     * NetworkProcess/NetworkConnectionToWebProcess.cpp:
    259     (WebKit::NetworkConnectionToWebProcess::addIDBConnection):
    260     * NetworkProcess/NetworkConnectionToWebProcess.h:
    261     * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
    262     * NetworkProcess/NetworkProcess.cpp:
    263     (WebKit::NetworkProcess::didClose):
    264     (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
    265     (WebKit::NetworkProcess::destroySession):
    266     (WebKit::NetworkProcess::createWebIDBServer):
    267     (WebKit::NetworkProcess::connectionToWebProcessClosed):
    268     (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer.
    269     * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
    270     (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer):
    271    
    272     git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275846 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    273 
    274     2021-04-12  Sihui Liu  <sihui_liu@apple.com>
    275 
    276             Create WebIDBServer only when it is needed
    277             https://bugs.webkit.org/show_bug.cgi?id=224305
    278             rdar://71962196
    279 
    280             Reviewed by Alex Christensen.
    281 
    282             Currently each WebIDBServer has a separate thread, so we don't want to create or keep WebIDBServer if it's not
    283             in use. There are two cases where network process needs a WebIDBServer:
    284             1. handle requests from UI process to collect or remove data
    285             2. handle requests from Web process to perform IDB operations
    286 
    287             Previously, we created a WebIDBServer when network process connects to a web process, but that does not mean web
    288             process will perform IDB operations and we may create a thread that's not used. To avoid this, add a new message
    289             AddIDBConnection for web process to ensure network process has WebIDBServer when it's about to perform operation.
    290 
    291             Also, previously network process removes a WebIDBServer when session is removed and WebIDBServer is not binded
    292             with any web process connection. Now we remove WebIDBServer when it's done handling requests, that is count of
    293             pending requests from UI process is 0 and WebIDBServer is not binded with web process connection. We also remove
    294             WebIDBServer at when network process is about to be destroyed (NetworkProcess::didClose) so we can break the
    295             reference cycle of NetworkProcess-WebIDBServer-IDBServer, and make sure thread exits.
    296 
    297             * NetworkProcess/IndexedDB/WebIDBServer.cpp:
    298             (WebKit::WebIDBServer::create):
    299             (WebKit::WebIDBServer::WebIDBServer):
    300             (WebKit::m_closeCallback):
    301             (WebKit::WebIDBServer::~WebIDBServer):
    302             (WebKit::WebIDBServer::getOrigins):
    303             (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):
    304             (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):
    305             (WebKit::WebIDBServer::renameOrigin):
    306             (WebKit::WebIDBServer::removeConnection):
    307             (WebKit::WebIDBServer::close):
    308             (WebKit::WebIDBServer::tryClose):
    309             * NetworkProcess/IndexedDB/WebIDBServer.h:
    310             * NetworkProcess/NetworkConnectionToWebProcess.cpp:
    311             (WebKit::NetworkConnectionToWebProcess::addIDBConnection):
    312             * NetworkProcess/NetworkConnectionToWebProcess.h:
    313             * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
    314             * NetworkProcess/NetworkProcess.cpp:
    315             (WebKit::NetworkProcess::didClose):
    316             (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
    317             (WebKit::NetworkProcess::destroySession):
    318             (WebKit::NetworkProcess::createWebIDBServer):
    319             (WebKit::NetworkProcess::connectionToWebProcessClosed):
    320             (WebKit::NetworkProcess::removeWebIDBServerIfPossible): Deleted. Move the removal code to WebIDBServer.
    321             * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
    322             (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer):
    323219
    3242202021-04-15  Russell Epstein  <repstein@apple.com>
  • branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp

    r276116 r276179  
    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

    r276116 r276179  
    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

    r276116 r276179  
    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

    r276116 r276179  
    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

    r276116 r276179  
    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

    r276116 r276179  
    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
     
    23312327    }
    23322328
    2333     auto spaceRequester = [protectedThis = makeRef(*this), sessionID](const auto& origin, uint64_t spaceRequested) {
    2334         return protectedThis->storageQuotaManager(sessionID, origin)->requestSpaceOnBackgroundThread(spaceRequested);
    2335     };
    2336     auto closeHandler = [protectedThis = makeRef(*this), sessionID]() {
    2337         protectedThis->m_webIDBServers.remove(sessionID);
    2338     };
    2339     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    });
    23402333}
    23412334
     
    23662359    sessionStorageQuotaManager->setIDBRootPath(idbRootPath);
    23672360}
     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
    23682380#endif // ENABLE(INDEXED_DATABASE)
    23692381
     
    26432655    ASSERT(webIDBServer);
    26442656    webIDBServer->removeConnection(connection);
     2657    removeWebIDBServerIfPossible(sessionID);
    26452658#endif
    26462659}
  • branches/safari-611-branch/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp

    r276116 r276179  
    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.