Changeset 57286 in webkit
- Timestamp:
- Apr 8, 2010 11:40:00 AM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r57283 r57286 1 2010-03-30 Dumitru Daniliuc <dumi@chromium.org> 2 3 Reviewed by Dimitri Glazkov. 4 5 Refactor DatabaseTracker, part 1: Remove the dependency on 6 OriginQuotaManager from DatabaseTracker.h. 7 8 https://bugs.webkit.org/show_bug.cgi?id=31482 9 10 * storage/DatabaseTracker.cpp: 11 (originQuotaManager): 12 (WebCore::DatabaseTracker::DatabaseTracker): 13 (WebCore::DatabaseTracker::canEstablishDatabase): 14 (WebCore::DatabaseTracker::hasEntryForOrigin): 15 (WebCore::DatabaseTracker::getMaxSizeForDatabase): 16 (WebCore::DatabaseTracker::databaseChanged): 17 (WebCore::DatabaseTracker::fullPathForDatabaseNoLock): 18 (WebCore::DatabaseTracker::fullPathForDatabase): 19 (WebCore::DatabaseTracker::populateOrigins): 20 (WebCore::DatabaseTracker::origins): 21 (WebCore::DatabaseTracker::databaseNamesForOrigin): 22 (WebCore::DatabaseTracker::removeOpenDatabase): 23 (WebCore::DatabaseTracker::usageForOriginNoLock): 24 (WebCore::DatabaseTracker::usageForOrigin): 25 (WebCore::DatabaseTracker::quotaForOrigin): 26 (WebCore::DatabaseTracker::setQuota): 27 (WebCore::DatabaseTracker::deleteOrigin): 28 (WebCore::DatabaseTracker::deleteDatabase): 29 (WebCore::DatabaseTracker::deleteDatabaseFile): 30 * storage/DatabaseTracker.h: 31 * storage/SQLTransactionClient.cpp: 32 (WebCore::SQLTransactionClient::didExecuteStatement): 33 1 34 2010-04-08 Kwang Yul Seo <skyul@company100.net> 2 35 -
trunk/WebCore/storage/DatabaseTracker.cpp
r57128 r57286 50 50 using namespace std; 51 51 52 static WebCore::OriginQuotaManager& originQuotaManager() 53 { 54 DEFINE_STATIC_LOCAL(WebCore::OriginQuotaManager, quotaManager, ()); 55 return quotaManager; 56 } 57 52 58 namespace WebCore { 53 54 OriginQuotaManager& DatabaseTracker::originQuotaManagerNoLock()55 {56 ASSERT(m_quotaManager);57 return *m_quotaManager;58 }59 60 OriginQuotaManager& DatabaseTracker::originQuotaManager()61 {62 MutexLocker lockDatabase(m_databaseGuard);63 populateOrigins();64 return originQuotaManagerNoLock();65 }66 59 67 60 DatabaseTracker& DatabaseTracker::tracker() … … 75 68 { 76 69 SQLiteFileSystem::registerSQLiteVFS(); 70 71 MutexLocker lockDatabase(m_databaseGuard); 72 populateOrigins(); 77 73 } 78 74 … … 133 129 unsigned long long tempUsage; 134 130 { 135 Locker<OriginQuotaManager> locker(originQuotaManager());136 131 MutexLocker lockDatabase(m_databaseGuard); 132 Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager()); 137 133 138 134 if (!canCreateDatabase(origin, name)) … … 140 136 141 137 recordCreatingDatabase(origin, name); 142 143 populateOrigins();144 138 145 139 // Since we're imminently opening a database within this context's origin, make sure this origin is being tracked by the QuotaTracker … … 193 187 { 194 188 MutexLocker lockDatabase(m_databaseGuard); 195 populateOrigins();196 189 return hasEntryForOriginNoLock(origin); 197 190 } … … 219 212 // The maximum size for a database is the full quota for its origin, minus the current usage within the origin, 220 213 // plus the current usage of the given database 221 Locker<OriginQuotaManager> locker(originQuotaManager());214 Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager()); 222 215 SecurityOrigin* origin = database->securityOrigin(); 223 216 return quotaForOrigin(origin) - originQuotaManager().diskUsage(origin) + SQLiteFileSystem::getDatabaseFileSize(database->fileName()); 224 217 } 225 218 219 void DatabaseTracker::databaseChanged(Database* database) 220 { 221 Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager()); 222 originQuotaManager().markDatabase(database); 223 } 224 226 225 String DatabaseTracker::originPath(SecurityOrigin* origin) const 227 226 { … … 232 231 { 233 232 ASSERT(!m_databaseGuard.tryLock()); 234 ASSERT(!originQuotaManager NoLock().tryLock());233 ASSERT(!originQuotaManager().tryLock()); 235 234 236 235 for (HashSet<ProposedDatabase*>::iterator iter = m_proposedDatabases.begin(); iter != m_proposedDatabases.end(); ++iter) … … 276 275 // to the quota manager now 277 276 String fullFilePath = SQLiteFileSystem::appendDatabaseFileNameToPath(originPath, fileName); 278 if (originQuotaManager NoLock().tracksOrigin(origin))279 originQuotaManager NoLock().addDatabase(origin, name, fullFilePath);277 if (originQuotaManager().tracksOrigin(origin)) 278 originQuotaManager().addDatabase(origin, name, fullFilePath); 280 279 281 280 return fullFilePath; … … 284 283 String DatabaseTracker::fullPathForDatabase(SecurityOrigin* origin, const String& name, bool createIfNotExists) 285 284 { 286 Locker<OriginQuotaManager> locker(originQuotaManager()); 287 MutexLocker lockDatabase(m_databaseGuard); 288 populateOrigins(); 285 MutexLocker lockDatabase(m_databaseGuard); 286 Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager()); 289 287 290 288 return fullPathForDatabaseNoLock(origin, name, createIfNotExists).threadsafeCopy(); … … 298 296 299 297 m_quotaMap.set(new QuotaMap); 300 if (!m_quotaManager)301 m_quotaManager.set(new OriginQuotaManager);302 298 303 299 openTrackerDatabase(false); … … 325 321 { 326 322 MutexLocker lockDatabase(m_databaseGuard); 327 populateOrigins();328 323 ASSERT(m_quotaMap); 329 324 copyKeysToVector(*m_quotaMap, result); … … 358 353 bool DatabaseTracker::databaseNamesForOrigin(SecurityOrigin* origin, Vector<String>& resultVector) 359 354 { 360 MutexLocker lockDatabase(m_databaseGuard);361 355 Vector<String> temp; 362 if (!databaseNamesForOriginNoLock(origin, temp)) 363 return false; 356 { 357 MutexLocker lockDatabase(m_databaseGuard); 358 if (!databaseNamesForOriginNoLock(origin, temp)) 359 return false; 360 } 364 361 365 362 for (Vector<String>::iterator iter = temp.begin(); iter != temp.end(); ++iter) … … 474 471 return; 475 472 476 MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard); 477 478 if (!m_openDatabaseMap) 479 m_openDatabaseMap.set(new DatabaseOriginMap); 480 481 String name(database->stringIdentifier()); 482 DatabaseNameMap* nameMap = m_openDatabaseMap->get(database->securityOrigin()); 483 if (!nameMap) { 484 nameMap = new DatabaseNameMap; 485 m_openDatabaseMap->set(database->securityOrigin()->threadsafeCopy(), nameMap); 486 } 487 488 DatabaseSet* databaseSet = nameMap->get(name); 489 if (!databaseSet) { 490 databaseSet = new DatabaseSet; 491 nameMap->set(name.threadsafeCopy(), databaseSet); 492 } 493 494 databaseSet->add(database); 495 496 LOG(StorageAPI, "Added open Database %s (%p)\n", database->stringIdentifier().ascii().data(), database); 473 { 474 MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard); 475 476 if (!m_openDatabaseMap) 477 m_openDatabaseMap.set(new DatabaseOriginMap); 478 479 String name(database->stringIdentifier()); 480 DatabaseNameMap* nameMap = m_openDatabaseMap->get(database->securityOrigin()); 481 if (!nameMap) { 482 nameMap = new DatabaseNameMap; 483 m_openDatabaseMap->set(database->securityOrigin()->threadsafeCopy(), nameMap); 484 } 485 486 DatabaseSet* databaseSet = nameMap->get(name); 487 if (!databaseSet) { 488 databaseSet = new DatabaseSet; 489 nameMap->set(name.threadsafeCopy(), databaseSet); 490 } 491 492 databaseSet->add(database); 493 494 LOG(StorageAPI, "Added open Database %s (%p)\n", database->stringIdentifier().ascii().data(), database); 495 } 497 496 498 497 MutexLocker lockDatabase(m_databaseGuard); … … 505 504 return; 506 505 506 { 507 MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard); 508 509 if (!m_openDatabaseMap) { 510 ASSERT_NOT_REACHED(); 511 return; 512 } 513 514 String name(database->stringIdentifier()); 515 DatabaseNameMap* nameMap = m_openDatabaseMap->get(database->securityOrigin()); 516 if (!nameMap) { 517 ASSERT_NOT_REACHED(); 518 return; 519 } 520 521 DatabaseSet* databaseSet = nameMap->get(name); 522 if (!databaseSet) { 523 ASSERT_NOT_REACHED(); 524 return; 525 } 526 527 databaseSet->remove(database); 528 529 LOG(StorageAPI, "Removed open Database %s (%p)\n", database->stringIdentifier().ascii().data(), database); 530 531 if (!databaseSet->isEmpty()) 532 return; 533 534 nameMap->remove(name); 535 delete databaseSet; 536 537 if (!nameMap->isEmpty()) 538 return; 539 540 m_openDatabaseMap->remove(database->securityOrigin()); 541 delete nameMap; 542 } 543 507 544 Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager()); 508 MutexLocker lockDatabase(m_databaseGuard); 509 MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard); 510 511 if (!m_openDatabaseMap) { 512 ASSERT_NOT_REACHED(); 513 return; 514 } 515 516 String name(database->stringIdentifier()); 517 DatabaseNameMap* nameMap = m_openDatabaseMap->get(database->securityOrigin()); 518 if (!nameMap) { 519 ASSERT_NOT_REACHED(); 520 return; 521 } 522 523 DatabaseSet* databaseSet = nameMap->get(name); 524 if (!databaseSet) { 525 ASSERT_NOT_REACHED(); 526 return; 527 } 528 529 databaseSet->remove(database); 530 531 LOG(StorageAPI, "Removed open Database %s (%p)\n", database->stringIdentifier().ascii().data(), database); 532 533 if (!databaseSet->isEmpty()) 534 return; 535 536 nameMap->remove(name); 537 delete databaseSet; 538 539 if (!nameMap->isEmpty()) 540 return; 541 542 m_openDatabaseMap->remove(database->securityOrigin()); 543 delete nameMap; 544 originQuotaManagerNoLock().removeOrigin(database->securityOrigin()); 545 originQuotaManager().removeOrigin(database->securityOrigin()); 545 546 } 546 547 … … 565 566 unsigned long long DatabaseTracker::usageForOriginNoLock(SecurityOrigin* origin) 566 567 { 567 ASSERT(!originQuotaManager NoLock().tryLock());568 ASSERT(!originQuotaManager().tryLock()); 568 569 569 570 // Use the OriginQuotaManager mechanism to calculate the usage 570 if (originQuotaManager NoLock().tracksOrigin(origin))571 return originQuotaManager NoLock().diskUsage(origin);571 if (originQuotaManager().tracksOrigin(origin)) 572 return originQuotaManager().diskUsage(origin); 572 573 573 574 // If the OriginQuotaManager doesn't track this origin already, prime it to do so 574 originQuotaManager NoLock().trackOrigin(origin);575 originQuotaManager().trackOrigin(origin); 575 576 576 577 Vector<String> names; … … 578 579 579 580 for (unsigned i = 0; i < names.size(); ++i) 580 originQuotaManager NoLock().addDatabase(origin, names[i], fullPathForDatabaseNoLock(origin, names[i], false));581 582 if (!originQuotaManager NoLock().tracksOrigin(origin))581 originQuotaManager().addDatabase(origin, names[i], fullPathForDatabaseNoLock(origin, names[i], false)); 582 583 if (!originQuotaManager().tracksOrigin(origin)) 583 584 return 0; 584 return originQuotaManager NoLock().diskUsage(origin);585 return originQuotaManager().diskUsage(origin); 585 586 } 586 587 587 588 unsigned long long DatabaseTracker::usageForOrigin(SecurityOrigin* origin) 588 589 { 589 Locker<OriginQuotaManager> locker(originQuotaManager());590 590 MutexLocker lockDatabase(m_databaseGuard); 591 Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager()); 591 592 return usageForOriginNoLock(origin); 592 593 } … … 602 603 { 603 604 MutexLocker lockDatabase(m_databaseGuard); 604 populateOrigins();605 605 return quotaForOriginNoLock(origin); 606 606 } … … 610 610 MutexLocker lockDatabase(m_databaseGuard); 611 611 612 populateOrigins();613 612 if (quotaForOriginNoLock(origin) == quota) 614 613 return; … … 722 721 723 722 { 724 // To satisfy the lock hierarchy, we have to lock the originQuotaManager before m_databaseGuard if there's any chance we'll to lock both.725 Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());726 723 MutexLocker lockDatabase(m_databaseGuard); 724 doneDeletingOrigin(origin); 725 727 726 SQLiteStatement statement(m_database, "DELETE FROM Databases WHERE origin=?"); 728 729 doneDeletingOrigin(origin);730 731 727 if (statement.prepare() != SQLResultOk) { 732 728 LOG_ERROR("Unable to prepare deletion of databases from origin %s from tracker", origin->databaseIdentifier().ascii().data()); … … 759 755 m_quotaMap->remove(origin); 760 756 761 originQuotaManagerNoLock().removeOrigin(origin); 757 { 758 Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager()); 759 originQuotaManager().removeOrigin(origin); 760 } 762 761 763 762 // If we removed the last origin, do some additional deletion. … … 914 913 } 915 914 916 // To satisfy the lock hierarchy, we have to lock the originQuotaManager before m_databaseGuard if there's any chance we'll to lock both.917 Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());918 915 MutexLocker lockDatabase(m_databaseGuard); 919 916 … … 934 931 } 935 932 936 originQuotaManagerNoLock().removeDatabase(origin, name); 933 { 934 Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager()); 935 originQuotaManager().removeDatabase(origin, name); 936 } 937 937 938 938 if (m_client) { … … 955 955 #ifndef NDEBUG 956 956 { 957 MutexLocker lockDatabase(m_databaseGuard);958 ASSERT(deletingDatabase(origin, name) || deletingOrigin(origin));957 MutexLocker lockDatabase(m_databaseGuard); 958 ASSERT(deletingDatabase(origin, name) || deletingOrigin(origin)); 959 959 } 960 960 #endif -
trunk/WebCore/storage/DatabaseTracker.h
r56954 r57286 53 53 #if !PLATFORM(CHROMIUM) 54 54 class DatabaseTrackerClient; 55 class OriginQuotaManager;56 55 57 56 struct SecurityOriginTraits; … … 63 62 // This singleton will potentially be used from multiple worker threads and the page's context thread simultaneously. To keep this safe, it's 64 63 // currently using 4 locks. In order to avoid deadlock when taking multiple locks, you must take them in the correct order: 65 // originQuotaManager() before m_databaseGuard or m_openDatabaseMapGuard66 // m_ databaseGuard before m_openDatabaseMapGuard64 // m_databaseGuard before originQuotaManager() if both locks are needed. 65 // m_openDatabaseMapGuard is currently independent of the other locks. 67 66 // notificationMutex() is currently independent of the other locks. 68 67 … … 76 75 77 76 unsigned long long getMaxSizeForDatabase(const Database*); 77 void databaseChanged(Database*); 78 78 79 79 private: … … 111 111 void scheduleNotifyDatabaseChanged(SecurityOrigin*, const String& name); 112 112 113 OriginQuotaManager& originQuotaManager();114 115 116 113 bool hasEntryForOrigin(SecurityOrigin*); 117 114 118 115 private: 119 OriginQuotaManager& originQuotaManagerNoLock();120 116 bool hasEntryForOriginNoLock(SecurityOrigin* origin); 121 117 String fullPathForDatabaseNoLock(SecurityOrigin*, const String& name, bool createIfDoesNotExist); … … 142 138 typedef HashMap<RefPtr<SecurityOrigin>, unsigned long long, SecurityOriginHash> QuotaMap; 143 139 mutable OwnPtr<QuotaMap> m_quotaMap; 144 145 OwnPtr<OriginQuotaManager> m_quotaManager;146 140 147 141 String m_databaseDirectoryPath; -
trunk/WebCore/storage/SQLTransactionClient.cpp
r53595 r57286 40 40 #include "DatabaseTracker.h" 41 41 #include "Document.h" 42 #include "OriginQuotaManager.h"43 42 #include "Page.h" 44 43 #include "SQLTransaction.h" … … 57 56 { 58 57 ASSERT(currentThread() == transaction->database()->scriptExecutionContext()->databaseThread()->getThreadID()); 59 OriginQuotaManager& manager(DatabaseTracker::tracker().originQuotaManager()); 60 Locker<OriginQuotaManager> locker(manager); 61 manager.markDatabase(transaction->database()); 58 DatabaseTracker::tracker().databaseChanged(transaction->database()); 62 59 } 63 60
Note: See TracChangeset
for help on using the changeset viewer.