Title: [275891] trunk/Source
Revision
275891
Author
sihui_...@apple.com
Date
2021-04-13 09:53:46 -0700 (Tue, 13 Apr 2021)

Log Message

Make WebIDBServer not block main thread during initialization
https://bugs.webkit.org/show_bug.cgi?id=224299

Reviewed by Geoffrey Garen.

Source/WebCore:

* Modules/indexeddb/server/IDBServer.cpp:
(WebCore::IDBServer::IDBServer::IDBServer):
* Modules/indexeddb/server/IDBServer.h:
(WebCore::IDBServer::IDBServer::lock): Deleted.
* Modules/indexeddb/server/UniqueIDBDatabase.cpp:
(WebCore::IDBServer::UniqueIDBDatabase::abortActiveTransactions):

Source/WebKit:

Move Lock from WebCore::IDBServer to WebIDBServer so we can block background thread in suspend() when m_server
is uninitialized.

* NetworkProcess/IndexedDB/WebIDBServer.cpp:
(WebKit::m_closeCallback):
(WebKit::WebIDBServer::getOrigins):
(WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):
(WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):
(WebKit::WebIDBServer::renameOrigin):
(WebKit::WebIDBServer::suspend):
(WebKit::WebIDBServer::resume):
(WebKit::WebIDBServer::openDatabase):
(WebKit::WebIDBServer::deleteDatabase):
(WebKit::WebIDBServer::abortTransaction):
(WebKit::WebIDBServer::commitTransaction):
(WebKit::WebIDBServer::didFinishHandlingVersionChangeTransaction):
(WebKit::WebIDBServer::createObjectStore):
(WebKit::WebIDBServer::deleteObjectStore):
(WebKit::WebIDBServer::renameObjectStore):
(WebKit::WebIDBServer::clearObjectStore):
(WebKit::WebIDBServer::createIndex):
(WebKit::WebIDBServer::deleteIndex):
(WebKit::WebIDBServer::renameIndex):
(WebKit::WebIDBServer::putOrAdd):
(WebKit::WebIDBServer::getRecord):
(WebKit::WebIDBServer::getAllRecords):
(WebKit::WebIDBServer::getCount):
(WebKit::WebIDBServer::deleteRecord):
(WebKit::WebIDBServer::openCursor):
(WebKit::WebIDBServer::iterateCursor):
(WebKit::WebIDBServer::establishTransaction):
(WebKit::WebIDBServer::databaseConnectionPendingClose):
(WebKit::WebIDBServer::databaseConnectionClosed):
(WebKit::WebIDBServer::abortOpenAndUpgradeNeeded):
(WebKit::WebIDBServer::didFireVersionChangeEvent):
(WebKit::WebIDBServer::openDBRequestCancelled):
(WebKit::WebIDBServer::getAllDatabaseNamesAndVersions):
(WebKit::WebIDBServer::addConnection):
(WebKit::WebIDBServer::removeConnection):
(WebKit::WebIDBServer::close):
* NetworkProcess/IndexedDB/WebIDBServer.h:

Source/WebKitLegacy:

* Storage/InProcessIDBServer.cpp:
(InProcessIDBServer::InProcessIDBServer):
(InProcessIDBServer::deleteDatabase):
(InProcessIDBServer::openDatabase):
(InProcessIDBServer::abortTransaction):
(InProcessIDBServer::commitTransaction):
(InProcessIDBServer::didFinishHandlingVersionChangeTransaction):
(InProcessIDBServer::createObjectStore):
(InProcessIDBServer::deleteObjectStore):
(InProcessIDBServer::renameObjectStore):
(InProcessIDBServer::clearObjectStore):
(InProcessIDBServer::createIndex):
(InProcessIDBServer::deleteIndex):
(InProcessIDBServer::renameIndex):
(InProcessIDBServer::putOrAdd):
(InProcessIDBServer::getRecord):
(InProcessIDBServer::getAllRecords):
(InProcessIDBServer::getCount):
(InProcessIDBServer::deleteRecord):
(InProcessIDBServer::openCursor):
(InProcessIDBServer::iterateCursor):
(InProcessIDBServer::establishTransaction):
(InProcessIDBServer::databaseConnectionPendingClose):
(InProcessIDBServer::databaseConnectionClosed):
(InProcessIDBServer::abortOpenAndUpgradeNeeded):
(InProcessIDBServer::didFireVersionChangeEvent):
(InProcessIDBServer::openDBRequestCancelled):
(InProcessIDBServer::getAllDatabaseNamesAndVersions):
(InProcessIDBServer::closeAndDeleteDatabasesModifiedSince):
* Storage/InProcessIDBServer.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (275890 => 275891)


--- trunk/Source/WebCore/ChangeLog	2021-04-13 16:50:41 UTC (rev 275890)
+++ trunk/Source/WebCore/ChangeLog	2021-04-13 16:53:46 UTC (rev 275891)
@@ -1,3 +1,17 @@
+2021-04-13  Sihui Liu  <sihui_...@apple.com>
+
+        Make WebIDBServer not block main thread during initialization
+        https://bugs.webkit.org/show_bug.cgi?id=224299
+
+        Reviewed by Geoffrey Garen.
+
+        * Modules/indexeddb/server/IDBServer.cpp:
+        (WebCore::IDBServer::IDBServer::IDBServer):
+        * Modules/indexeddb/server/IDBServer.h:
+        (WebCore::IDBServer::IDBServer::lock): Deleted.
+        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+        (WebCore::IDBServer::UniqueIDBDatabase::abortActiveTransactions):
+
 2021-04-13  Frédéric Wang  <fw...@igalia.com>
 
         ASSERTION FAILED: !m_needExceptionCheck in CloneSerializer::serialize with postMessage({g:42})

Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (275890 => 275891)


--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2021-04-13 16:50:41 UTC (rev 275890)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2021-04-13 16:53:46 UTC (rev 275891)
@@ -44,9 +44,10 @@
 namespace WebCore {
 namespace IDBServer {
 
-IDBServer::IDBServer(PAL::SessionID sessionID, const String& databaseDirectoryPath, StorageQuotaManagerSpaceRequester&& spaceRequester)
+IDBServer::IDBServer(PAL::SessionID sessionID, const String& databaseDirectoryPath, StorageQuotaManagerSpaceRequester&& spaceRequester, Lock& lock)
     : m_sessionID(sessionID)
     , m_spaceRequester(WTFMove(spaceRequester))
+    , m_lock(lock)
 {
     ASSERT(!isMainThread());
     ASSERT(databaseDirectoryPath.isSafeToSendToAnotherThread());

Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h (275890 => 275891)


--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h	2021-04-13 16:50:41 UTC (rev 275890)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h	2021-04-13 16:53:46 UTC (rev 275891)
@@ -53,7 +53,7 @@
     WTF_MAKE_FAST_ALLOCATED;
 public:
     using StorageQuotaManagerSpaceRequester = Function<StorageQuotaManager::Decision(const ClientOrigin&, uint64_t spaceRequested)>;
-    WEBCORE_EXPORT IDBServer(PAL::SessionID, const String& databaseDirectoryPath, StorageQuotaManagerSpaceRequester&&);
+    WEBCORE_EXPORT IDBServer(PAL::SessionID, const String& databaseDirectoryPath, StorageQuotaManagerSpaceRequester&&, Lock&);
     WEBCORE_EXPORT ~IDBServer();
 
     WEBCORE_EXPORT void registerConnection(IDBConnectionToClient&);
@@ -110,8 +110,6 @@
 
     WEBCORE_EXPORT void stopDatabaseActivitiesOnMainThread();
 
-    Lock& lock() { return m_lock; };
-
 private:
     UniqueIDBDatabase& getOrCreateUniqueIDBDatabase(const IDBDatabaseIdentifier&);
 
@@ -132,7 +130,7 @@
 
     StorageQuotaManagerSpaceRequester m_spaceRequester;
 
-    Lock m_lock;
+    Lock& m_lock;
 };
 
 } // namespace IDBServer

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (275890 => 275891)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2021-04-13 16:50:41 UTC (rev 275890)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2021-04-13 16:53:46 UTC (rev 275891)
@@ -1189,7 +1189,6 @@
 void UniqueIDBDatabase::abortActiveTransactions()
 {
     ASSERT(isMainThread());
-    ASSERT(m_server.lock().isHeld());
 
     for (auto& identifier : copyToVector(m_inProgressTransactions.keys())) {
         auto transaction = m_inProgressTransactions.get(identifier);

Modified: trunk/Source/WebKit/ChangeLog (275890 => 275891)


--- trunk/Source/WebKit/ChangeLog	2021-04-13 16:50:41 UTC (rev 275890)
+++ trunk/Source/WebKit/ChangeLog	2021-04-13 16:53:46 UTC (rev 275891)
@@ -1,3 +1,52 @@
+2021-04-13  Sihui Liu  <sihui_...@apple.com>
+
+        Make WebIDBServer not block main thread during initialization
+        https://bugs.webkit.org/show_bug.cgi?id=224299
+
+        Reviewed by Geoffrey Garen.
+
+        Move Lock from WebCore::IDBServer to WebIDBServer so we can block background thread in suspend() when m_server 
+        is uninitialized.
+
+        * NetworkProcess/IndexedDB/WebIDBServer.cpp:
+        (WebKit::m_closeCallback):
+        (WebKit::WebIDBServer::getOrigins):
+        (WebKit::WebIDBServer::closeAndDeleteDatabasesModifiedSince):
+        (WebKit::WebIDBServer::closeAndDeleteDatabasesForOrigins):
+        (WebKit::WebIDBServer::renameOrigin):
+        (WebKit::WebIDBServer::suspend):
+        (WebKit::WebIDBServer::resume):
+        (WebKit::WebIDBServer::openDatabase):
+        (WebKit::WebIDBServer::deleteDatabase):
+        (WebKit::WebIDBServer::abortTransaction):
+        (WebKit::WebIDBServer::commitTransaction):
+        (WebKit::WebIDBServer::didFinishHandlingVersionChangeTransaction):
+        (WebKit::WebIDBServer::createObjectStore):
+        (WebKit::WebIDBServer::deleteObjectStore):
+        (WebKit::WebIDBServer::renameObjectStore):
+        (WebKit::WebIDBServer::clearObjectStore):
+        (WebKit::WebIDBServer::createIndex):
+        (WebKit::WebIDBServer::deleteIndex):
+        (WebKit::WebIDBServer::renameIndex):
+        (WebKit::WebIDBServer::putOrAdd):
+        (WebKit::WebIDBServer::getRecord):
+        (WebKit::WebIDBServer::getAllRecords):
+        (WebKit::WebIDBServer::getCount):
+        (WebKit::WebIDBServer::deleteRecord):
+        (WebKit::WebIDBServer::openCursor):
+        (WebKit::WebIDBServer::iterateCursor):
+        (WebKit::WebIDBServer::establishTransaction):
+        (WebKit::WebIDBServer::databaseConnectionPendingClose):
+        (WebKit::WebIDBServer::databaseConnectionClosed):
+        (WebKit::WebIDBServer::abortOpenAndUpgradeNeeded):
+        (WebKit::WebIDBServer::didFireVersionChangeEvent):
+        (WebKit::WebIDBServer::openDBRequestCancelled):
+        (WebKit::WebIDBServer::getAllDatabaseNamesAndVersions):
+        (WebKit::WebIDBServer::addConnection):
+        (WebKit::WebIDBServer::removeConnection):
+        (WebKit::WebIDBServer::close):
+        * NetworkProcess/IndexedDB/WebIDBServer.h:
+
 2021-04-13  Chris Dumez  <cdu...@apple.com>
 
         The GPUProcess should only launch when it is needed

Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp (275890 => 275891)


--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp	2021-04-13 16:50:41 UTC (rev 275890)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp	2021-04-13 16:53:46 UTC (rev 275891)
@@ -30,7 +30,6 @@
 #include "WebIDBServerMessages.h"
 #include <WebCore/SQLiteDatabaseTracker.h>
 #include <WebCore/StorageQuotaManager.h>
-#include <wtf/threads/BinarySemaphore.h>
 
 namespace WebKit {
 
@@ -46,12 +45,12 @@
 {
     ASSERT(RunLoop::isMain());
 
-    BinarySemaphore semaphore;
-    postTask([this, protectedThis = makeRef(*this), &semaphore, sessionID, directory = directory.isolatedCopy(), spaceRequester = WTFMove(spaceRequester)] () mutable {
-        m_server = makeUnique<WebCore::IDBServer::IDBServer>(sessionID, directory, WTFMove(spaceRequester));
-        semaphore.signal();
+    postTask([this, protectedThis = makeRef(*this), sessionID, directory = directory.isolatedCopy(), spaceRequester = WTFMove(spaceRequester)] () mutable {
+        ASSERT(!RunLoop::isMain());
+
+        LockHolder locker(m_serverLock);
+        m_server = makeUnique<WebCore::IDBServer::IDBServer>(sessionID, directory, WTFMove(spaceRequester), m_serverLock);
     });
-    semaphore.wait();
 }
 
 WebIDBServer::~WebIDBServer()
@@ -68,7 +67,7 @@
     postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable {
         ASSERT(!RunLoop::isMain());
 
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token), origins = crossThreadCopy(m_server->getOrigins())]() mutable {
             callback(WTFMove(origins));
         }));
@@ -82,7 +81,7 @@
     postTask([this, protectedThis = makeRef(*this), modificationTime, callback = WTFMove(callback), token = m_dataTaskCounter.count()]() mutable {
         ASSERT(!RunLoop::isMain());
 
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->closeAndDeleteDatabasesModifiedSince(modificationTime);
         postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
             callback();
@@ -97,7 +96,7 @@
     postTask([this, protectedThis = makeRef(*this), originDatas = originDatas.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable {
         ASSERT(!RunLoop::isMain());
 
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->closeAndDeleteDatabasesForOrigins(originDatas);
         postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
             callback();
@@ -112,7 +111,7 @@
     postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback), token = m_dataTaskCounter.count()] () mutable {
         ASSERT(!RunLoop::isMain());
 
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->renameOrigin(oldOrigin, newOrigin);
         postTaskReply(CrossThreadTask([callback = WTFMove(callback), token = WTFMove(token)]() mutable {
             callback();
@@ -128,8 +127,9 @@
         return;
 
     m_isSuspended = true;
-    m_server->lock().lock();
-    m_server->stopDatabaseActivitiesOnMainThread();
+    m_serverLock.lock();
+    if (m_server)
+        m_server->stopDatabaseActivitiesOnMainThread();
 }
 
 void WebIDBServer::resume()
@@ -140,7 +140,7 @@
         return;
 
     m_isSuspended = false;
-    m_server->lock().unlock();
+    m_serverLock.unlock();
 }
 
 void WebIDBServer::openDatabase(const WebCore::IDBRequestData& requestData)
@@ -147,7 +147,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->openDatabase(requestData);
 }
 
@@ -155,7 +155,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->deleteDatabase(requestData);
 }
 
@@ -163,7 +163,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->abortTransaction(transactionIdentifier);
 }
 
@@ -171,7 +171,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->commitTransaction(transactionIdentifier);
 }
 
@@ -179,7 +179,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->didFinishHandlingVersionChangeTransaction(databaseConnectionIdentifier, transactionIdentifier);
 }
 
@@ -187,7 +187,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->createObjectStore(requestData, objectStoreInfo);
 }
 
@@ -195,7 +195,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->deleteObjectStore(requestData, objectStoreName);
 }
 
@@ -203,7 +203,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->renameObjectStore(requestData, objectStoreIdentifier, newName);
 }
 
