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

Changeset 259316 in webkit


Ignore:
Timestamp:
Mar 31, 2020, 3:19:25 PM (6 years ago)
Author:
sihui_liu@apple.com
Message:

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:
Location:
trunk/Source
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r259202 r259316  
     12020-03-31  Sihui Liu  <sihui_liu@apple.com>
     2
     3        IndexedDB: destroy WebIDBServer when session is removed in network process
     4        https://bugs.webkit.org/show_bug.cgi?id=209606
     5        <rdar://problem/59310081>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before
     10        thread finishes.
     11
     12        * wtf/CrossThreadTaskHandler.cpp:
     13        (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
     14        (WTF::CrossThreadTaskHandler::setCompletionCallback):
     15        (WTF::CrossThreadTaskHandler::kill):
     16        * wtf/CrossThreadTaskHandler.h:
     17
    1182020-03-30  David Kilzer  <ddkilzer@apple.com>
    219
  • trunk/Source/WTF/wtf/CrossThreadTaskHandler.cpp

    r259016 r259316  
    3838    Thread::create(threadName, [this] {
    3939        taskRunLoop();
     40
     41        if (m_completionCallback)
     42            m_completionCallback();
    4043    })->detach();
    4144}
     
    9093}
    9194
     95void CrossThreadTaskHandler::setCompletionCallback(Function<void ()>&& completionCallback)
     96{
     97    m_completionCallback = WTFMove(completionCallback);
     98}
     99
     100void CrossThreadTaskHandler::kill()
     101{
     102    m_taskQueue.kill();
     103    m_taskReplyQueue.kill();
     104}
     105
    92106} // namespace WTF
  • trunk/Source/WTF/wtf/CrossThreadTaskHandler.h

    r259016 r259316  
    4747    WTF_EXPORT_PRIVATE void postTaskReply(CrossThreadTask&&);
    4848
     49    WTF_EXPORT_PRIVATE void kill();
     50    WTF_EXPORT_PRIVATE void setCompletionCallback(Function<void ()>&&);
     51
    4952private:
    5053    void handleTaskRepliesOnMainThread();
     
    5962    CrossThreadQueue<CrossThreadTask> m_taskQueue;
    6063    CrossThreadQueue<CrossThreadTask> m_taskReplyQueue;
     64
     65    Function<void ()> m_completionCallback;
    6166};
    6267
  • trunk/Source/WebCore/ChangeLog

    r259315 r259316  
     12020-03-31  Sihui Liu  <sihui_liu@apple.com>
     2
     3        IndexedDB: destroy WebIDBServer when session is removed in network process
     4        https://bugs.webkit.org/show_bug.cgi?id=209606
     5        <rdar://problem/59310081>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure
     10        everything in database finishes correctly.
     11
     12        * Modules/indexeddb/server/IDBServer.cpp:
     13        (WebCore::IDBServer::IDBServer::~IDBServer):
     14        (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
     15        (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
     16        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     17        (WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
     18        (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
     19        * Modules/indexeddb/server/UniqueIDBDatabase.h:
     20
    1212020-03-31  Chris Dumez  <cdumez@apple.com>
    222
  • trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp

    r259215 r259316  
    6161{
    6262    ASSERT(!isMainThread());
     63
     64    for (auto& database : m_uniqueIDBDatabaseMap.values())
     65        database->immediateClose();
    6366}
    6467
     
    545548    HashSet<UniqueIDBDatabase*> openDatabases;
    546549    for (auto& database : m_uniqueIDBDatabaseMap.values())
    547         database->immediateCloseForUserDelete();
     550        database->immediateClose();
    548551
    549552    m_uniqueIDBDatabaseMap.clear();
     
    572575
    573576    for (auto& database : openDatabases) {
    574         database->immediateCloseForUserDelete();
     577        database->immediateClose();
    575578        m_uniqueIDBDatabaseMap.remove(database->identifier());
    576579    }
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp

    r259215 r259316  
    11251125}
    11261126
    1127 void UniqueIDBDatabase::immediateCloseForUserDelete()
    1128 {
    1129     LOG(IndexedDB, "UniqueIDBDatabase::immediateCloseForUserDelete");
     1127void UniqueIDBDatabase::immediateClose()
     1128{
     1129    LOG(IndexedDB, "UniqueIDBDatabase::immediateClose");
    11301130
    11311131    // Error out all transactions.
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h

    r259215 r259316  
    108108
    109109    void handleDelete(IDBConnectionToClient&, const IDBRequestData&);
    110     void immediateCloseForUserDelete();
     110    void immediateClose();
    111111
    112112    void abortActiveTransactions();
  • trunk/Source/WebKit/ChangeLog

    r259315 r259316  
     12020-03-31  Sihui Liu  <sihui_liu@apple.com>
     2
     3        IndexedDB: destroy WebIDBServer when session is removed in network process
     4        https://bugs.webkit.org/show_bug.cgi?id=209606
     5        <rdar://problem/59310081>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.
     10
     11        * NetworkProcess/IndexedDB/WebIDBServer.cpp:
     12        (WebKit::WebIDBServer::~WebIDBServer):
     13        (WebKit::WebIDBServer::addConnection):
     14        (WebKit::WebIDBServer::removeConnection):
     15        (WebKit::WebIDBServer::close):
     16        * NetworkProcess/IndexedDB/WebIDBServer.h:
     17        * NetworkProcess/NetworkProcess.cpp:
     18        (WebKit::NetworkProcess::destroySession):
     19        (WebKit::NetworkProcess::connectionToWebProcessClosed):
     20
    1212020-03-31  Chris Dumez  <cdumez@apple.com>
    222
  • trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp

    r257103 r259316  
    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
  • trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h

    r253740 r259316  
    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
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r259275 r259316  
    592592
    593593    m_storageManagerSet->remove(sessionID);
     594    if (auto webIDBServer = m_webIDBServers.take(sessionID))
     595        webIDBServer->close();
    594596}
    595597
     
    26352637{
    26362638    m_storageManagerSet->removeConnection(connection);
    2637     webIDBServer(sessionID).removeConnection(connection);
     2639    if (auto* webIDBServer = m_webIDBServers.get(sessionID))
     2640        webIDBServer->removeConnection(connection);
    26382641}
    26392642
Note: See TracChangeset for help on using the changeset viewer.