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

Side by Side Diff: chrome/browser/value_store/caching_value_store.cc

Issue 10545128: Unrevert r141537: Add extensions::StateStore and use that instead of (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix.crash Created 8 years, 6 months 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/value_store/caching_value_store.h"
6
7 #include "chrome/browser/value_store/leveldb_value_store.h"
8 #include "content/public/browser/browser_thread.h"
9
10 using content::BrowserThread;
11
12 class CachingValueStore::Backend : public base::RefCountedThreadSafe<Backend> {
13 public:
14 typedef base::Callback<void(scoped_ptr<base::DictionaryValue>)> ReadyCallback;
15 Backend() : storage_(NULL) {}
16
17 void Init(const FilePath& db_path, ReadyCallback callback) {
18 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
19 base::Bind(&CachingValueStore::Backend::InitOnFileThread,
20 this, db_path, callback));
21 }
22
23 void Set(const std::string& key, scoped_ptr<base::Value> value) {
24 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
25 // We've already checked that the value has changed, so don't bother
26 // checking again. Also, skip changes to avoid wasted copies.
27 storage_->Set(ValueStore::IGNORE_QUOTA |
28 ValueStore::NO_GENERATE_CHANGES |
29 ValueStore::NO_CHECK_OLD_VALUE,
30 key, *value.get());
31 }
32
33 void Remove(const std::string& key) {
34 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
35 storage_->Remove(key);
36 }
37
38 private:
39 friend class base::RefCountedThreadSafe<Backend>;
40
41 virtual ~Backend() {
42 if (BrowserThread::CurrentlyOn(BrowserThread::FILE)) {
43 delete storage_;
44 } else {
45 BrowserThread::DeleteSoon(BrowserThread::FILE, FROM_HERE, storage_);
46 }
47 }
48
49 void InitOnFileThread(const FilePath& db_path, ReadyCallback callback) {
50 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
51 DCHECK(!storage_);
52 storage_ = LeveldbValueStore::Create(db_path);
53
54 ValueStore::ReadResult result = storage_->Get();
55 if (result->HasError()) {
56 callback.Run(scoped_ptr<base::DictionaryValue>(NULL));
57 } else {
58 callback.Run(result->settings().Pass());
59 }
60 }
61
62 // The actual ValueStore that handles persisting the data to disk. Used
63 // exclusively on the FILE thread.
64 LeveldbValueStore* storage_;
65
66 DISALLOW_COPY_AND_ASSIGN(Backend);
67 };
68
69 CachingValueStore::CachingValueStore(const FilePath& db_path)
70 : backend_(new Backend()) {
71 backend_->Init(db_path,
72 base::Bind(&CachingValueStore::OnBackendReady, AsWeakPtr()));
73 }
74
75 CachingValueStore::~CachingValueStore() {
76 }
77
78 bool CachingValueStore::Get(const std::string& key,
79 const base::Value** result) {
80 DCHECK(CalledOnValidThread());
81 DCHECK(IsInitialized());
82
83 base::Value* value = NULL;
84 if (cache_->GetWithoutPathExpansion(key, &value)) {
85 *result = value;
86 return true;
87 }
88 return false;
89 }
90
91 void CachingValueStore::Set(const std::string& key, base::Value* value) {
92 DCHECK(CalledOnValidThread());
93 DCHECK(IsInitialized());
94
95 scoped_ptr<base::Value> new_value(value);
96 base::Value* old_value = NULL;
97 if (!cache_->GetWithoutPathExpansion(key, &old_value) ||
98 !value->Equals(old_value)) {
99 cache_->SetWithoutPathExpansion(key, new_value.release());
100
101 scoped_ptr<base::Value> passed_value(value->DeepCopy());
102 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
103 base::Bind(&CachingValueStore::Backend::Set,
104 backend_, key, base::Passed(passed_value.Pass())));
105 }
106 }
107
108 void CachingValueStore::Remove(const std::string& key) {
109 DCHECK(CalledOnValidThread());
110 DCHECK(IsInitialized());
111
112 if (cache_->RemoveWithoutPathExpansion(key, NULL)) {
113 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
114 base::Bind(&CachingValueStore::Backend::Remove,
115 backend_, key));
116 }
117 }
118
119 bool CachingValueStore::IsInitialized() {
120 DCHECK(CalledOnValidThread());
121 return !!cache_.get();
122 }
123
124 void CachingValueStore::AddObserver(Observer* observer) {
125 DCHECK(CalledOnValidThread());
126 observers_.AddObserver(observer);
127 }
128
129 void CachingValueStore::RemoveObserver(Observer* observer) {
130 DCHECK(CalledOnValidThread());
131 observers_.RemoveObserver(observer);
132 }
133
134 void CachingValueStore::OnBackendReady(
135 scoped_ptr<base::DictionaryValue> values) {
136 DCHECK(CalledOnValidThread());
137 DCHECK(!cache_.get());
138 cache_.swap(values);
139
140 FOR_EACH_OBSERVER(Observer, observers_, OnInitializationComplete());
141 }
OLDNEW
« no previous file with comments | « chrome/browser/value_store/caching_value_store.h ('k') | chrome/browser/value_store/caching_value_store_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698