From 2bde8e466a4451c7319e3a072d118917957d6554 Mon Sep 17 00:00:00 2001 From: Steve Block Date: Wed, 25 May 2011 19:08:45 +0100 Subject: Merge WebKit at r82507: Initial merge by git Change-Id: I60ce9d780725b58b45e54165733a8ffee23b683e --- Source/WebCore/storage/StorageAreaSync.cpp | 51 ++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) (limited to 'Source/WebCore/storage/StorageAreaSync.cpp') 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 @@ -60,6 +61,7 @@ inline StorageAreaSync::StorageAreaSync(PassRefPtr 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*) { 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& 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) -- cgit v1.1