| Index: chrome/common/json_pref_store.cc
|
| diff --git a/chrome/common/json_pref_store.cc b/chrome/common/json_pref_store.cc
|
| index ed30346ff048190d9ad004b210f14be3ffca8cf7..3f203d56e9b8e6bed3ee050ebaaf3c3a74c686c2 100644
|
| --- a/chrome/common/json_pref_store.cc
|
| +++ b/chrome/common/json_pref_store.cc
|
| @@ -13,6 +13,8 @@
|
| #include "base/json/json_string_value_serializer.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/message_loop_proxy.h"
|
| +#include "base/task_runner.h"
|
| +#include "base/threading/sequenced_worker_pool.h"
|
| #include "base/values.h"
|
|
|
| namespace {
|
| @@ -26,17 +28,17 @@ class FileThreadDeserializer
|
| : public base::RefCountedThreadSafe<FileThreadDeserializer> {
|
| public:
|
| FileThreadDeserializer(JsonPrefStore* delegate,
|
| - base::MessageLoopProxy* file_loop_proxy)
|
| + base::TaskRunner* task_runner)
|
| : no_dir_(false),
|
| error_(PersistentPrefStore::PREF_READ_ERROR_NONE),
|
| delegate_(delegate),
|
| - file_loop_proxy_(file_loop_proxy),
|
| + task_runner_(task_runner),
|
| origin_loop_proxy_(base::MessageLoopProxy::current()) {
|
| }
|
|
|
| void Start(const FilePath& path) {
|
| DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
|
| - file_loop_proxy_->PostTask(
|
| + task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&FileThreadDeserializer::ReadFileAndReport,
|
| this, path));
|
| @@ -44,7 +46,7 @@ class FileThreadDeserializer
|
|
|
| // Deserializes JSON on the file thread.
|
| void ReadFileAndReport(const FilePath& path) {
|
| - DCHECK(file_loop_proxy_->BelongsToCurrentThread());
|
| + DCHECK(task_runner_->RunsTasksOnCurrentThread());
|
|
|
| value_.reset(DoReading(path, &error_, &no_dir_));
|
|
|
| @@ -85,7 +87,7 @@ class FileThreadDeserializer
|
| PersistentPrefStore::PrefReadError error_;
|
| scoped_ptr<Value> value_;
|
| scoped_refptr<JsonPrefStore> delegate_;
|
| - scoped_refptr<base::MessageLoopProxy> file_loop_proxy_;
|
| + scoped_refptr<base::TaskRunner> task_runner_;
|
| scoped_refptr<base::MessageLoopProxy> origin_loop_proxy_;
|
| };
|
|
|
| @@ -137,13 +139,29 @@ void FileThreadDeserializer::HandleErrors(
|
|
|
| } // namespace
|
|
|
| +JsonPrefStore* JsonPrefStore::Create(
|
| + const FilePath& filename, base::SequencedWorkerPool* worker_pool) {
|
| + // Make sure that write requests for the same file don't step on each other
|
| + // by using filename-keyed sequenced task runner.
|
| + scoped_refptr<base::SequencedTaskRunner> task_runner =
|
| + worker_pool->GetSequencedTaskRunnerWithShutdownBehavior(
|
| + worker_pool->GetNamedSequenceToken(filename.value()),
|
| + base::SequencedWorkerPool::BLOCK_SHUTDOWN);
|
| + return JsonPrefStore::Create(filename, task_runner.get());
|
| +}
|
| +
|
| +JsonPrefStore* JsonPrefStore::Create(const FilePath& filename,
|
| + base::TaskRunner* task_runner) {
|
| + return new JsonPrefStore(filename, task_runner);
|
| +}
|
| +
|
| JsonPrefStore::JsonPrefStore(const FilePath& filename,
|
| - base::MessageLoopProxy* file_message_loop_proxy)
|
| + base::TaskRunner* task_runner)
|
| : path_(filename),
|
| - file_message_loop_proxy_(file_message_loop_proxy),
|
| + task_runner_(task_runner),
|
| prefs_(new DictionaryValue()),
|
| read_only_(false),
|
| - writer_(filename, file_message_loop_proxy),
|
| + writer_(filename, task_runner),
|
| error_delegate_(NULL),
|
| initialized_(false),
|
| read_error_(PREF_READ_ERROR_OTHER) {
|
| @@ -245,7 +263,7 @@ void JsonPrefStore::ReadPrefsAsync(ReadErrorDelegate *error_delegate) {
|
| // Start async reading of the preferences file. It will delete itself
|
| // in the end.
|
| scoped_refptr<FileThreadDeserializer> deserializer(
|
| - new FileThreadDeserializer(this, file_message_loop_proxy_.get()));
|
| + new FileThreadDeserializer(this, task_runner_.get()));
|
| deserializer->Start(path_);
|
| }
|
|
|
|
|