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

Changeset 276183 in webkit


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

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

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

Legend:

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

    r276179 r276183  
    217217            * WebProcess/WebCoreSupport/WebChromeClient.cpp:
    218218            (WebKit::WebChromeClient::createWindow):
     219
     2202021-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):
    219323
    2203242021-04-15  Russell Epstein  <repstein@apple.com>
  • branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp

    r276179 r276183  
    3737namespace WebKit {
    3838
    39 Ref<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 
    44 WebIDBServer::WebIDBServer(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester)
     39Ref<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
     44WebIDBServer::WebIDBServer(PAL::SessionID sessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&& spaceRequester, CompletionHandler<void()>&& closeCallback)
    4545    : CrossThreadTaskHandler("com.apple.WebKit.IndexedDBServer", WTF::CrossThreadTaskHandler::AutodrainedPoolForRunLoop::Use)
     46    , m_dataTaskCounter([this](RefCounterEvent) { tryClose(); })
     47    , m_closeCallback(WTFMove(closeCallback))
    4648{
    4749    ASSERT(RunLoop::isMain());
     
    5860{
    5961    ASSERT(RunLoop::isMain());
     62    // close() has to be called to make sure thread exits.
     63    ASSERT(!m_closeCallback);
    6064}
    6165
     
    6468    ASSERT(RunLoop::isMain());
    6569
    66     postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback)]() mutable {
     70    postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable {
    6771        ASSERT(!RunLoop::isMain());
    6872
    6973        LockHolder locker(m_server->lock());
    70         postTaskReply(CrossThreadTask([callback = WTFMove(callback), origins = crossThreadCopy(m_server->getOrigins())]() mutable {
     74        postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token), origins = crossThreadCopy(m_server->getOrigins())]() mutable {
    7175            callback(WTFMove(origins));
    7276        }));
     
    7882    ASSERT(RunLoop::isMain());
    7983
    80     postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback)]() mutable {
     84    postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable {
    8185        ASSERT(!RunLoop::isMain());
    8286
    8387        LockHolder locker(m_server->lock());
    8488        m_server->closeAndDeleteDatabasesModifiedSince(modificationTime);
    85         postTaskReply(CrossThreadTask([callback = WTFMove(callback)]() mutable {
     89        postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
    8690            callback();
    8791        }));
     
    9397    ASSERT(RunLoop::isMain());
    9498
    95     postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback)] () mutable {
     99    postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable {
    96100        ASSERT(!RunLoop::isMain());
    97101
    98102        LockHolder locker(m_server->lock());
    99103        m_server->closeAndDeleteDatabasesForOrigins(originDatas);
    100         postTaskReply(CrossThreadTask([callback = WTFMove(callback)]() mutable {
     104        postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
    101105            callback();
    102106        }));
     
    108112    ASSERT(RunLoop::isMain());
    109113
    110     postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback)] () mutable {
     114    postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable {
    111115        ASSERT(!RunLoop::isMain());
    112116
    113117        LockHolder locker(m_server->lock());
    114118        m_server->renameOrigin(oldOrigin, newOrigin);
    115         postTaskReply(CrossThreadTask(WTFMove(callback)));
     119        postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
     120            callback();
     121        }));
    116122    });
    117123}
     
    373379    ASSERT(RunLoop::isMain());
    374380
    375     m_connections.remove(&connection);
    376     connection.removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
     381    auto* takenConnection = m_connections.take(&connection);
     382    if (!takenConnection)
     383        return;
     384
     385    takenConnection->removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
    377386    postTask([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()] {
    378387        auto connection = m_connectionMap.take(connectionID);
     
    383392        m_server->unregisterConnection(connection->connectionToClient());
    384393    });
     394
     395    tryClose();
    385396}
    386397
     
    400411{
    401412    ASSERT(RunLoop::isMain());
     413    if (!m_closeCallback)
     414        return;
    402415
    403416    // Remove the references held by IPC::Connection.
     
    416429        CrossThreadTaskHandler::kill();
    417430    });
     431
     432    m_closeCallback();
     433}
     434
     435void WebIDBServer::tryClose()
     436{
     437    if (!m_connections.isEmpty() || m_dataTaskCounter.value())
     438        return;
     439
     440    close();
    418441}
    419442
  • branches/safari-611-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h

    r276179 r276183  
    3434#include <WebCore/StorageQuotaManager.h>
    3535#include <wtf/CrossThreadTaskHandler.h>
     36#include <wtf/RefCounter.h>
    3637
    3738namespace WebCore {
     
    4647class WebIDBServer final : public CrossThreadTaskHandler, public IPC::Connection::ThreadMessageReceiverRefCounted {
    4748public:
    48     static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
     49    static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&, CompletionHandler<void()>&&);
    4950
    5051    void getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&&);
     
    9192    void close();
    9293
    93     bool hasConnection() const { return !m_connections.isEmpty(); }
    9494private:
    95     WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
     95    WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&, CompletionHandler<void()>&&);
    9696    ~WebIDBServer();
    9797
    9898    void postTask(WTF::Function<void()>&&);
     99
     100    void tryClose();
    99101
    100102    std::unique_ptr<WebCore::IDBServer::IDBServer> m_server;
     
    103105    HashMap<IPC::Connection::UniqueID, std::unique_ptr<WebIDBConnectionToClient>> m_connectionMap;
    104106    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;
    105113};
    106114
  • branches/safari-611-branch/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp

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

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

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

    r276179 r276183  
    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();
    270274}
    271275
     
    548552    m_storageManagerSet->remove(sessionID);
    549553
    550 #if ENABLE(INDEXED_DATABASE)
    551     removeWebIDBServerIfPossible(sessionID);
    552 #endif
    553554}
    554555
     
    23272328    }
    23282329
    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     });
     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));
    23332337}
    23342338
     
    23592363    sessionStorageQuotaManager->setIDBRootPath(idbRootPath);
    23602364}
    2361 
    2362 void 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 
    23802365#endif // ENABLE(INDEXED_DATABASE)
    23812366
     
    26552640    ASSERT(webIDBServer);
    26562641    webIDBServer->removeConnection(connection);
    2657     removeWebIDBServerIfPossible(sessionID);
    26582642#endif
    26592643}
  • branches/safari-611-branch/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp

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