@@ -211,7 +211,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->clearObjectStore(requestData, objectStoreIdentifier);
 }
 
@@ -219,7 +219,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->createIndex(requestData, indexInfo);
 }
 
@@ -227,7 +227,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->deleteIndex(requestData, objectStoreIdentifier, indexName);
 }
 
@@ -235,7 +235,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->renameIndex(requestData, objectStoreIdentifier, indexIdentifier, newName);
 }
 
@@ -243,7 +243,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->putOrAdd(requestData, keyData, value, overWriteMode);
 }
 
@@ -251,7 +251,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->getRecord(requestData, getRecordData);
 }
 
@@ -259,7 +259,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->getAllRecords(requestData, getAllRecordsData);
 }
 
@@ -267,7 +267,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->getCount(requestData, keyRangeData);
 }
 
@@ -275,7 +275,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->deleteRecord(requestData, keyRangeData);
 }
 
@@ -283,7 +283,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->openCursor(requestData, cursorInfo);
 }
 
@@ -291,7 +291,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->iterateCursor(requestData, iterateCursorData);
 }
 
@@ -299,7 +299,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->establishTransaction(databaseConnectionIdentifier, transactionInfo);
 }
 
@@ -307,7 +307,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->databaseConnectionPendingClose(databaseConnectionIdentifier);
 }
 
