summaryrefslogtreecommitdiffstats
path: root/webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc
diff options
context:
space:
mode:
authorkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-28 08:28:04 +0000
committerkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-28 08:28:04 +0000
commit28fb3081aaecd2abbdd9ed511ee7a9f03866461d (patch)
treeb90c2b6769ca05a860cf209fc0f88a46fbc20302 /webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc
parent4113a6555fab1995a9ab5b475bf96d74d00f582a (diff)
downloadchromium_src-28fb3081aaecd2abbdd9ed511ee7a9f03866461d.zip
chromium_src-28fb3081aaecd2abbdd9ed511ee7a9f03866461d.tar.gz
chromium_src-28fb3081aaecd2abbdd9ed511ee7a9f03866461d.tar.bz2
Retry: Prepopulate primary origin's directory database if possible.
Before (with primary origin patch) 140~170 ms After (excluding 1st launch for a new profile) 30~90 ms The very first launch for a fresh profile is still slow as it needs to go through full initialization. BUG=306030 TEST=manual TEST=valgrind Review URL: https://codereview.chromium.org/44463002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@231294 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc')
-rw-r--r--webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc38
1 files changed, 28 insertions, 10 deletions
diff --git a/webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc b/webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc
index 6f1ff0e7..593e1a0 100644
--- a/webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc
+++ b/webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc
@@ -43,6 +43,11 @@ const char kTemporaryDirectoryName[] = "t";
const char kPersistentDirectoryName[] = "p";
const char kSyncableDirectoryName[] = "s";
+const char* kPrepopulateTypes[] = {
+ kPersistentDirectoryName,
+ kTemporaryDirectoryName
+};
+
enum FileSystemError {
kOK = 0,
kIncognito,
@@ -129,6 +134,12 @@ void DidOpenFileSystem(
callback.Run(*error);
}
+template <typename T>
+void DeleteSoon(base::SequencedTaskRunner* runner, T* ptr) {
+ if (!runner->DeleteSoon(FROM_HERE, ptr))
+ delete ptr;
+}
+
} // namespace
const base::FilePath::CharType
@@ -178,21 +189,28 @@ SandboxFileSystemBackendDelegate::SandboxFileSystemBackendDelegate(
file_system_options_(file_system_options),
is_filesystem_opened_(false),
weak_factory_(this) {
+ // Prepopulate database only if it can run asynchronously (i.e. the current
+ // thread is not file_task_runner). Usually this is the case but may not
+ // in test code.
+ if (!file_task_runner_->RunsTasksOnCurrentThread()) {
+ std::vector<std::string> types_to_prepopulate(
+ &kPrepopulateTypes[0],
+ &kPrepopulateTypes[arraysize(kPrepopulateTypes)]);
+ file_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&ObfuscatedFileUtil::MaybePrepopulateDatabase,
+ base::Unretained(obfuscated_file_util()),
+ types_to_prepopulate));
+ }
}
SandboxFileSystemBackendDelegate::~SandboxFileSystemBackendDelegate() {
io_thread_checker_.DetachFromThread();
+
if (!file_task_runner_->RunsTasksOnCurrentThread()) {
- AsyncFileUtil* sandbox_file_util = sandbox_file_util_.release();
- SandboxQuotaObserver* quota_observer = quota_observer_.release();
- FileSystemUsageCache* file_system_usage_cache =
- file_system_usage_cache_.release();
- if (!file_task_runner_->DeleteSoon(FROM_HERE, sandbox_file_util))
- delete sandbox_file_util;
- if (!file_task_runner_->DeleteSoon(FROM_HERE, quota_observer))
- delete quota_observer;
- if (!file_task_runner_->DeleteSoon(FROM_HERE, file_system_usage_cache))
- delete file_system_usage_cache;
+ DeleteSoon(file_task_runner_.get(), sandbox_file_util_.release());
+ DeleteSoon(file_task_runner_.get(), quota_observer_.release());
+ DeleteSoon(file_task_runner_.get(), file_system_usage_cache_.release());
}
}