Changeset 242555 in webkit
- Timestamp:
- Mar 6, 2019 11:20:53 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r242534 r242555 1 2019-03-06 Sihui Liu <sihui_liu@apple.com> 2 3 Assertion Failed: m_databaseQueue.isKilled() in UniqueIDBDatabase::~UniqueIDBDatabase() 4 https://bugs.webkit.org/show_bug.cgi?id=195073 5 <rdar://problem/48285200> 6 7 Reviewed by Geoffrey Garen. 8 9 r240931 removed a retain cycle between IDBConnectionToServer and IDBConnectionToServerDelegate, so 10 IDBConnectionToServerDelegate, or InProcessIDBServer would not live forever. When IDBDatabase is gone, 11 InProcessIDBServer would schedule a notifification to IDBServer with databaseConnectionClosed. IDBServer would 12 then notify UniqueIDBDatabase. When UniqueIDBDatabase finds all database connections are gone, it would acquires 13 its only reference pointer from IDBServer schedule and perform a shutdown that kills its database task queue. 14 15 The assertion failure tells us UniqueIDBDatabase was destructed at when IDBServer was destructed, which means 16 UniqueIDBDatabase had not acquired its pointer. It's probably because UniqueIDBDatabase had unfinished tasks or 17 the operation timer function had not been executed. Since UniqueIDBDatabase needs to complete shutdown process, 18 we should make IDBServer live as long as UniqueIDBDatabase by keeping a reference pointer of IDBServer in 19 UniqueIDBDatabase. 20 21 * Modules/indexeddb/server/UniqueIDBDatabase.cpp: 22 (WebCore::IDBServer::UniqueIDBDatabase::UniqueIDBDatabase): 23 (WebCore::IDBServer::UniqueIDBDatabase::deleteBackingStore): 24 (WebCore::IDBServer::UniqueIDBDatabase::scheduleShutdownForClose): 25 (WebCore::IDBServer::UniqueIDBDatabase::openBackingStore): 26 (WebCore::IDBServer::UniqueIDBDatabase::postDatabaseTask): 27 (WebCore::IDBServer::UniqueIDBDatabase::postDatabaseTaskReply): 28 (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): 29 (WebCore::IDBServer::UniqueIDBDatabase::notifyServerAboutClose): 30 * Modules/indexeddb/server/UniqueIDBDatabase.h: 31 (WebCore::IDBServer::UniqueIDBDatabase::server): 32 1 33 2019-03-06 Rob Buis <rbuis@igalia.com> 2 34 -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp
r242136 r242555 56 56 57 57 UniqueIDBDatabase::UniqueIDBDatabase(IDBServer& server, const IDBDatabaseIdentifier& identifier) 58 : m_server( server)58 : m_server(&server) 59 59 , m_identifier(identifier) 60 60 , m_operationAndTransactionTimer(*this, &UniqueIDBDatabase::operationAndTransactionTimerFired) … … 246 246 m_backingStoreIsEphemeral = false; 247 247 } else { 248 auto backingStore = m_server .createBackingStore(identifier);248 auto backingStore = m_server->createBackingStore(identifier); 249 249 250 250 IDBDatabaseInfo databaseInfo; … … 278 278 279 279 RELEASE_ASSERT(!m_owningPointerForClose); 280 m_owningPointerForClose = m_server .closeAndTakeUniqueIDBDatabase(*this);280 m_owningPointerForClose = m_server->closeAndTakeUniqueIDBDatabase(*this); 281 281 282 282 notifyServerAboutClose(CloseState::Start); … … 637 637 638 638 ASSERT(!m_backingStore); 639 m_backingStore = m_server .createBackingStore(identifier);639 m_backingStore = m_server->createBackingStore(identifier); 640 640 m_backingStoreSupportsSimultaneousTransactions = m_backingStore->supportsSimultaneousTransactions(); 641 641 m_backingStoreIsEphemeral = m_backingStore->isEphemeral(); … … 1764 1764 { 1765 1765 m_databaseQueue.append(WTFMove(task)); 1766 m_server .postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::executeNextDatabaseTask));1766 m_server->postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::executeNextDatabaseTask)); 1767 1767 } 1768 1768 … … 1770 1770 { 1771 1771 m_databaseReplyQueue.append(WTFMove(task)); 1772 m_server .postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::executeNextDatabaseTaskReply));1772 m_server->postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::executeNextDatabaseTaskReply)); 1773 1773 } 1774 1774 … … 1899 1899 // Otherwise, this database is still potentially active. 1900 1900 // So we'll have it own itself and then perform a clean unconditional delete on the background thread. 1901 m_owningPointerForClose = m_server .closeAndTakeUniqueIDBDatabase(*this);1901 m_owningPointerForClose = m_server->closeAndTakeUniqueIDBDatabase(*this); 1902 1902 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performUnconditionalDeleteBackingStore)); 1903 1903 } … … 1977 1977 #if PLATFORM(IOS_FAMILY) 1978 1978 if (state == CloseState::Start) 1979 m_server .closeDatabase(this);1979 m_server->closeDatabase(this); 1980 1980 else 1981 m_server .didCloseDatabase(this);1981 m_server->didCloseDatabase(this); 1982 1982 #else 1983 1983 UNUSED_PARAM(state); -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h
r242136 r242555 83 83 84 84 const IDBDatabaseInfo& info() const; 85 IDBServer& server() { return m_server; }85 IDBServer& server() { return *m_server; } 86 86 const IDBDatabaseIdentifier& identifier() const { return m_identifier; } 87 87 … … 230 230 void notifyServerAboutClose(CloseState); 231 231 232 IDBServer&m_server;232 RefPtr<IDBServer> m_server; 233 233 IDBDatabaseIdentifier m_identifier; 234 234
Note: See TracChangeset
for help on using the changeset viewer.