@@ -315,7 +315,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->databaseConnectionClosed(databaseConnectionIdentifier);
 }
 
@@ -323,7 +323,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->abortOpenAndUpgradeNeeded(databaseConnectionIdentifier, transactionIdentifier);
 }
 
@@ -331,7 +331,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, connectionClosed);
 }
 
@@ -339,7 +339,7 @@
 {
     ASSERT(!RunLoop::isMain());
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->openDBRequestCancelled(requestData);
 }
 
@@ -350,7 +350,7 @@
     auto* webIDBConnection = m_connectionMap.get(connection.uniqueID());
     ASSERT(webIDBConnection);
 
-    LockHolder locker(m_server->lock());
+    LockHolder locker(m_serverLock);
     m_server->getAllDatabaseNamesAndVersions(webIDBConnection->identifier(), requestIdentifier, origin);
 }
 
@@ -365,7 +365,7 @@
 
         ASSERT_UNUSED(isNewEntry, isNewEntry);
 
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->registerConnection(iter->value->connectionToClient());
     });
     m_connections.add(&connection);
@@ -386,7 +386,7 @@
 
         ASSERT(connection);
 
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->unregisterConnection(connection->connectionToClient());
     });
 
@@ -422,8 +422,9 @@
 
     postTask([this]() mutable {
         m_connectionMap.clear();
+
+        LockHolder locker(m_serverLock);
         m_server = nullptr;
-
         CrossThreadTaskHandler::kill();
     });
 

Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h (275890 => 275891)


