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

Changeset 259689 in webkit


Ignore:
Timestamp:
Apr 7, 2020, 5:32:26 PM (6 years ago)
Author:
Alan Coon
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

Location:
branches/safari-609-branch/Source
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-609-branch/Source/WTF/ChangeLog

    r258921 r259689  
     12020-04-07  Russell Epstein  <repstein@apple.com>
     2
     3        Cherry-pick r259316. rdar://problem/61269751
     4
     5    IndexedDB: destroy WebIDBServer when session is removed in network process
     6    https://bugs.webkit.org/show_bug.cgi?id=209606
     7    <rdar://problem/59310081>
     8   
     9    Reviewed by Geoffrey Garen.
     10   
     11    Source/WebCore:
     12   
     13    Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure
     14    everything in database finishes correctly.
     15   
     16    * Modules/indexeddb/server/IDBServer.cpp:
     17    (WebCore::IDBServer::IDBServer::~IDBServer):
     18    (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
     19    (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
     20    * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     21    (WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
     22    (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
     23    * Modules/indexeddb/server/UniqueIDBDatabase.h:
     24   
     25    Source/WebKit:
     26   
     27    Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.
     28   
     29    * NetworkProcess/IndexedDB/WebIDBServer.cpp:
     30    (WebKit::WebIDBServer::~WebIDBServer):
     31    (WebKit::WebIDBServer::addConnection):
     32    (WebKit::WebIDBServer::removeConnection):
     33    (WebKit::WebIDBServer::close):
     34    * NetworkProcess/IndexedDB/WebIDBServer.h:
     35    * NetworkProcess/NetworkProcess.cpp:
     36    (WebKit::NetworkProcess::destroySession):
     37    (WebKit::NetworkProcess::connectionToWebProcessClosed):
     38   
     39    Source/WTF:
     40   
     41    Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before
     42    thread finishes.
     43   
     44    * wtf/CrossThreadTaskHandler.cpp:
     45    (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
     46    (WTF::CrossThreadTaskHandler::setCompletionCallback):
     47    (WTF::CrossThreadTaskHandler::kill):
     48    * wtf/CrossThreadTaskHandler.h:
     49   
     50    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259316 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     51
     52    2020-03-31  Sihui Liu  <sihui_liu@apple.com>
     53
     54            IndexedDB: destroy WebIDBServer when session is removed in network process
     55            https://bugs.webkit.org/show_bug.cgi?id=209606
     56            <rdar://problem/59310081>
     57
     58            Reviewed by Geoffrey Garen.
     59
     60            Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before
     61            thread finishes.
     62
     63            * wtf/CrossThreadTaskHandler.cpp:
     64            (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
     65            (WTF::CrossThreadTaskHandler::setCompletionCallback):
     66            (WTF::CrossThreadTaskHandler::kill):
     67            * wtf/CrossThreadTaskHandler.h:
     68
    1692020-02-20  Russell Epstein  <repstein@apple.com>
    270
  • branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.cpp

    r248846 r259689  
    3838    Thread::create(threadName, [this] {
    3939        taskRunLoop();
     40
     41        if (m_completionCallback)
     42            m_completionCallback();
    4043    })->detach();
    4144}
     
    133136}
    134137
     138void CrossThreadTaskHandler::setCompletionCallback(Function<void ()>&& completionCallback)
     139{
     140    m_completionCallback = WTFMove(completionCallback);
     141}
     142
     143void CrossThreadTaskHandler::kill()
     144{
     145    m_taskQueue.kill();
     146    m_taskReplyQueue.kill();
     147}
     148
    135149} // namespace WTF
  • branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.h

    r245871 r259689  
    4949    WTF_EXPORT_PRIVATE void resume();
    5050
     51    WTF_EXPORT_PRIVATE void kill();
     52    WTF_EXPORT_PRIVATE void setCompletionCallback(Function<void ()>&&);
     53
    5154private:
    5255    void handleTaskRepliesOnMainThread();
     
    6972    CrossThreadQueue<CrossThreadTask> m_taskQueue;
    7073    CrossThreadQueue<CrossThreadTask> m_taskReplyQueue;
     74
     75    Function<void ()> m_completionCallback;
    7176};
    7277
  • branches/safari-609-branch/Source/WebCore/ChangeLog

    r259604 r259689  
     12020-04-07  Russell Epstein  <repstein@apple.com>
     2
     3        Cherry-pick r259316. rdar://problem/61269751
     4
     5    IndexedDB: destroy WebIDBServer when session is removed in network process
     6    https://bugs.webkit.org/show_bug.cgi?id=209606
     7    <rdar://problem/59310081>
     8   
     9    Reviewed by Geoffrey Garen.
     10   
     11    Source/WebCore:
     12   
     13    Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure
     14    everything in database finishes correctly.
     15   
     16    * Modules/indexeddb/server/IDBServer.cpp:
     17    (WebCore::IDBServer::IDBServer::~IDBServer):
     18    (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
     19    (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
     20    * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     21    (WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
     22    (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
     23    * Modules/indexeddb/server/UniqueIDBDatabase.h:
     24   
     25    Source/WebKit:
     26   
     27    Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.
     28   
     29    * NetworkProcess/IndexedDB/WebIDBServer.cpp:
     30    (WebKit::WebIDBServer::~WebIDBServer):
     31    (WebKit::WebIDBServer::addConnection):
     32    (WebKit::WebIDBServer::removeConnection):
     33    (WebKit::WebIDBServer::close):
     34    * NetworkProcess/IndexedDB/WebIDBServer.h:
     35    * NetworkProcess/NetworkProcess.cpp:
     36    (WebKit::NetworkProcess::destroySession):
     37    (WebKit::NetworkProcess::connectionToWebProcessClosed):
     38   
     39    Source/WTF:
     40   
     41    Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before
     42    thread finishes.
     43   
     44    * wtf/CrossThreadTaskHandler.cpp:
     45    (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
     46    (WTF::CrossThreadTaskHandler::setCompletionCallback):
     47    (WTF::CrossThreadTaskHandler::kill):
     48    * wtf/CrossThreadTaskHandler.h:
     49   
     50    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259316 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     51
     52    2020-03-31  Sihui Liu  <sihui_liu@apple.com>
     53
     54            IndexedDB: destroy WebIDBServer when session is removed in network process
     55            https://bugs.webkit.org/show_bug.cgi?id=209606
     56            <rdar://problem/59310081>
     57
     58            Reviewed by Geoffrey Garen.
     59
     60            Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure
     61            everything in database finishes correctly.
     62
     63            * Modules/indexeddb/server/IDBServer.cpp:
     64            (WebCore::IDBServer::IDBServer::~IDBServer):
     65            (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
     66            (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
     67            * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     68            (WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
     69            (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
     70            * Modules/indexeddb/server/UniqueIDBDatabase.h:
     71
    1722020-04-06  Alan Coon  <alancoon@apple.com>
    273
  • branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp

    r253740 r259689  
    6161{
    6262    ASSERT(!isMainThread());
     63
     64    for (auto& database : m_uniqueIDBDatabaseMap.values())
     65        database->immediateClose();
    6366}
    6467
     
    535538    HashSet<UniqueIDBDatabase*> openDatabases;
    536539    for (auto& database : m_uniqueIDBDatabaseMap.values())
    537         database->immediateCloseForUserDelete();
     540        database->immediateClose();
    538541
    539542    m_uniqueIDBDatabaseMap.clear();
     
    562565
    563566    for (auto& database : openDatabases) {
    564         database->immediateCloseForUserDelete();
     567        database->immediateClose();
    565568        m_uniqueIDBDatabaseMap.remove(database->identifier());
    566569    }
  • branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp

    r254028 r259689  
    11481148}
    11491149
    1150 void UniqueIDBDatabase::immediateCloseForUserDelete()
    1151 {
    1152     LOG(IndexedDB, "UniqueIDBDatabase::immediateCloseForUserDelete");
     1150void UniqueIDBDatabase::immediateClose()
     1151{
     1152    LOG(IndexedDB, "UniqueIDBDatabase::immediateClose");
    11531153
    11541154    // Error out all transactions.
  • branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h

    r253740 r259689  
    108108
    109109    void handleDelete(IDBConnectionToClient&, const IDBRequestData&);
    110     void immediateCloseForUserDelete();
     110    void immediateClose();
    111111
    112112    void abortActiveTransactions();
  • branches/safari-609-branch/Source/WebKit/ChangeLog

    r259685 r259689  
     12020-04-07  Russell Epstein  <repstein@apple.com>
     2
     3        Cherry-pick r259316. rdar://problem/61269751
     4
     5    IndexedDB: destroy WebIDBServer when session is removed in network process
     6    https://bugs.webkit.org/show_bug.cgi?id=209606
     7    <rdar://problem/59310081>
     8   
     9    Reviewed by Geoffrey Garen.
     10   
     11    Source/WebCore:
     12   
     13    Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure
     14    everything in database finishes correctly.
     15   
     16    * Modules/indexeddb/server/IDBServer.cpp:
     17    (WebCore::IDBServer::IDBServer::~IDBServer):
     18    (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
     19    (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
     20    * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     21    (WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
     22    (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
     23    * Modules/indexeddb/server/UniqueIDBDatabase.h:
     24   
     25    Source/WebKit:
     26   
     27    Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.
     28   
     29    * NetworkProcess/IndexedDB/WebIDBServer.cpp:
     30    (WebKit::WebIDBServer::~WebIDBServer):
     31    (WebKit::WebIDBServer::addConnection):
     32    (WebKit::WebIDBServer::removeConnection):
     33    (WebKit::WebIDBServer::close):
     34    * NetworkProcess/IndexedDB/WebIDBServer.h:
     35    * NetworkProcess/NetworkProcess.cpp:
     36    (WebKit::NetworkProcess::destroySession):
     37    (WebKit::NetworkProcess::connectionToWebProcessClosed):
     38   
     39    Source/WTF:
     40   
     41    Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before
     42    thread finishes.
     43   
     44    * wtf/CrossThreadTaskHandler.cpp:
     45    (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
     46    (WTF::CrossThreadTaskHandler::setCompletionCallback):
     47    (WTF::CrossThreadTaskHandler::kill):
     48    * wtf/CrossThreadTaskHandler.h:
     49   
     50    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259316 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     51
     52    2020-03-31  Sihui Liu  <sihui_liu@apple.com>
     53
     54            IndexedDB: destroy WebIDBServer when session is removed in network process
     55            https://bugs.webkit.org/show_bug.cgi?id=209606
     56            <rdar://problem/59310081>
     57
     58            Reviewed by Geoffrey Garen.
     59
     60            Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.
     61
     62            * NetworkProcess/IndexedDB/WebIDBServer.cpp:
     63            (WebKit::WebIDBServer::~WebIDBServer):
     64            (WebKit::WebIDBServer::addConnection):
     65            (WebKit::WebIDBServer::removeConnection):
     66            (WebKit::WebIDBServer::close):
     67            * NetworkProcess/IndexedDB/WebIDBServer.h:
     68            * NetworkProcess/NetworkProcess.cpp:
     69            (WebKit::NetworkProcess::destroySession):
     70            (WebKit::NetworkProcess::connectionToWebProcessClosed):
     71
    1722020-04-07  Russell Epstein  <repstein@apple.com>
    273
  • branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp

    r257171 r259689  
    5454    semaphore.wait();
    5555}
    56    
     56
     57WebIDBServer::~WebIDBServer()
     58{
     59    ASSERT(RunLoop::isMain());
     60}
     61
    5762void WebIDBServer::closeAndDeleteDatabasesModifiedSince(WallTime modificationTime, CompletionHandler<void()>&& callback)
    5863{
     
    336341        m_server->registerConnection(iter->value->connectionToClient());
    337342    });
     343    m_connections.add(&connection);
    338344    connection.addThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName(), this);
    339345}
     
    343349    ASSERT(RunLoop::isMain());
    344350
     351    m_connections.remove(&connection);
    345352    connection.removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
    346353    postTask([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()] {
     
    366373}
    367374
     375void WebIDBServer::close()
     376{
     377    ASSERT(RunLoop::isMain());
     378
     379    // Remove the references held by IPC::Connection.
     380    for (auto* connection : m_connections)
     381        connection->removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
     382
     383    CrossThreadTaskHandler::setCompletionCallback([protectedThis = makeRef(*this)]() mutable {
     384        ASSERT(!RunLoop::isMain());
     385        callOnMainRunLoop([protectedThis = WTFMove(protectedThis)]() mutable { });
     386    });
     387
     388    postTask([this]() mutable {
     389        m_connectionMap.clear();
     390        m_server = nullptr;
     391
     392        CrossThreadTaskHandler::kill();
     393    });
     394}
     395
    368396} // namespace WebKit
    369397#endif
  • branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h

    r253740 r259689  
    8888    void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
    8989    void dispatchToThread(WTF::Function<void()>&&);
     90    void close();
    9091
    9192private:
    9293    WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
     94    ~WebIDBServer();
    9395
    9496    void postTask(WTF::Function<void()>&&);
     
    98100
    99101    HashMap<IPC::Connection::UniqueID, std::unique_ptr<WebIDBConnectionToClient>> m_connectionMap;
     102    HashSet<IPC::Connection*> m_connections;
    100103};
    101104
  • branches/safari-609-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r257168 r259689  
    579579
    580580    m_storageManagerSet->remove(sessionID);
     581    if (auto webIDBServer = m_webIDBServers.take(sessionID))
     582        webIDBServer->close();
    581583}
    582584
     
    25452547{
    25462548    m_storageManagerSet->removeConnection(connection);
    2547     webIDBServer(sessionID).removeConnection(connection);
     2549    if (auto* webIDBServer = m_webIDBServers.get(sessionID))
     2550        webIDBServer->removeConnection(connection);
    25482551}
    25492552
Note: See TracChangeset for help on using the changeset viewer.