Changeset 129076 in webkit
- Timestamp:
- Sep 19, 2012 5:12:51 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r129074 r129076 1 2012-09-19 Joshua Bell <jsbell@chromium.org> 2 3 IndexedDB: Pending call cleanup 4 https://bugs.webkit.org/show_bug.cgi?id=96952 5 6 Reviewed by Tony Chang. 7 8 Replace RefPtr usage with OwnPtr for PendingXXXCalls (since they're never referenced twice) 9 and replace queue of "second half open" calls with a single item. 10 11 No new tests - no functional changes. 12 13 * Modules/indexeddb/IDBDatabaseBackendImpl.cpp: 14 (WebCore::IDBDatabaseBackendImpl::PendingOpenCall::create): 15 (WebCore::IDBDatabaseBackendImpl::PendingOpenWithVersionCall::create): 16 (WebCore::IDBDatabaseBackendImpl::PendingDeleteCall::create): 17 (WebCore::IDBDatabaseBackendImpl::PendingSetVersionCall::create): 18 (WebCore::IDBDatabaseBackendImpl::setVersion): 19 (WebCore::IDBDatabaseBackendImpl::transactionFinishedAndAbortFired): 20 (WebCore::IDBDatabaseBackendImpl::processPendingCalls): 21 (WebCore::IDBDatabaseBackendImpl::runIntVersionChangeTransaction): 22 (WebCore::IDBDatabaseBackendImpl::close): 23 * Modules/indexeddb/IDBDatabaseBackendImpl.h: 24 (IDBDatabaseBackendImpl): 25 1 26 2012-09-19 Kenichi Ishibashi <bashi@chromium.org> 2 27 -
trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp
r129066 r129076 40 40 namespace WebCore { 41 41 42 class IDBDatabaseBackendImpl::PendingOpenCall : public RefCounted<PendingOpenCall>{42 class IDBDatabaseBackendImpl::PendingOpenCall { 43 43 public: 44 static Pass RefPtr<PendingOpenCall> create(PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks)45 { 46 return adopt Ref(new PendingOpenCall(callbacks, databaseCallbacks));44 static PassOwnPtr<PendingOpenCall> create(PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks) 45 { 46 return adoptPtr(new PendingOpenCall(callbacks, databaseCallbacks)); 47 47 } 48 48 PassRefPtr<IDBCallbacks> callbacks() { return m_callbacks; } … … 60 60 }; 61 61 62 class IDBDatabaseBackendImpl::PendingOpenWithVersionCall : public RefCounted<PendingOpenWithVersionCall>{62 class IDBDatabaseBackendImpl::PendingOpenWithVersionCall { 63 63 public: 64 static Pass RefPtr<PendingOpenWithVersionCall> create(PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks, int64_t version)65 { 66 return adopt Ref(new PendingOpenWithVersionCall(callbacks, databaseCallbacks, version));64 static PassOwnPtr<PendingOpenWithVersionCall> create(PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks, int64_t version) 65 { 66 return adoptPtr(new PendingOpenWithVersionCall(callbacks, databaseCallbacks, version)); 67 67 } 68 68 PassRefPtr<IDBCallbacks> callbacks() { return m_callbacks; } … … 82 82 }; 83 83 84 class IDBDatabaseBackendImpl::PendingDeleteCall : public RefCounted<PendingDeleteCall>{84 class IDBDatabaseBackendImpl::PendingDeleteCall { 85 85 public: 86 static Pass RefPtr<PendingDeleteCall> create(PassRefPtr<IDBCallbacks> callbacks)87 { 88 return adopt Ref(new PendingDeleteCall(callbacks));86 static PassOwnPtr<PendingDeleteCall> create(PassRefPtr<IDBCallbacks> callbacks) 87 { 88 return adoptPtr(new PendingDeleteCall(callbacks)); 89 89 } 90 90 PassRefPtr<IDBCallbacks> callbacks() { return m_callbacks; } … … 98 98 }; 99 99 100 class IDBDatabaseBackendImpl::PendingSetVersionCall : public RefCounted<PendingSetVersionCall>{100 class IDBDatabaseBackendImpl::PendingSetVersionCall { 101 101 public: 102 static Pass RefPtr<PendingSetVersionCall> create(const String& version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks)103 { 104 return adopt Ref(new PendingSetVersionCall(version, callbacks, databaseCallbacks));102 static PassOwnPtr<PendingSetVersionCall> create(const String& version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks) 103 { 104 return adoptPtr(new PendingSetVersionCall(version, callbacks, databaseCallbacks)); 105 105 } 106 106 String version() { return m_version; } … … 255 255 if (connectionCount() > 1) { 256 256 callbacks->onBlocked(); 257 RefPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionCall::create(version, callbacks, databaseCallbacks);258 m_pendingSetVersionCalls.append(pendingSetVersionCall );257 OwnPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionCall::create(version, callbacks, databaseCallbacks); 258 m_pendingSetVersionCalls.append(pendingSetVersionCall.release()); 259 259 return; 260 260 } 261 261 if (m_runningVersionChangeTransaction) { 262 RefPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionCall::create(version, callbacks, databaseCallbacks);263 m_pendingSetVersionCalls.append(pendingSetVersionCall );262 OwnPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionCall::create(version, callbacks, databaseCallbacks); 263 m_pendingSetVersionCalls.append(pendingSetVersionCall.release()); 264 264 return; 265 265 } … … 335 335 // half" open call waiting for us in processPendingCalls. 336 336 // FIXME: When we no longer support setVersion, assert such a thing. 337 if (m_pendingSecondHalfOpenWithVersion Calls.size() == 1) {338 RefPtr<PendingOpenWithVersionCall> pendingOpenWithVersionCall = m_pendingSecondHalfOpenWithVersionCalls.takeFirst();339 pendingOpenWithVersionCall->callbacks()->onError(IDBDatabaseError::create(IDBDatabaseException::IDB_ABORT_ERR, "Version change transaction was aborted in upgradeneeded event handler."));337 if (m_pendingSecondHalfOpenWithVersion) { 338 m_pendingSecondHalfOpenWithVersion->callbacks()->onError(IDBDatabaseError::create(IDBDatabaseException::IDB_ABORT_ERR, "Version change transaction was aborted in upgradeneeded event handler.")); 339 m_pendingSecondHalfOpenWithVersion.release(); 340 340 } 341 341 processPendingCalls(); … … 358 358 void IDBDatabaseBackendImpl::processPendingCalls() 359 359 { 360 // FIXME: Change from queue to just a single place holder. 361 ASSERT(m_pendingSecondHalfOpenWithVersionCalls.size() <= 1); 362 while (!m_pendingSecondHalfOpenWithVersionCalls.isEmpty()) { 363 RefPtr<PendingOpenWithVersionCall> pendingOpenWithVersionCall = m_pendingSecondHalfOpenWithVersionCalls.takeFirst(); 364 ASSERT(pendingOpenWithVersionCall->version() == m_intVersion); 360 if (m_pendingSecondHalfOpenWithVersion) { 361 ASSERT(m_pendingSecondHalfOpenWithVersion->version() == m_intVersion); 365 362 ASSERT(m_id != InvalidId); 366 pendingOpenWithVersionCall->callbacks()->onSuccess(this); 363 m_pendingSecondHalfOpenWithVersion->callbacks()->onSuccess(this); 364 m_pendingSecondHalfOpenWithVersion.release(); 367 365 // Fall through when complete, as pending deletes may be (partially) unblocked. 368 366 } 369 367 370 368 // Pending calls may be requeued or aborted 371 Deque< RefPtr<PendingSetVersionCall> > pendingSetVersionCalls;369 Deque<OwnPtr<PendingSetVersionCall> > pendingSetVersionCalls; 372 370 m_pendingSetVersionCalls.swap(pendingSetVersionCalls); 373 371 while (!pendingSetVersionCalls.isEmpty()) { 374 372 ExceptionCode ec = 0; 375 RefPtr<PendingSetVersionCall> pendingSetVersionCall = pendingSetVersionCalls.takeFirst();373 OwnPtr<PendingSetVersionCall> pendingSetVersionCall = pendingSetVersionCalls.takeFirst(); 376 374 setVersion(pendingSetVersionCall->version(), pendingSetVersionCall->callbacks(), pendingSetVersionCall->databaseCallbacks(), ec); 377 375 ASSERT(!ec); … … 393 391 394 392 // Pending calls may be requeued. 395 Deque< RefPtr<PendingDeleteCall> > pendingDeleteCalls;393 Deque<OwnPtr<PendingDeleteCall> > pendingDeleteCalls; 396 394 m_pendingDeleteCalls.swap(pendingDeleteCalls); 397 395 while (!pendingDeleteCalls.isEmpty()) { 398 RefPtr<PendingDeleteCall> pendingDeleteCall = pendingDeleteCalls.takeFirst();396 OwnPtr<PendingDeleteCall> pendingDeleteCall = pendingDeleteCalls.takeFirst(); 399 397 deleteDatabase(pendingDeleteCall->callbacks()); 400 398 } … … 404 402 return; 405 403 406 Deque< RefPtr<PendingOpenWithVersionCall> > pendingOpenWithVersionCalls;404 Deque<OwnPtr<PendingOpenWithVersionCall> > pendingOpenWithVersionCalls; 407 405 m_pendingOpenWithVersionCalls.swap(pendingOpenWithVersionCalls); 408 406 while (!pendingOpenWithVersionCalls.isEmpty()) { 409 RefPtr<PendingOpenWithVersionCall> pendingOpenWithVersionCall = pendingOpenWithVersionCalls.takeFirst();407 OwnPtr<PendingOpenWithVersionCall> pendingOpenWithVersionCall = pendingOpenWithVersionCalls.takeFirst(); 410 408 openConnectionWithVersion(pendingOpenWithVersionCall->callbacks(), pendingOpenWithVersionCall->databaseCallbacks(), pendingOpenWithVersionCall->version()); 411 409 } … … 413 411 // Given the check above, it appears that calls cannot be requeued by 414 412 // openConnection, but use a different queue for iteration to be safe. 415 Deque< RefPtr<PendingOpenCall> > pendingOpenCalls;413 Deque<OwnPtr<PendingOpenCall> > pendingOpenCalls; 416 414 m_pendingOpenCalls.swap(pendingOpenCalls); 417 415 while (!pendingOpenCalls.isEmpty()) { 418 RefPtr<PendingOpenCall> pendingOpenCall = pendingOpenCalls.takeFirst();416 OwnPtr<PendingOpenCall> pendingOpenCall = pendingOpenCalls.takeFirst(); 419 417 openConnection(pendingOpenCall->callbacks(), pendingOpenCall->databaseCallbacks()); 420 418 } … … 497 495 ec = IDBDatabaseException::TRANSACTION_INACTIVE_ERR; 498 496 } 499 ASSERT _WITH_MESSAGE(!m_pendingSecondHalfOpenWithVersionCalls.size(), "m_pendingSecondHalfOpenWithVersionCalls.size = %zu", m_pendingSecondHalfOpenWithVersionCalls.size());500 m_pendingSecondHalfOpenWithVersion Calls.append(PendingOpenWithVersionCall::create(callbacks, databaseCallbacks, requestedVersion));497 ASSERT(!m_pendingSecondHalfOpenWithVersion); 498 m_pendingSecondHalfOpenWithVersion = PendingOpenWithVersionCall::create(callbacks, databaseCallbacks, requestedVersion); 501 499 m_databaseCallbacksSet.add(databaseCallbacks); 502 500 } … … 568 566 569 567 m_databaseCallbacksSet.remove(callbacks); 570 for (Deque<RefPtr<PendingOpenWithVersionCall> >::iterator it = m_pendingSecondHalfOpenWithVersionCalls.begin(); it != m_pendingSecondHalfOpenWithVersionCalls.end(); ++it) { 571 if ((*it)->databaseCallbacks() == callbacks) { 572 (*it)->callbacks()->onError(IDBDatabaseError::create(IDBDatabaseException::IDB_ABORT_ERR, "The connection was closed.")); 573 m_pendingSecondHalfOpenWithVersionCalls.remove(it); 574 break; 575 } 568 if (m_pendingSecondHalfOpenWithVersion && m_pendingSecondHalfOpenWithVersion->databaseCallbacks() == callbacks) { 569 m_pendingSecondHalfOpenWithVersion->callbacks()->onError(IDBDatabaseError::create(IDBDatabaseException::IDB_ABORT_ERR, "The connection was closed.")); 570 m_pendingSecondHalfOpenWithVersion.release(); 576 571 } 577 572 -
trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.h
r129066 r129076 114 114 115 115 class PendingSetVersionCall; 116 Deque< RefPtr<PendingSetVersionCall> > m_pendingSetVersionCalls;116 Deque<OwnPtr<PendingSetVersionCall> > m_pendingSetVersionCalls; 117 117 118 118 class PendingOpenCall; 119 Deque< RefPtr<PendingOpenCall> > m_pendingOpenCalls;119 Deque<OwnPtr<PendingOpenCall> > m_pendingOpenCalls; 120 120 121 121 class PendingOpenWithVersionCall; 122 Deque< RefPtr<PendingOpenWithVersionCall> > m_pendingOpenWithVersionCalls;123 Deque<RefPtr<PendingOpenWithVersionCall> > m_pendingSecondHalfOpenWithVersionCalls;122 Deque<OwnPtr<PendingOpenWithVersionCall> > m_pendingOpenWithVersionCalls; 123 OwnPtr<PendingOpenWithVersionCall> m_pendingSecondHalfOpenWithVersion; 124 124 125 125 class PendingDeleteCall; 126 Deque< RefPtr<PendingDeleteCall> > m_pendingDeleteCalls;126 Deque<OwnPtr<PendingDeleteCall> > m_pendingDeleteCalls; 127 127 128 128 typedef ListHashSet<RefPtr<IDBDatabaseCallbacks> > DatabaseCallbacksSet;
Note: See TracChangeset
for help on using the changeset viewer.