Title: [197057] trunk/Source/WebCore
- Revision
- 197057
- Author
- beid...@apple.com
- Date
- 2016-02-24 16:23:38 -0800 (Wed, 24 Feb 2016)
Log Message
Modern IDB: Some w3c objectstore tests crash under GuardMalloc.
https://bugs.webkit.org/show_bug.cgi?id=154460
Reviewed by Alex Christensen.
No new tests (Covered by existing tests).
* Modules/indexeddb/server/UniqueIDBDatabase.cpp:
(WebCore::IDBServer::UniqueIDBDatabase::~UniqueIDBDatabase):
(WebCore::IDBServer::UniqueIDBDatabase::performCurrentDeleteOperation):
(WebCore::IDBServer::UniqueIDBDatabase::didDeleteBackingStore): Don't delete the UniqueIDBDatabase yet
if there are still any connections pending close.
(WebCore::IDBServer::UniqueIDBDatabase::didPerformCommitTransaction):
(WebCore::IDBServer::UniqueIDBDatabase::didPerformAbortTransaction):
(WebCore::IDBServer::UniqueIDBDatabase::inProgressTransactionCompleted): It's possible that with this
transaction completing, and a connection finished its close process, that the UniqueIDBDatabase is
now ready to be deleted.
* Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp:
(WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback):
* Modules/indexeddb/server/UniqueIDBDatabaseConnection.h:
* Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp:
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::abortWithoutCallback):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (197056 => 197057)
--- trunk/Source/WebCore/ChangeLog 2016-02-24 23:47:25 UTC (rev 197056)
+++ trunk/Source/WebCore/ChangeLog 2016-02-25 00:23:38 UTC (rev 197057)
@@ -1,3 +1,30 @@
+2016-02-24 Brady Eidson <beid...@apple.com>
+
+ Modern IDB: Some w3c objectstore tests crash under GuardMalloc.
+ https://bugs.webkit.org/show_bug.cgi?id=154460
+
+ Reviewed by Alex Christensen.
+
+ No new tests (Covered by existing tests).
+
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::~UniqueIDBDatabase):
+ (WebCore::IDBServer::UniqueIDBDatabase::performCurrentDeleteOperation):
+ (WebCore::IDBServer::UniqueIDBDatabase::didDeleteBackingStore): Don't delete the UniqueIDBDatabase yet
+ if there are still any connections pending close.
+ (WebCore::IDBServer::UniqueIDBDatabase::didPerformCommitTransaction):
+ (WebCore::IDBServer::UniqueIDBDatabase::didPerformAbortTransaction):
+ (WebCore::IDBServer::UniqueIDBDatabase::inProgressTransactionCompleted): It's possible that with this
+ transaction completing, and a connection finished its close process, that the UniqueIDBDatabase is
+ now ready to be deleted.
+
+ * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback):
+ * Modules/indexeddb/server/UniqueIDBDatabaseConnection.h:
+
+ * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abortWithoutCallback):
+
2016-02-24 Konstantin Tokarev <annu...@yandex.ru>
[cmake] Moved PRE/POST_BUILD_COMMAND to WEBKIT_FRAMEWORK.
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (197056 => 197057)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2016-02-24 23:47:25 UTC (rev 197056)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2016-02-25 00:23:38 UTC (rev 197057)
@@ -59,6 +59,7 @@
ASSERT(m_inProgressTransactions.isEmpty());
ASSERT(m_pendingTransactions.isEmpty());
ASSERT(m_openDatabaseConnections.isEmpty());
+ ASSERT(m_closePendingDatabaseConnections.isEmpty());
}
const IDBDatabaseInfo& UniqueIDBDatabase::info() const
@@ -181,12 +182,8 @@
return;
}
- // Even though we have no open database connections, we might have close-pending database connections
- // that are waiting on transactions to complete.
- if (!m_inProgressTransactions.isEmpty()) {
- ASSERT(!m_closePendingDatabaseConnections.isEmpty());
+ if (!m_inProgressTransactions.isEmpty())
return;
- }
ASSERT(!hasAnyPendingCallbacks());
ASSERT(m_pendingTransactions.isEmpty());
@@ -241,10 +238,12 @@
m_deletePending = false;
m_deleteBackingStoreInProgress = false;
- if (m_pendingOpenDBRequests.isEmpty())
- m_server.deleteUniqueIDBDatabase(*this);
- else
- invokeOperationAndTransactionTimer();
+ if (m_closePendingDatabaseConnections.isEmpty()) {
+ if (m_pendingOpenDBRequests.isEmpty())
+ m_server.deleteUniqueIDBDatabase(*this);
+ else
+ invokeOperationAndTransactionTimer();
+ }
}
void UniqueIDBDatabase::handleDatabaseOperations()
@@ -978,9 +977,9 @@
ASSERT(isMainThread());
LOG(IndexedDB, "(main) UniqueIDBDatabase::didPerformCommitTransaction");
+ performErrorCallback(callbackIdentifier, error);
+
inProgressTransactionCompleted(transactionIdentifier);
-
- performErrorCallback(callbackIdentifier, error);
}
void UniqueIDBDatabase::abortTransaction(UniqueIDBDatabaseTransaction& transaction, ErrorCallback callback)
@@ -1028,9 +1027,9 @@
m_databaseInfo = std::make_unique<IDBDatabaseInfo>(*m_versionChangeTransaction->originalDatabaseInfo());
}
+ performErrorCallback(callbackIdentifier, error);
+
inProgressTransactionCompleted(transactionIdentifier);
-
- performErrorCallback(callbackIdentifier, error);
}
void UniqueIDBDatabase::transactionDestroyed(UniqueIDBDatabaseTransaction& transaction)
@@ -1244,6 +1243,13 @@
if (!transaction->databaseConnection().hasNonFinishedTransactions())
m_closePendingDatabaseConnections.remove(&transaction->databaseConnection());
+ // It's possible that this database had its backing store deleted but there were a few outstanding asynchronous operations.
+ // If this transaction completing was the last of those operations, we can finally delete this UniqueIDBDatabase.
+ if (m_closePendingDatabaseConnections.isEmpty() && m_pendingOpenDBRequests.isEmpty() && !m_databaseInfo) {
+ m_server.deleteUniqueIDBDatabase(*this);
+ return;
+ }
+
// Previously blocked operations might be runnable.
invokeOperationAndTransactionTimer();
}
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp (197056 => 197057)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp 2016-02-24 23:47:25 UTC (rev 197056)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp 2016-02-25 00:23:38 UTC (rev 197057)
@@ -66,6 +66,14 @@
return !m_transactionMap.isEmpty();
}
+void UniqueIDBDatabaseConnection::abortTransactionWithoutCallback(UniqueIDBDatabaseTransaction& transaction)
+{
+ ASSERT(m_transactionMap.contains(transaction.info().identifier()));
+ auto takenTransaction = m_transactionMap.take(transaction.info().identifier());
+
+ m_database.abortTransaction(*takenTransaction, [](const IDBError&) { });
+}
+
void UniqueIDBDatabaseConnection::connectionClosedFromClient()
{
LOG(IndexedDB, "UniqueIDBDatabaseConnection::connectionClosedFromClient - %" PRIu64, m_identifier);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h (197056 => 197057)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h 2016-02-24 23:47:25 UTC (rev 197056)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h 2016-02-25 00:23:38 UTC (rev 197057)
@@ -73,6 +73,8 @@
void didDeleteIndex(const IDBResultData&);
void didFireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier);
+ void abortTransactionWithoutCallback(UniqueIDBDatabaseTransaction&);
+
private:
UniqueIDBDatabaseConnection(UniqueIDBDatabase&, IDBConnectionToClient&);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp (197056 => 197057)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp 2016-02-24 23:47:25 UTC (rev 197056)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp 2016-02-25 00:23:38 UTC (rev 197057)
@@ -79,7 +79,7 @@
{
LOG(IndexedDB, "UniqueIDBDatabaseTransaction::abortWithoutCallback");
- m_databaseConnection->database().abortTransaction(*this, [](const IDBError&) { });
+ m_databaseConnection->abortTransactionWithoutCallback(*this);
}
bool UniqueIDBDatabaseTransaction::isVersionChange() const
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes