Changeset 54506 in webkit


Ignore:
Timestamp:
Feb 8, 2010 1:20:01 PM (14 years ago)
Author:
dumi@chromium.org
Message:

WebCore: Adding a way to get the set of all open database handles pointing
to a given database.
https://bugs.webkit.org/show_bug.cgi?id=34619

Reviewed by Jeremy Orlow.

Sometimes we need to be able to close all handles to a database as
soon as possible (to delete the DB file, for example).

  • storage/DatabaseTracker.cpp:

(WebCore::DatabaseTracker::getOpenDatabases):

  • storage/DatabaseTracker.h:
  • storage/chromium/DatabaseTrackerChromium.cpp:

(WebCore::DatabaseTracker::addOpenDatabase):
(WebCore::DatabaseTracker::removeOpenDatabase):
(WebCore::DatabaseTracker::getOpenDatabases):

WebKit/chromium: Adding a way to close all database handles pointing to a certain
database as soon as possible.
https://bugs.webkit.org/show_bug.cgi?id=34619

Reviewed by Jeremy Orlow.

  • public/WebDatabase.h:
  • src/WebDatabase.cpp:

(WebKit::WebDatabase::closeDatabaseImmediately):

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r54505 r54506  
     12010-02-05  Dumitru Daniliuc  <dumi@chromium.org>
     2
     3        Reviewed by Jeremy Orlow.
     4
     5        Adding a way to get the set of all open database handles pointing
     6        to a given database.
     7        https://bugs.webkit.org/show_bug.cgi?id=34619
     8
     9        Sometimes we need to be able to close all handles to a database as
     10        soon as possible (to delete the DB file, for example).
     11
     12        * storage/DatabaseTracker.cpp:
     13        (WebCore::DatabaseTracker::getOpenDatabases):
     14        * storage/DatabaseTracker.h:
     15        * storage/chromium/DatabaseTrackerChromium.cpp:
     16        (WebCore::DatabaseTracker::addOpenDatabase):
     17        (WebCore::DatabaseTracker::removeOpenDatabase):
     18        (WebCore::DatabaseTracker::getOpenDatabases):
     19
    1202010-02-08  Dirk Schulze  <krit@webkit.org>
    221
  • trunk/WebCore/storage/DatabaseTracker.cpp

    r53595 r54506  
    479479}
    480480
     481void DatabaseTracker::getOpenDatabases(SecurityOrigin* origin, const String& name, HashSet<RefPtr<Database> >* databases)
     482{
     483    MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
     484    if (!m_openDatabaseMap)
     485        return;
     486
     487    DatabaseNameMap* nameMap = m_openDatabaseMap->get(origin);
     488    if (!nameMap)
     489        return;
     490
     491    DatabaseSet* databaseSet = nameMap->get(name);
     492    if (!databaseSet)
     493        return;
     494
     495    for (DatabaseSet::iterator it = databaseSet->begin(); it != databaseSet->end(); ++it)
     496        databases->add(*it);
     497}
     498
    481499unsigned long long DatabaseTracker::usageForOrigin(SecurityOrigin* origin)
    482500{
  • trunk/WebCore/storage/DatabaseTracker.h

    r53595 r54506  
    3333
    3434#include "PlatformString.h"
     35#include "StringHash.h"
     36#include <wtf/HashMap.h>
     37#include <wtf/HashSet.h>
    3538
    3639#if !PLATFORM(CHROMIUM)
    3740#include "DatabaseDetails.h"
    3841#include "SQLiteDatabase.h"
    39 #include "StringHash.h"
    40 #include <wtf/HashMap.h>
    41 #include <wtf/HashSet.h>
    4242#include <wtf/OwnPtr.h>
    4343#endif // !PLATFORM(CHROMIUM)
     
    4949class SecurityOrigin;
    5050
     51struct SecurityOriginHash;
     52
    5153#if !PLATFORM(CHROMIUM)
    5254class DatabaseTrackerClient;
    5355class OriginQuotaManager;
    5456
    55 struct SecurityOriginHash;
    5657struct SecurityOriginTraits;
    5758#endif // !PLATFORM(CHROMIUM)
     
    7071    void addOpenDatabase(Database*);
    7172    void removeOpenDatabase(Database*);
     73    void getOpenDatabases(SecurityOrigin* origin, const String& name, HashSet<RefPtr<Database> >* databases);
    7274
    7375    unsigned long long getMaxSizeForDatabase(const Database*);
     
    7577private:
    7678    DatabaseTracker();
     79
     80    typedef HashSet<Database*> DatabaseSet;
     81    typedef HashMap<String, DatabaseSet*> DatabaseNameMap;
     82    typedef HashMap<RefPtr<SecurityOrigin>, DatabaseNameMap*, SecurityOriginHash> DatabaseOriginMap;
     83
     84    Mutex m_openDatabaseMapGuard;
     85    mutable OwnPtr<DatabaseOriginMap> m_openDatabaseMap;
    7786
    7887#if !PLATFORM(CHROMIUM)
     
    124133    mutable OwnPtr<QuotaMap> m_quotaMap;
    125134
    126     typedef HashSet<Database*> DatabaseSet;
    127     typedef HashMap<String, DatabaseSet*> DatabaseNameMap;
    128     typedef HashMap<RefPtr<SecurityOrigin>, DatabaseNameMap*, SecurityOriginHash> DatabaseOriginMap;
    129 
    130     Mutex m_openDatabaseMapGuard;
    131     mutable OwnPtr<DatabaseOriginMap> m_openDatabaseMap;
    132 
    133135    OwnPtr<OriginQuotaManager> m_quotaManager;
    134136
  • trunk/WebCore/storage/chromium/DatabaseTrackerChromium.cpp

    r53595 r54506  
    3939#include "ScriptExecutionContext.h"
    4040#include "SecurityOrigin.h"
     41#include "SecurityOriginHash.h"
    4142#include "SQLiteFileSystem.h"
    4243#include <wtf/HashSet.h>
     
    7778{
    7879    ASSERT(database->scriptExecutionContext()->isContextThread());
     80    MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
     81    if (!m_openDatabaseMap)
     82        m_openDatabaseMap.set(new DatabaseOriginMap());
     83
     84    DatabaseNameMap* nameMap = m_openDatabaseMap->get(database->securityOrigin());
     85    if (!nameMap) {
     86        nameMap = new DatabaseNameMap();
     87        m_openDatabaseMap->set(database->securityOrigin(), nameMap);
     88    }
     89
     90    String name(database->stringIdentifier());
     91    DatabaseSet* databaseSet = nameMap->get(name);
     92    if (!databaseSet) {
     93        databaseSet = new DatabaseSet();
     94        nameMap->set(name, databaseSet);
     95    }
     96
     97    databaseSet->add(database);
     98
    7999    DatabaseObserver::databaseOpened(database);
    80100}
     
    108128    }
    109129
     130    MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
     131    ASSERT(m_openDatabaseMap);
     132    DatabaseNameMap* nameMap = m_openDatabaseMap->get(database->securityOrigin());
     133    ASSERT(nameMap);
     134    String name(database->stringIdentifier());
     135    DatabaseSet* databaseSet = nameMap->get(name);
     136    ASSERT(databaseSet);
     137    databaseSet->remove(database);
     138
     139    if (databaseSet->isEmpty()) {
     140        nameMap->remove(name);
     141        delete databaseSet;
     142        if (nameMap->isEmpty()) {
     143            m_openDatabaseMap->remove(database->securityOrigin());
     144            delete nameMap;
     145        }
     146    }
     147
    110148    DatabaseObserver::databaseClosed(database);
     149}
     150
     151
     152void DatabaseTracker::getOpenDatabases(SecurityOrigin* origin, const String& name, HashSet<RefPtr<Database> >* databases)
     153{
     154    MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
     155    if (!m_openDatabaseMap)
     156        return;
     157
     158    DatabaseNameMap* nameMap = m_openDatabaseMap->get(origin);
     159    if (!nameMap)
     160        return;
     161
     162    DatabaseSet* databaseSet = nameMap->get(name);
     163    if (!databaseSet)
     164        return;
     165
     166    for (DatabaseSet::iterator it = databaseSet->begin(); it != databaseSet->end(); ++it)
     167        databases->add(*it);
    111168}
    112169
  • trunk/WebKit/chromium/ChangeLog

    r54503 r54506  
     12010-02-05  Dumitru Daniliuc  <dumi@chromium.org>
     2
     3        Reviewed by Jeremy Orlow.
     4
     5        Adding a way to close all database handles pointing to a certain
     6        database as soon as possible.
     7        https://bugs.webkit.org/show_bug.cgi?id=34619
     8
     9        * public/WebDatabase.h:
     10        * src/WebDatabase.cpp:
     11        (WebKit::WebDatabase::closeDatabaseImmediately):
     12
    1132010-02-08  Dirk Schulze  <krit@webkit.org>
    214
  • trunk/WebKit/chromium/public/WebDatabase.h

    r50680 r54506  
    7373        const WebString& originIdentifier, const WebString& databaseName,
    7474        unsigned long long databaseSize, unsigned long long spaceAvailable);
     75    WEBKIT_API static void closeDatabaseImmediately(
     76        const WebString& originIdentifier, const WebString& databaseName);
    7577
    7678#if WEBKIT_IMPLEMENTATION
  • trunk/WebKit/chromium/src/WebDatabase.cpp

    r50961 r54506  
    3333
    3434#include "Database.h"
     35#include "DatabaseTask.h"
    3536#include "DatabaseThread.h"
     37#include "DatabaseTracker.h"
    3638#include "Document.h"
    3739#include "KURL.h"
     
    107109}
    108110
     111void WebDatabase::closeDatabaseImmediately(const WebString& originIdentifier, const WebString& databaseName)
     112{
     113    HashSet<RefPtr<Database> > databaseHandles;
     114    PassRefPtr<SecurityOrigin> originPrp(*WebSecurityOrigin::createFromDatabaseIdentifier(originIdentifier));
     115    RefPtr<SecurityOrigin> origin = originPrp;
     116    DatabaseTracker::tracker().getOpenDatabases(origin.get(), databaseName, &databaseHandles);
     117    for (HashSet<RefPtr<Database> >::iterator it = databaseHandles.begin(); it != databaseHandles.end(); ++it) {
     118        Database* database = it->get();
     119        DatabaseThread* databaseThread = database->scriptExecutionContext()->databaseThread();
     120        if (databaseThread && !databaseThread->terminationRequested()) {
     121            database->stop();
     122            databaseThread->scheduleTask(DatabaseCloseTask::create(database, 0));
     123        }
     124    }
     125}
     126
    109127WebDatabase::WebDatabase(const WTF::PassRefPtr<Database>& database)
    110128    : m_private(static_cast<WebDatabasePrivate*>(database.releaseRef()))
Note: See TracChangeset for help on using the changeset viewer.