diff options
author | Steve Block <steveblock@google.com> | 2011-05-25 19:08:45 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-06-08 13:51:31 +0100 |
commit | 2bde8e466a4451c7319e3a072d118917957d6554 (patch) | |
tree | 28f4a1b869a513e565c7760d0e6a06e7cf1fe95a /Source/WebCore/storage/StorageAreaSync.cpp | |
parent | 6939c99b71d9372d14a0c74a772108052e8c48c8 (diff) | |
download | external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.zip external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.gz external_webkit-2bde8e466a4451c7319e3a072d118917957d6554.tar.bz2 |
Merge WebKit at r82507: Initial merge by git
Change-Id: I60ce9d780725b58b45e54165733a8ffee23b683e
Diffstat (limited to 'Source/WebCore/storage/StorageAreaSync.cpp')
-rw-r--r-- | Source/WebCore/storage/StorageAreaSync.cpp | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/Source/WebCore/storage/StorageAreaSync.cpp b/Source/WebCore/storage/StorageAreaSync.cpp index f2008ab..94a002a 100644 --- a/Source/WebCore/storage/StorageAreaSync.cpp +++ b/Source/WebCore/storage/StorageAreaSync.cpp @@ -36,6 +36,7 @@ #include "SecurityOrigin.h" #include "StorageAreaImpl.h" #include "StorageSyncManager.h" +#include "StorageTracker.h" #include "SuddenTermination.h" #include <wtf/text/CString.h> @@ -60,6 +61,7 @@ inline StorageAreaSync::StorageAreaSync(PassRefPtr<StorageSyncManager> storageSy , m_syncScheduled(false) , m_syncInProgress(false) , m_databaseOpenFailed(false) + , m_syncCloseDatabase(false) , m_importComplete(false) { ASSERT(isMainThread()); @@ -138,6 +140,25 @@ void StorageAreaSync::scheduleClear() } } +void StorageAreaSync::scheduleCloseDatabase() +{ + ASSERT(isMainThread()); + ASSERT(!m_finalSyncScheduled); + + if (!m_database.isOpen()) + return; + + m_syncCloseDatabase = true; + + if (!m_syncTimer.isActive()) { + m_syncTimer.startOneShot(StorageSyncInterval); + + // The following is balanced by the call to enableSuddenTermination in the + // syncTimerFired function. + disableSuddenTermination(); + } +} + void StorageAreaSync::syncTimerFired(Timer<StorageAreaSync>*) { ASSERT(isMainThread()); @@ -222,6 +243,10 @@ void StorageAreaSync::openDatabase(OpenDatabaseParamType openingStrategy) return; } + // A StorageTracker thread may have been scheduled to delete the db we're + // reopening, so cancel possible deletion. + StorageTracker::tracker().cancelDeletingOrigin(m_databaseIdentifier); + if (!m_database.open(databaseFilename)) { LOG_ERROR("Failed to open database file %s for local storage", databaseFilename.utf8().data()); markImported(); @@ -235,6 +260,8 @@ void StorageAreaSync::openDatabase(OpenDatabaseParamType openingStrategy) m_databaseOpenFailed = true; return; } + + StorageTracker::tracker().setOriginDetails(m_databaseIdentifier, databaseFilename); } void StorageAreaSync::performImport() @@ -319,6 +346,15 @@ void StorageAreaSync::sync(bool clearItems, const HashMap<String, String>& items if (!m_database.isOpen()) return; + // Closing this db because it is about to be deleted by StorageTracker. + // The delete will be cancelled if StorageAreaSync needs to reopen the db + // to write new items created after the request to delete the db. + if (m_syncCloseDatabase) { + m_syncCloseDatabase = false; + m_database.close(); + return; + } + // If the clear flag is set, then we clear all items out before we write any new ones in. if (clearItems) { SQLiteStatement clear(m_database, "DELETE FROM ItemTable"); @@ -421,12 +457,21 @@ void StorageAreaSync::deleteEmptyDatabase() if (!count) { query.finalize(); m_database.close(); - String databaseFilename = m_syncManager->fullDatabaseFilename(m_databaseIdentifier); - if (!SQLiteFileSystem::deleteDatabaseFile(databaseFilename)) - LOG_ERROR("Failed to delete database file %s\n", databaseFilename.utf8().data()); + if (StorageTracker::tracker().isActive()) + StorageTracker::tracker().deleteOrigin(m_databaseIdentifier); + else { + String databaseFilename = m_syncManager->fullDatabaseFilename(m_databaseIdentifier); + if (!SQLiteFileSystem::deleteDatabaseFile(databaseFilename)) + LOG_ERROR("Failed to delete database file %s\n", databaseFilename.utf8().data()); + } } } +void StorageAreaSync::scheduleSync() +{ + syncTimerFired(&m_syncTimer); +} + } // namespace WebCore #endif // ENABLE(DOM_STORAGE) |