Changeset 30154 in webkit


Ignore:
Timestamp:
Feb 11, 2008 2:54:53 PM (16 years ago)
Author:
timothy@apple.com
Message:

Reviewed by Brady Eidson.

<rdar://problem/5733069> Many m_quotaMap uses do not hold the m_quotaMapGuard

  • storage/DatabaseTracker.cpp: (WebCore::DatabaseTracker::hasEntryForOrigin): Hold m_quotaMapGuard when using m_quotaMap. (WebCore::DatabaseTracker::origins): Ditto. (WebCore::DatabaseTracker::setQuota): Ditto. (WebCore::DatabaseTracker::deleteAllDatabases): Call origins() and itterate over the origins to call deleteOrigin(). (WebCore::DatabaseTracker::deleteOrigin): Hold m_quotaMapGuard when using m_quotaMap.
Location:
trunk/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r30153 r30154  
     12008-02-11  Timothy Hatcher  <timothy@apple.com>
     2
     3        Reviewed by Brady Eidson.
     4
     5        <rdar://problem/5733069> Many m_quotaMap uses do not hold the m_quotaMapGuard
     6
     7        * storage/DatabaseTracker.cpp:
     8        (WebCore::DatabaseTracker::hasEntryForOrigin): Hold m_quotaMapGuard when using m_quotaMap.
     9        (WebCore::DatabaseTracker::origins): Ditto.
     10        (WebCore::DatabaseTracker::setQuota): Ditto.
     11        (WebCore::DatabaseTracker::deleteAllDatabases): Call origins() and itterate over the
     12        origins to call deleteOrigin().
     13        (WebCore::DatabaseTracker::deleteOrigin): Hold m_quotaMapGuard when using m_quotaMap.
     14
    1152008-02-11  David Hyatt  <hyatt@apple.com>
    216
  • trunk/WebCore/storage/DatabaseTracker.cpp

    r30104 r30154  
    163163    ASSERT(currentThread() == m_thread);
    164164    populateOrigins();
     165    MutexLocker lockQuotaMap(m_quotaMapGuard);
    165166    return m_quotaMap->contains(origin);
    166167}
     
    299300    ASSERT(currentThread() == m_thread);
    300301    populateOrigins();
     302    MutexLocker lockQuotaMap(m_quotaMapGuard);
    301303    copyKeysToVector(*m_quotaMap, result);
    302304}
     
    536538    if (!m_database.isOpen())
    537539        return;
    538     if (!m_quotaMap->contains(origin)) {
    539         SQLiteStatement statement(m_database, "INSERT INTO Origins VALUES (?, ?)");
    540         if (statement.prepare() != SQLResultOk) {
    541             LOG_ERROR("Unable to establish origin %s in the tracker", origin->stringIdentifier().ascii().data());
    542         } else {
    543             statement.bindText(1, origin->stringIdentifier());
    544             statement.bindInt64(2, quota);
    545 
    546             if (statement.step() != SQLResultDone)
    547                 LOG_ERROR("Unable to establish origin %s in the tracker", origin->stringIdentifier().ascii().data());
    548         }
    549     } else {
    550         SQLiteStatement statement(m_database, "UPDATE Origins SET quota=? WHERE origin=?");       
    551         bool error = statement.prepare() != SQLResultOk;
    552         if (!error) {
    553             statement.bindInt64(1, quota);
    554             statement.bindText(2, origin->stringIdentifier());
    555 
    556             error = !statement.executeCommand();
    557         }
    558         if (error)
    559             LOG_ERROR("Failed to set quota %llu in tracker database for origin %s", quota, origin->stringIdentifier().ascii().data());
    560     }
    561     // FIXME: Is it really OK to update the quota in memory if we failed to update it on disk?
    562540
    563541    {
    564542        MutexLocker lockQuotaMap(m_quotaMapGuard);
     543
     544        if (!m_quotaMap->contains(origin)) {
     545            SQLiteStatement statement(m_database, "INSERT INTO Origins VALUES (?, ?)");
     546            if (statement.prepare() != SQLResultOk) {
     547                LOG_ERROR("Unable to establish origin %s in the tracker", origin->stringIdentifier().ascii().data());
     548            } else {
     549                statement.bindText(1, origin->stringIdentifier());
     550                statement.bindInt64(2, quota);
     551
     552                if (statement.step() != SQLResultDone)
     553                    LOG_ERROR("Unable to establish origin %s in the tracker", origin->stringIdentifier().ascii().data());
     554            }
     555        } else {
     556            SQLiteStatement statement(m_database, "UPDATE Origins SET quota=? WHERE origin=?");       
     557            bool error = statement.prepare() != SQLResultOk;
     558            if (!error) {
     559                statement.bindInt64(1, quota);
     560                statement.bindText(2, origin->stringIdentifier());
     561
     562                error = !statement.executeCommand();
     563            }
     564
     565            if (error)
     566                LOG_ERROR("Failed to set quota %llu in tracker database for origin %s", quota, origin->stringIdentifier().ascii().data());
     567        }
     568
     569        // FIXME: Is it really OK to update the quota in memory if we failed to update it on disk?
    565570        m_quotaMap->set(origin, quota);
    566571    }
    567    
     572
    568573    if (m_client)
    569574        m_client->dispatchDidModifyOrigin(origin);
    570575}
    571    
     576
    572577bool DatabaseTracker::addDatabase(SecurityOrigin* origin, const String& name, const String& path)
    573578{
     
    603608{
    604609    ASSERT(currentThread() == m_thread);
    605     populateOrigins();
    606    
    607     QuotaMap quotaMapCopy = *m_quotaMap;
    608     QuotaMap::const_iterator end = quotaMapCopy.end();
    609     for (QuotaMap::const_iterator iter = quotaMapCopy.begin(); iter != end; ++iter)
    610         deleteOrigin(iter->first.get());
     610
     611    Vector<RefPtr<SecurityOrigin> > originsCopy;
     612    origins(originsCopy);
     613
     614    for (unsigned i = 0; i < originsCopy.size(); ++i)
     615        deleteOrigin(originsCopy[i].get());
    611616}
    612617
     
    663668        MutexLocker lockQuotaMap(m_quotaMapGuard);
    664669        m_quotaMap->remove(origin);
     670
    665671        Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
    666672        originQuotaManager().removeOrigin(origin);
    667     }
    668 
    669     // If we removed the last origin, do some additional deletion.
    670     if (m_quotaMap->isEmpty()) {
    671         if (m_database.isOpen())
    672             m_database.close();
    673         deleteFile(trackerDatabasePath());
    674         deleteEmptyDirectory(m_databaseDirectoryPath);
     673
     674        // If we removed the last origin, do some additional deletion.
     675        if (m_quotaMap->isEmpty()) {
     676            if (m_database.isOpen())
     677                m_database.close();
     678            deleteFile(trackerDatabasePath());
     679            deleteEmptyDirectory(m_databaseDirectoryPath);
     680        }
    675681    }
    676682
Note: See TracChangeset for help on using the changeset viewer.