Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(225)

Side by Side Diff: base/prefs/json_pref_store.cc

Issue 90563003: Fix a race condition in preference metric reporting. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Also filter 'empty loads' as in new run or corrupted pref file scenarios. Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/prefs/json_pref_store.h ('k') | base/prefs/json_pref_store_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/prefs/json_pref_store.h" 5 #include "base/prefs/json_pref_store.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
11 #include "base/file_util.h" 11 #include "base/file_util.h"
12 #include "base/json/json_file_value_serializer.h" 12 #include "base/json/json_file_value_serializer.h"
13 #include "base/json/json_string_value_serializer.h" 13 #include "base/json/json_string_value_serializer.h"
14 #include "base/memory/ref_counted.h" 14 #include "base/memory/ref_counted.h"
15 #include "base/message_loop/message_loop_proxy.h" 15 #include "base/message_loop/message_loop_proxy.h"
16 #include "base/prefs/pref_filter.h"
16 #include "base/sequenced_task_runner.h" 17 #include "base/sequenced_task_runner.h"
17 #include "base/threading/sequenced_worker_pool.h" 18 #include "base/threading/sequenced_worker_pool.h"
18 #include "base/values.h" 19 #include "base/values.h"
19 20
20 namespace { 21 namespace {
21 22
22 // Some extensions we'll tack on to copies of the Preferences files. 23 // Some extensions we'll tack on to copies of the Preferences files.
23 const base::FilePath::CharType* kBadExtension = FILE_PATH_LITERAL("bad"); 24 const base::FilePath::CharType* kBadExtension = FILE_PATH_LITERAL("bad");
24 25
25 // Differentiates file loading between origin thread and passed 26 // Differentiates file loading between origin thread and passed
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 const base::FilePath& filename, 145 const base::FilePath& filename,
145 base::SequencedWorkerPool* worker_pool) { 146 base::SequencedWorkerPool* worker_pool) {
146 std::string token("json_pref_store-"); 147 std::string token("json_pref_store-");
147 token.append(filename.AsUTF8Unsafe()); 148 token.append(filename.AsUTF8Unsafe());
148 return worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( 149 return worker_pool->GetSequencedTaskRunnerWithShutdownBehavior(
149 worker_pool->GetNamedSequenceToken(token), 150 worker_pool->GetNamedSequenceToken(token),
150 base::SequencedWorkerPool::BLOCK_SHUTDOWN); 151 base::SequencedWorkerPool::BLOCK_SHUTDOWN);
151 } 152 }
152 153
153 JsonPrefStore::JsonPrefStore(const base::FilePath& filename, 154 JsonPrefStore::JsonPrefStore(const base::FilePath& filename,
154 base::SequencedTaskRunner* sequenced_task_runner) 155 base::SequencedTaskRunner* sequenced_task_runner,
156 scoped_ptr<PrefFilter> pref_filter)
155 : path_(filename), 157 : path_(filename),
156 sequenced_task_runner_(sequenced_task_runner), 158 sequenced_task_runner_(sequenced_task_runner),
157 prefs_(new base::DictionaryValue()), 159 prefs_(new base::DictionaryValue()),
158 read_only_(false), 160 read_only_(false),
159 writer_(filename, sequenced_task_runner), 161 writer_(filename, sequenced_task_runner),
162 pref_filter_(pref_filter.Pass()),
160 initialized_(false), 163 initialized_(false),
161 read_error_(PREF_READ_ERROR_OTHER) {} 164 read_error_(PREF_READ_ERROR_OTHER) {}
162 165
163 bool JsonPrefStore::GetValue(const std::string& key, 166 bool JsonPrefStore::GetValue(const std::string& key,
164 const base::Value** result) const { 167 const base::Value** result) const {
165 base::Value* tmp = NULL; 168 base::Value* tmp = NULL;
166 if (!prefs_->Get(key, &tmp)) 169 if (!prefs_->Get(key, &tmp))
167 return false; 170 return false;
168 171
169 if (result) 172 if (result)
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 new FileThreadDeserializer(this, sequenced_task_runner_.get())); 260 new FileThreadDeserializer(this, sequenced_task_runner_.get()));
258 deserializer->Start(path_); 261 deserializer->Start(path_);
259 } 262 }
260 263
261 void JsonPrefStore::CommitPendingWrite() { 264 void JsonPrefStore::CommitPendingWrite() {
262 if (writer_.HasPendingWrite() && !read_only_) 265 if (writer_.HasPendingWrite() && !read_only_)
263 writer_.DoScheduledWrite(); 266 writer_.DoScheduledWrite();
264 } 267 }
265 268
266 void JsonPrefStore::ReportValueChanged(const std::string& key) { 269 void JsonPrefStore::ReportValueChanged(const std::string& key) {
270 if (pref_filter_) {
271 const base::Value* tmp = NULL;
272 prefs_->Get(key, &tmp);
273 pref_filter_->FilterUpdate(key, tmp);
274 }
275
267 FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key)); 276 FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key));
277
268 if (!read_only_) 278 if (!read_only_)
269 writer_.ScheduleWrite(this); 279 writer_.ScheduleWrite(this);
270 } 280 }
271 281
272 void JsonPrefStore::OnFileRead(base::Value* value_owned, 282 void JsonPrefStore::OnFileRead(base::Value* value_owned,
273 PersistentPrefStore::PrefReadError error, 283 PersistentPrefStore::PrefReadError error,
274 bool no_dir) { 284 bool no_dir) {
275 scoped_ptr<base::Value> value(value_owned); 285 scoped_ptr<base::Value> value(value_owned);
276 read_error_ = error; 286 read_error_ = error;
277 287
(...skipping 22 matching lines...) Expand all
300 // If the file just doesn't exist, maybe this is first run. In any case 310 // If the file just doesn't exist, maybe this is first run. In any case
301 // there's no harm in writing out default prefs in this case. 311 // there's no harm in writing out default prefs in this case.
302 break; 312 break;
303 case PREF_READ_ERROR_JSON_PARSE: 313 case PREF_READ_ERROR_JSON_PARSE:
304 case PREF_READ_ERROR_JSON_REPEAT: 314 case PREF_READ_ERROR_JSON_REPEAT:
305 break; 315 break;
306 default: 316 default:
307 NOTREACHED() << "Unknown error: " << error; 317 NOTREACHED() << "Unknown error: " << error;
308 } 318 }
309 319
320 if (pref_filter_)
321 pref_filter_->FilterOnLoad(prefs_.get());
322
310 if (error_delegate_.get() && error != PREF_READ_ERROR_NONE) 323 if (error_delegate_.get() && error != PREF_READ_ERROR_NONE)
311 error_delegate_->OnError(error); 324 error_delegate_->OnError(error);
312 325
313 FOR_EACH_OBSERVER(PrefStore::Observer, 326 FOR_EACH_OBSERVER(PrefStore::Observer,
314 observers_, 327 observers_,
315 OnInitializationCompleted(true)); 328 OnInitializationCompleted(true));
316 } 329 }
317 330
318 JsonPrefStore::~JsonPrefStore() { 331 JsonPrefStore::~JsonPrefStore() {
319 CommitPendingWrite(); 332 CommitPendingWrite();
320 } 333 }
321 334
322 bool JsonPrefStore::SerializeData(std::string* output) { 335 bool JsonPrefStore::SerializeData(std::string* output) {
323 JSONStringValueSerializer serializer(output); 336 JSONStringValueSerializer serializer(output);
324 serializer.set_pretty_print(true); 337 serializer.set_pretty_print(true);
325 return serializer.Serialize(*prefs_); 338 return serializer.Serialize(*prefs_);
326 } 339 }
OLDNEW
« no previous file with comments | « base/prefs/json_pref_store.h ('k') | base/prefs/json_pref_store_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698