--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2021-04-13 16:50:41 UTC (rev 275890)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2021-04-13 16:53:46 UTC (rev 275891)
@@ -97,6 +97,7 @@
 
     void tryClose();
 
+    Lock m_serverLock;
     std::unique_ptr<WebCore::IDBServer::IDBServer> m_server;
     bool m_isSuspended { false };
 

Modified: trunk/Source/WebKitLegacy/ChangeLog (275890 => 275891)


--- trunk/Source/WebKitLegacy/ChangeLog	2021-04-13 16:50:41 UTC (rev 275890)
+++ trunk/Source/WebKitLegacy/ChangeLog	2021-04-13 16:53:46 UTC (rev 275891)
@@ -1,3 +1,41 @@
+2021-04-13  Sihui Liu  <sihui_...@apple.com>
+
+        Make WebIDBServer not block main thread during initialization
+        https://bugs.webkit.org/show_bug.cgi?id=224299
+
+        Reviewed by Geoffrey Garen.
+
+        * Storage/InProcessIDBServer.cpp:
+        (InProcessIDBServer::InProcessIDBServer):
+        (InProcessIDBServer::deleteDatabase):
+        (InProcessIDBServer::openDatabase):
+        (InProcessIDBServer::abortTransaction):
+        (InProcessIDBServer::commitTransaction):
+        (InProcessIDBServer::didFinishHandlingVersionChangeTransaction):
+        (InProcessIDBServer::createObjectStore):
+        (InProcessIDBServer::deleteObjectStore):
+        (InProcessIDBServer::renameObjectStore):
+        (InProcessIDBServer::clearObjectStore):
+        (InProcessIDBServer::createIndex):
+        (InProcessIDBServer::deleteIndex):
+        (InProcessIDBServer::renameIndex):
+        (InProcessIDBServer::putOrAdd):
+        (InProcessIDBServer::getRecord):
+        (InProcessIDBServer::getAllRecords):
+        (InProcessIDBServer::getCount):
+        (InProcessIDBServer::deleteRecord):
+        (InProcessIDBServer::openCursor):
+        (InProcessIDBServer::iterateCursor):
+        (InProcessIDBServer::establishTransaction):
+        (InProcessIDBServer::databaseConnectionPendingClose):
+        (InProcessIDBServer::databaseConnectionClosed):
+        (InProcessIDBServer::abortOpenAndUpgradeNeeded):
+        (InProcessIDBServer::didFireVersionChangeEvent):
+        (InProcessIDBServer::openDBRequestCancelled):
+        (InProcessIDBServer::getAllDatabaseNamesAndVersions):
+        (InProcessIDBServer::closeAndDeleteDatabasesModifiedSince):
+        * Storage/InProcessIDBServer.h:
+
 2021-04-08  Sihui Liu  <sihui_...@apple.com>
 
         Remove logging for investigating http/tests/IndexedDB/storage-limit-1.html failure

