[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.21-584-g1e41756

dumi at chromium.org dumi at chromium.org
Fri Feb 26 22:14:47 UTC 2010


The following commit has been merged in the webkit-1.1 branch:
commit 86882e960a36bc95d5fa6ba8cd677ed20fabae20
Author: dumi at chromium.org <dumi at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Feb 8 21:20:01 2010 +0000

    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):
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@54506 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index b9a57e8..3f8371e 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,22 @@
+2010-02-05  Dumitru Daniliuc  <dumi at chromium.org>
+
+        Reviewed by Jeremy Orlow.
+
+        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
+
+        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):
+
 2010-02-08  Dirk Schulze  <krit at webkit.org>
 
         Unreviewed windows build-fix.
diff --git a/WebCore/storage/DatabaseTracker.cpp b/WebCore/storage/DatabaseTracker.cpp
index bed83a7..76492c9 100644
--- a/WebCore/storage/DatabaseTracker.cpp
+++ b/WebCore/storage/DatabaseTracker.cpp
@@ -478,6 +478,24 @@ void DatabaseTracker::removeOpenDatabase(Database* database)
     delete nameMap;
 }
 
+void DatabaseTracker::getOpenDatabases(SecurityOrigin* origin, const String& name, HashSet<RefPtr<Database> >* databases)
+{
+    MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
+    if (!m_openDatabaseMap)
+        return;
+
+    DatabaseNameMap* nameMap = m_openDatabaseMap->get(origin);
+    if (!nameMap)
+        return;
+
+    DatabaseSet* databaseSet = nameMap->get(name);
+    if (!databaseSet)
+        return;
+
+    for (DatabaseSet::iterator it = databaseSet->begin(); it != databaseSet->end(); ++it)
+        databases->add(*it);
+}
+
 unsigned long long DatabaseTracker::usageForOrigin(SecurityOrigin* origin)
 {
     ASSERT(currentThread() == m_thread);
diff --git a/WebCore/storage/DatabaseTracker.h b/WebCore/storage/DatabaseTracker.h
index 38a3418..4640b18 100644
--- a/WebCore/storage/DatabaseTracker.h
+++ b/WebCore/storage/DatabaseTracker.h
@@ -32,13 +32,13 @@
 #if ENABLE(DATABASE)
 
 #include "PlatformString.h"
+#include "StringHash.h"
+#include <wtf/HashMap.h>
+#include <wtf/HashSet.h>
 
 #if !PLATFORM(CHROMIUM)
 #include "DatabaseDetails.h"
 #include "SQLiteDatabase.h"
-#include "StringHash.h"
-#include <wtf/HashMap.h>
-#include <wtf/HashSet.h>
 #include <wtf/OwnPtr.h>
 #endif // !PLATFORM(CHROMIUM)
 
@@ -48,11 +48,12 @@ class Database;
 class ScriptExecutionContext;
 class SecurityOrigin;
 
+struct SecurityOriginHash;
+
 #if !PLATFORM(CHROMIUM)
 class DatabaseTrackerClient;
 class OriginQuotaManager;
 
-struct SecurityOriginHash;
 struct SecurityOriginTraits;
 #endif // !PLATFORM(CHROMIUM)
 
@@ -69,12 +70,20 @@ public:
 
     void addOpenDatabase(Database*);
     void removeOpenDatabase(Database*);
+    void getOpenDatabases(SecurityOrigin* origin, const String& name, HashSet<RefPtr<Database> >* databases);
 
     unsigned long long getMaxSizeForDatabase(const Database*);
 
 private:
     DatabaseTracker();
 
+    typedef HashSet<Database*> DatabaseSet;
+    typedef HashMap<String, DatabaseSet*> DatabaseNameMap;
+    typedef HashMap<RefPtr<SecurityOrigin>, DatabaseNameMap*, SecurityOriginHash> DatabaseOriginMap;
+
+    Mutex m_openDatabaseMapGuard;
+    mutable OwnPtr<DatabaseOriginMap> m_openDatabaseMap;
+
 #if !PLATFORM(CHROMIUM)
 public:
     void setDatabaseDirectoryPath(const String&);
@@ -123,13 +132,6 @@ private:
     Mutex m_quotaMapGuard;
     mutable OwnPtr<QuotaMap> m_quotaMap;
 
-    typedef HashSet<Database*> DatabaseSet;
-    typedef HashMap<String, DatabaseSet*> DatabaseNameMap;
-    typedef HashMap<RefPtr<SecurityOrigin>, DatabaseNameMap*, SecurityOriginHash> DatabaseOriginMap;
-
-    Mutex m_openDatabaseMapGuard;
-    mutable OwnPtr<DatabaseOriginMap> m_openDatabaseMap;
-
     OwnPtr<OriginQuotaManager> m_quotaManager;
 
     String m_databaseDirectoryPath;
diff --git a/WebCore/storage/chromium/DatabaseTrackerChromium.cpp b/WebCore/storage/chromium/DatabaseTrackerChromium.cpp
index e18706b..ac58e07 100644
--- a/WebCore/storage/chromium/DatabaseTrackerChromium.cpp
+++ b/WebCore/storage/chromium/DatabaseTrackerChromium.cpp
@@ -38,6 +38,7 @@
 #include "QuotaTracker.h"
 #include "ScriptExecutionContext.h"
 #include "SecurityOrigin.h"
+#include "SecurityOriginHash.h"
 #include "SQLiteFileSystem.h"
 #include <wtf/HashSet.h>
 #include <wtf/MainThread.h>
@@ -76,6 +77,25 @@ String DatabaseTracker::fullPathForDatabase(SecurityOrigin* origin, const String
 void DatabaseTracker::addOpenDatabase(Database* database)
 {
     ASSERT(database->scriptExecutionContext()->isContextThread());
+    MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
+    if (!m_openDatabaseMap)
+        m_openDatabaseMap.set(new DatabaseOriginMap());
+
+    DatabaseNameMap* nameMap = m_openDatabaseMap->get(database->securityOrigin());
+    if (!nameMap) {
+        nameMap = new DatabaseNameMap();
+        m_openDatabaseMap->set(database->securityOrigin(), nameMap);
+    }
+
+    String name(database->stringIdentifier());
+    DatabaseSet* databaseSet = nameMap->get(name);
+    if (!databaseSet) {
+        databaseSet = new DatabaseSet();
+        nameMap->set(name, databaseSet);
+    }
+
+    databaseSet->add(database);
+
     DatabaseObserver::databaseOpened(database);
 }
 
@@ -107,9 +127,46 @@ void DatabaseTracker::removeOpenDatabase(Database* database)
         return;
     }
 
+    MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
+    ASSERT(m_openDatabaseMap);
+    DatabaseNameMap* nameMap = m_openDatabaseMap->get(database->securityOrigin());
+    ASSERT(nameMap);
+    String name(database->stringIdentifier());
+    DatabaseSet* databaseSet = nameMap->get(name);
+    ASSERT(databaseSet);
+    databaseSet->remove(database);
+
+    if (databaseSet->isEmpty()) {
+        nameMap->remove(name);
+        delete databaseSet;
+        if (nameMap->isEmpty()) {
+            m_openDatabaseMap->remove(database->securityOrigin());
+            delete nameMap;
+        }
+    }
+
     DatabaseObserver::databaseClosed(database);
 }
 