Modified: trunk/Source/WebKitLegacy/Storage/InProcessIDBServer.cpp (275890 => 275891)


--- trunk/Source/WebKitLegacy/Storage/InProcessIDBServer.cpp	2021-04-13 16:50:41 UTC (rev 275890)
+++ trunk/Source/WebKitLegacy/Storage/InProcessIDBServer.cpp	2021-04-13 16:53:46 UTC (rev 275891)
@@ -96,9 +96,9 @@
     m_thread->start();
     dispatchTask([this, protectedThis = makeRef(*this), sessionID, directory = databaseDirectoryPath.isolatedCopy(), spaceRequester = storageQuotaManagerSpaceRequester(*this)] () mutable {
         m_connectionToClient = IDBServer::IDBConnectionToClient::create(*this);
-        m_server = makeUnique<IDBServer::IDBServer>(sessionID, directory, WTFMove(spaceRequester));
 
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
+        m_server = makeUnique<IDBServer::IDBServer>(sessionID, directory, WTFMove(spaceRequester), m_serverLock);
         m_server->registerConnection(*m_connectionToClient);
     });
 }
@@ -123,7 +123,7 @@
 void InProcessIDBServer::deleteDatabase(const WebCore::IDBRequestData& requestData)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->deleteDatabase(requestData);
     });
 }
@@ -138,7 +138,7 @@
 void InProcessIDBServer::openDatabase(const WebCore::IDBRequestData& requestData)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->openDatabase(requestData);
     });
 }
@@ -265,7 +265,7 @@
 void InProcessIDBServer::abortTransaction(const WebCore::IDBResourceIdentifier& resourceIdentifier)
 {
     dispatchTask([this, protectedThis = makeRef(*this), resourceIdentifier = resourceIdentifier.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->abortTransaction(resourceIdentifier);
     });
 }
@@ -273,7 +273,7 @@
 void InProcessIDBServer::commitTransaction(const WebCore::IDBResourceIdentifier& resourceIdentifier)
 {
     dispatchTask([this, protectedThis = makeRef(*this), resourceIdentifier = resourceIdentifier.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->commitTransaction(resourceIdentifier);
     });
 }
@@ -281,7 +281,7 @@
 void InProcessIDBServer::didFinishHandlingVersionChangeTransaction(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& transactionIdentifier)
 {
     dispatchTask([this, protectedThis = makeRef(*this), databaseConnectionIdentifier, transactionIdentifier = transactionIdentifier.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->didFinishHandlingVersionChangeTransaction(databaseConnectionIdentifier, transactionIdentifier);
     });
 }
@@ -289,7 +289,7 @@
 void InProcessIDBServer::createObjectStore(const WebCore::IDBRequestData& resultData, const IDBObjectStoreInfo& info)
 {
     dispatchTask([this, protectedThis = makeRef(*this), resultData = resultData.isolatedCopy(), info = info.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->createObjectStore(resultData, info);
     });
 }
@@ -297,7 +297,7 @@
 void InProcessIDBServer::deleteObjectStore(const WebCore::IDBRequestData& requestData, const String& objectStoreName)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), objectStoreName = objectStoreName.isolatedCopy()] () mutable {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->deleteObjectStore(requestData, objectStoreName);
     });
 }
@@ -305,7 +305,7 @@
 void InProcessIDBServer::renameObjectStore(const WebCore::IDBRequestData& requestData, uint64_t objectStoreIdentifier, const String& newName)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), objectStoreIdentifier, newName = newName.isolatedCopy()] () mutable {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->renameObjectStore(requestData, objectStoreIdentifier, newName);
     });
 }
@@ -313,7 +313,7 @@
 void InProcessIDBServer::clearObjectStore(const WebCore::IDBRequestData& requestData, uint64_t objectStoreIdentifier)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), objectStoreIdentifier] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->clearObjectStore(requestData, objectStoreIdentifier);
     });
 }
@@ -321,7 +321,7 @@
 void InProcessIDBServer::createIndex(const WebCore::IDBRequestData& requestData, const IDBIndexInfo& info)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), info = info.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->createIndex(requestData, info);
     });
 }
@@ -329,7 +329,7 @@
 void InProcessIDBServer::deleteIndex(const WebCore::IDBRequestData& requestData, uint64_t objectStoreIdentifier, const String& indexName)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), objectStoreIdentifier, indexName = indexName.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->deleteIndex(requestData, objectStoreIdentifier, indexName);
     });
 }
@@ -337,7 +337,7 @@
 void InProcessIDBServer::renameIndex(const WebCore::IDBRequestData& requestData, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), objectStoreIdentifier, indexIdentifier, newName = newName.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->renameIndex(requestData, objectStoreIdentifier, indexIdentifier, newName);
     });
 }
@@ -345,7 +345,7 @@
 void InProcessIDBServer::putOrAdd(const WebCore::IDBRequestData& requestData, const IDBKeyData& keyData, const IDBValue& value, const IndexedDB::ObjectStoreOverwriteMode overwriteMode)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), keyData = keyData.isolatedCopy(), value = value.isolatedCopy(), overwriteMode] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->putOrAdd(requestData, keyData, value, overwriteMode);
     });
 }
@@ -353,7 +353,7 @@
 void InProcessIDBServer::getRecord(const WebCore::IDBRequestData& requestData, const IDBGetRecordData& getRecordData)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), getRecordData = getRecordData.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->getRecord(requestData, getRecordData);
     });
 }
@@ -361,7 +361,7 @@
 void InProcessIDBServer::getAllRecords(const WebCore::IDBRequestData& requestData, const IDBGetAllRecordsData& getAllRecordsData)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), getAllRecordsData = getAllRecordsData.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->getAllRecords(requestData, getAllRecordsData);
     });
 }
@@ -369,7 +369,7 @@
 void InProcessIDBServer::getCount(const WebCore::IDBRequestData& requestData, const IDBKeyRangeData& keyRangeData)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), keyRangeData = keyRangeData.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->getCount(requestData, keyRangeData);
     });
 }
@@ -377,7 +377,7 @@
 void InProcessIDBServer::deleteRecord(const WebCore::IDBRequestData& requestData, const IDBKeyRangeData& keyRangeData)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), keyRangeData = keyRangeData.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->deleteRecord(requestData, keyRangeData);
     });
 }
@@ -385,7 +385,7 @@
 void InProcessIDBServer::openCursor(const WebCore::IDBRequestData& requestData, const IDBCursorInfo& info)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), info = info.isolatedCopy()] () mutable {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->openCursor(requestData, info);
     });
 }