+
+void DatabaseTracker::getOpenDatabases(SecurityOrigin* origin, const String& name, HashSet<RefPtr<Database> >* databases)
+{
+    MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
+    if (!m_openDatabaseMap)
+        return;
+
+    DatabaseNameMap* nameMap = m_openDatabaseMap->get(origin);
+    if (!nameMap)
+        return;
+
+    DatabaseSet* databaseSet = nameMap->get(name);
+    if (!databaseSet)
+        return;
+
+    for (DatabaseSet::iterator it = databaseSet->begin(); it != databaseSet->end(); ++it)
+        databases->add(*it);
+}
+
 unsigned long long DatabaseTracker::getMaxSizeForDatabase(const Database* database)
 {
     ASSERT(currentThread() == database->scriptExecutionContext()->databaseThread()->getThreadID());
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 92c3f41..9f43b8f 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,15 @@
+2010-02-05  Dumitru Daniliuc  <dumi at chromium.org>
+
+        Reviewed by Jeremy Orlow.
+
+        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
+
+        * public/WebDatabase.h:
+        * src/WebDatabase.cpp:
+        (WebKit::WebDatabase::closeDatabaseImmediately):
+
 2010-02-08  Dirk Schulze  <krit at webkit.org>
 
         Reviewed by Nikolas Zimmermann.
diff --git a/WebKit/chromium/public/WebDatabase.h b/WebKit/chromium/public/WebDatabase.h
index 179e828..108201d 100644
--- a/WebKit/chromium/public/WebDatabase.h
+++ b/WebKit/chromium/public/WebDatabase.h
@@ -72,6 +72,8 @@ public:
     WEBKIT_API static void updateDatabaseSize(
         const WebString& originIdentifier, const WebString& databaseName,
         unsigned long long databaseSize, unsigned long long spaceAvailable);
+    WEBKIT_API static void closeDatabaseImmediately(
+        const WebString& originIdentifier, const WebString& databaseName);
 
 #if WEBKIT_IMPLEMENTATION
     WebDatabase(const WTF::PassRefPtr<WebCore::Database>&);
diff --git a/WebKit/chromium/src/WebDatabase.cpp b/WebKit/chromium/src/WebDatabase.cpp
index 2cd36b6..50b9220 100644
--- a/WebKit/chromium/src/WebDatabase.cpp
+++ b/WebKit/chromium/src/WebDatabase.cpp
@@ -32,7 +32,9 @@
 #include "WebDatabase.h"
 
 #include "Database.h"
+#include "DatabaseTask.h"
 #include "DatabaseThread.h"
+#include "DatabaseTracker.h"
 #include "Document.h"
 #include "KURL.h"
 #include "QuotaTracker.h"
@@ -106,6 +108,22 @@ void WebDatabase::updateDatabaseSize(
         originIdentifier, databaseName, databaseSize, spaceAvailable);
 }
 
+void WebDatabase::closeDatabaseImmediately(const WebString& originIdentifier, const WebString& databaseName)
+{
+    HashSet<RefPtr<Database> > databaseHandles;
+    PassRefPtr<SecurityOrigin> originPrp(*WebSecurityOrigin::createFromDatabaseIdentifier(originIdentifier));
+    RefPtr<SecurityOrigin> origin = originPrp;
+    DatabaseTracker::tracker().getOpenDatabases(origin.get(), databaseName, &databaseHandles);
+    for (HashSet<RefPtr<Database> >::iterator it = databaseHandles.begin(); it != databaseHandles.end(); ++it) {
+        Database* database = it->get();
+        DatabaseThread* databaseThread = database->scriptExecutionContext()->databaseThread();
+        if (databaseThread && !databaseThread->terminationRequested()) {
+            database->stop();
+            databaseThread->scheduleTask(DatabaseCloseTask::create(database, 0));
+        }
+    }
+}
+
 WebDatabase::WebDatabase(const WTF::PassRefPtr<Database>& database)
     : m_private(static_cast<WebDatabasePrivate*>(database.releaseRef()))
 {

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list