@@ -393,7 +393,7 @@
 void InProcessIDBServer::iterateCursor(const WebCore::IDBRequestData& requestData, const IDBIterateCursorData& data)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy(), data = "" {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->iterateCursor(requestData, data);
     });
 }
@@ -401,7 +401,7 @@
 void InProcessIDBServer::establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo& info)
 {
     dispatchTask([this, protectedThis = makeRef(*this), databaseConnectionIdentifier, info = info.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->establishTransaction(databaseConnectionIdentifier, info);
     });
 }
@@ -437,7 +437,7 @@
 void InProcessIDBServer::databaseConnectionPendingClose(uint64_t databaseConnectionIdentifier)
 {
     dispatchTask([this, protectedThis = makeRef(*this), databaseConnectionIdentifier] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->databaseConnectionPendingClose(databaseConnectionIdentifier);
     });
 }
@@ -445,7 +445,7 @@
 void InProcessIDBServer::databaseConnectionClosed(uint64_t databaseConnectionIdentifier)
 {
     dispatchTask([this, protectedThis = makeRef(*this), databaseConnectionIdentifier] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->databaseConnectionClosed(databaseConnectionIdentifier);
     });
 }
@@ -453,7 +453,7 @@
 void InProcessIDBServer::abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& transactionIdentifier)
 {
     dispatchTask([this, protectedThis = makeRef(*this), databaseConnectionIdentifier, transactionIdentifier = transactionIdentifier.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->abortOpenAndUpgradeNeeded(databaseConnectionIdentifier, transactionIdentifier);
     });
 }
@@ -461,7 +461,7 @@
 void InProcessIDBServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& requestIdentifier, const IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosed)
 {
     dispatchTask([this, protectedThis = makeRef(*this), databaseConnectionIdentifier, requestIdentifier = requestIdentifier.isolatedCopy(), connectionClosed] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, connectionClosed);
     });
 }
@@ -469,7 +469,7 @@
 void InProcessIDBServer::openDBRequestCancelled(const WebCore::IDBRequestData& requestData)
 {
     dispatchTask([this, protectedThis = makeRef(*this), requestData = requestData.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->openDBRequestCancelled(requestData);
     });
 }
@@ -477,7 +477,7 @@
 void InProcessIDBServer::getAllDatabaseNamesAndVersions(const WebCore::IDBResourceIdentifier& requestIdentifier, const ClientOrigin& origin)
 {
     dispatchTask([this, protectedThis = makeRef(*this), identifier = m_connectionToServer->identifier(), requestIdentifier, origin = origin.isolatedCopy()] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->getAllDatabaseNamesAndVersions(identifier, requestIdentifier, origin);
     });
 }
@@ -492,7 +492,7 @@
 void InProcessIDBServer::closeAndDeleteDatabasesModifiedSince(WallTime modificationTime)
 {
     dispatchTask([this, protectedThis = makeRef(*this), modificationTime] {
-        LockHolder locker(m_server->lock());
+        LockHolder locker(m_serverLock);
         m_server->closeAndDeleteDatabasesModifiedSince(modificationTime);
     });
 }

Modified: trunk/Source/WebKitLegacy/Storage/InProcessIDBServer.h (275890 => 275891)


--- trunk/Source/WebKitLegacy/Storage/InProcessIDBServer.h	2021-04-13 16:50:41 UTC (rev 275890)
+++ trunk/Source/WebKitLegacy/Storage/InProcessIDBServer.h	2021-04-13 16:53:46 UTC (rev 275891)
@@ -126,6 +126,7 @@
 private:
     InProcessIDBServer(PAL::SessionID, const String& databaseDirectoryPath = nullString());
 
+    Lock m_serverLock;
     std::unique_ptr<WebCore::IDBServer::IDBServer> m_server;
     RefPtr<WebCore::IDBClient::IDBConnectionToServer> m_connectionToServer;
     RefPtr<WebCore::IDBServer::IDBConnectionToClient> m_connectionToClient;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to