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

Side by Side Diff: content/browser/leveldb_wrapper_impl.cc

Issue 2824193002: Enable use_once_callback for //content/common/*.mojom (Closed)
Patch Set: rebase Created 3 years, 7 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "content/browser/leveldb_wrapper_impl.h" 5 #include "content/browser/leveldb_wrapper_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/metrics/histogram_macros.h" 8 #include "base/metrics/histogram_macros.h"
9 #include "base/threading/thread_task_runner_handle.h" 9 #include "base/threading/thread_task_runner_handle.h"
10 #include "components/leveldb/public/cpp/util.h" 10 #include "components/leveldb/public/cpp/util.h"
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 void LevelDBWrapperImpl::AddObserver( 102 void LevelDBWrapperImpl::AddObserver(
103 mojom::LevelDBObserverAssociatedPtrInfo observer) { 103 mojom::LevelDBObserverAssociatedPtrInfo observer) {
104 mojom::LevelDBObserverAssociatedPtr observer_ptr; 104 mojom::LevelDBObserverAssociatedPtr observer_ptr;
105 observer_ptr.Bind(std::move(observer)); 105 observer_ptr.Bind(std::move(observer));
106 observers_.AddPtr(std::move(observer_ptr)); 106 observers_.AddPtr(std::move(observer_ptr));
107 } 107 }
108 108
109 void LevelDBWrapperImpl::Put(const std::vector<uint8_t>& key, 109 void LevelDBWrapperImpl::Put(const std::vector<uint8_t>& key,
110 const std::vector<uint8_t>& value, 110 const std::vector<uint8_t>& value,
111 const std::string& source, 111 const std::string& source,
112 const PutCallback& callback) { 112 PutCallback callback) {
113 if (!map_) { 113 if (!map_) {
114 LoadMap(base::Bind(&LevelDBWrapperImpl::Put, base::Unretained(this), key, 114 LoadMap(base::Bind(&LevelDBWrapperImpl::Put, base::Unretained(this), key,
115 value, source, callback)); 115 value, source, base::Passed(&callback)));
116 return; 116 return;
117 } 117 }
118 118
119 bool has_old_item = false; 119 bool has_old_item = false;
120 size_t old_item_size = 0; 120 size_t old_item_size = 0;
121 auto found = map_->find(key); 121 auto found = map_->find(key);
122 if (found != map_->end()) { 122 if (found != map_->end()) {
123 if (found->second == value) { 123 if (found->second == value) {
124 callback.Run(true); // Key already has this value. 124 std::move(callback).Run(true); // Key already has this value.
125 return; 125 return;
126 } 126 }
127 old_item_size = key.size() + found->second.size(); 127 old_item_size = key.size() + found->second.size();
128 has_old_item = true; 128 has_old_item = true;
129 } 129 }
130 size_t new_item_size = key.size() + value.size(); 130 size_t new_item_size = key.size() + value.size();
131 size_t new_bytes_used = bytes_used_ - old_item_size + new_item_size; 131 size_t new_bytes_used = bytes_used_ - old_item_size + new_item_size;
132 132
133 // Only check quota if the size is increasing, this allows 133 // Only check quota if the size is increasing, this allows
134 // shrinking changes to pre-existing maps that are over budget. 134 // shrinking changes to pre-existing maps that are over budget.
135 if (new_item_size > old_item_size && new_bytes_used > max_size_) { 135 if (new_item_size > old_item_size && new_bytes_used > max_size_) {
136 callback.Run(false); 136 std::move(callback).Run(false);
137 return; 137 return;
138 } 138 }
139 139
140 if (database_) { 140 if (database_) {
141 CreateCommitBatchIfNeeded(); 141 CreateCommitBatchIfNeeded();
142 commit_batch_->changed_keys.insert(key); 142 commit_batch_->changed_keys.insert(key);
143 } 143 }
144 144
145 std::vector<uint8_t> old_value; 145 std::vector<uint8_t> old_value;
146 if (has_old_item) { 146 if (has_old_item) {
147 old_value.swap((*map_)[key]); 147 old_value.swap((*map_)[key]);
148 } 148 }
149 (*map_)[key] = value; 149 (*map_)[key] = value;
150 bytes_used_ = new_bytes_used; 150 bytes_used_ = new_bytes_used;
151 if (!has_old_item) { 151 if (!has_old_item) {
152 // We added a new key/value pair. 152 // We added a new key/value pair.
153 observers_.ForAllPtrs( 153 observers_.ForAllPtrs(
154 [&key, &value, &source](mojom::LevelDBObserver* observer) { 154 [&key, &value, &source](mojom::LevelDBObserver* observer) {
155 observer->KeyAdded(key, value, source); 155 observer->KeyAdded(key, value, source);
156 }); 156 });
157 } else { 157 } else {
158 // We changed the value for an existing key. 158 // We changed the value for an existing key.
159 observers_.ForAllPtrs( 159 observers_.ForAllPtrs(
160 [&key, &value, &source, &old_value](mojom::LevelDBObserver* observer) { 160 [&key, &value, &source, &old_value](mojom::LevelDBObserver* observer) {
161 observer->KeyChanged(key, value, old_value, source); 161 observer->KeyChanged(key, value, old_value, source);
162 }); 162 });
163 } 163 }
164 callback.Run(true); 164 std::move(callback).Run(true);
165 } 165 }
166 166
167 void LevelDBWrapperImpl::Delete(const std::vector<uint8_t>& key, 167 void LevelDBWrapperImpl::Delete(const std::vector<uint8_t>& key,
168 const std::string& source, 168 const std::string& source,
169 const DeleteCallback& callback) { 169 DeleteCallback callback) {
170 if (!map_) { 170 if (!map_) {
171 LoadMap(base::Bind(&LevelDBWrapperImpl::Delete, base::Unretained(this), key, 171 LoadMap(base::Bind(&LevelDBWrapperImpl::Delete, base::Unretained(this), key,
172 source, callback)); 172 source, base::Passed(&callback)));
173 return; 173 return;
174 } 174 }
175 175
176 auto found = map_->find(key); 176 auto found = map_->find(key);
177 if (found == map_->end()) { 177 if (found == map_->end()) {
178 callback.Run(true); 178 std::move(callback).Run(true);
179 return; 179 return;
180 } 180 }
181 181
182 if (database_) { 182 if (database_) {
183 CreateCommitBatchIfNeeded(); 183 CreateCommitBatchIfNeeded();
184 commit_batch_->changed_keys.insert(std::move(found->first)); 184 commit_batch_->changed_keys.insert(std::move(found->first));
185 } 185 }
186 186
187 std::vector<uint8_t> old_value(std::move(found->second)); 187 std::vector<uint8_t> old_value(std::move(found->second));
188 map_->erase(found); 188 map_->erase(found);
189 bytes_used_ -= key.size() + old_value.size(); 189 bytes_used_ -= key.size() + old_value.size();
190 observers_.ForAllPtrs( 190 observers_.ForAllPtrs(
191 [&key, &source, &old_value](mojom::LevelDBObserver* observer) { 191 [&key, &source, &old_value](mojom::LevelDBObserver* observer) {
192 observer->KeyDeleted(key, old_value, source); 192 observer->KeyDeleted(key, old_value, source);
193 }); 193 });
194 callback.Run(true); 194 std::move(callback).Run(true);
195 } 195 }
196 196
197 void LevelDBWrapperImpl::DeleteAll(const std::string& source, 197 void LevelDBWrapperImpl::DeleteAll(const std::string& source,
198 const DeleteAllCallback& callback) { 198 DeleteAllCallback callback) {
199 if (!map_) { 199 if (!map_) {
200 LoadMap( 200 LoadMap(base::Bind(&LevelDBWrapperImpl::DeleteAll, base::Unretained(this),
201 base::Bind(&LevelDBWrapperImpl::DeleteAll, base::Unretained(this), 201 source, base::Passed(&callback)));
202 source, callback));
203 return; 202 return;
204 } 203 }
205 204
206 if (map_->empty()) { 205 if (map_->empty()) {
207 callback.Run(true); 206 std::move(callback).Run(true);
208 return; 207 return;
209 } 208 }
210 209
211 if (database_) { 210 if (database_) {
212 CreateCommitBatchIfNeeded(); 211 CreateCommitBatchIfNeeded();
213 commit_batch_->clear_all_first = true; 212 commit_batch_->clear_all_first = true;
214 commit_batch_->changed_keys.clear(); 213 commit_batch_->changed_keys.clear();
215 } 214 }
216 215
217 map_->clear(); 216 map_->clear();
218 bytes_used_ = 0; 217 bytes_used_ = 0;
219 observers_.ForAllPtrs( 218 observers_.ForAllPtrs(
220 [&source](mojom::LevelDBObserver* observer) { 219 [&source](mojom::LevelDBObserver* observer) {
221 observer->AllDeleted(source); 220 observer->AllDeleted(source);
222 }); 221 });
223 callback.Run(true); 222 std::move(callback).Run(true);
224 } 223 }
225 224
226 void LevelDBWrapperImpl::Get(const std::vector<uint8_t>& key, 225 void LevelDBWrapperImpl::Get(const std::vector<uint8_t>& key,
227 const GetCallback& callback) { 226 GetCallback callback) {
228 if (!map_) { 227 if (!map_) {
229 LoadMap(base::Bind(&LevelDBWrapperImpl::Get, base::Unretained(this), key, 228 LoadMap(base::Bind(&LevelDBWrapperImpl::Get, base::Unretained(this), key,
230 callback)); 229 base::Passed(&callback)));
231 return; 230 return;
232 } 231 }
233 232
234 auto found = map_->find(key); 233 auto found = map_->find(key);
235 if (found == map_->end()) { 234 if (found == map_->end()) {
236 callback.Run(false, std::vector<uint8_t>()); 235 std::move(callback).Run(false, std::vector<uint8_t>());
237 return; 236 return;
238 } 237 }
239 callback.Run(true, found->second); 238 std::move(callback).Run(true, found->second);
240 } 239 }
241 240
242 void LevelDBWrapperImpl::GetAll( 241 void LevelDBWrapperImpl::GetAll(
243 mojom::LevelDBWrapperGetAllCallbackAssociatedPtrInfo complete_callback, 242 mojom::LevelDBWrapperGetAllCallbackAssociatedPtrInfo complete_callback,
244 const GetAllCallback& callback) { 243 GetAllCallback callback) {
245 if (!map_) { 244 if (!map_) {
246 LoadMap(base::Bind(&LevelDBWrapperImpl::GetAll, base::Unretained(this), 245 LoadMap(base::Bind(&LevelDBWrapperImpl::GetAll, base::Unretained(this),
247 base::Passed(std::move(complete_callback)), callback)); 246 base::Passed(&complete_callback),
247 base::Passed(&callback)));
248 return; 248 return;
249 } 249 }
250 250
251 std::vector<mojom::KeyValuePtr> all; 251 std::vector<mojom::KeyValuePtr> all;
252 for (const auto& it : (*map_)) { 252 for (const auto& it : (*map_)) {
253 mojom::KeyValuePtr kv = mojom::KeyValue::New(); 253 mojom::KeyValuePtr kv = mojom::KeyValue::New();
254 kv->key = it.first; 254 kv->key = it.first;
255 kv->value = it.second; 255 kv->value = it.second;
256 all.push_back(std::move(kv)); 256 all.push_back(std::move(kv));
257 } 257 }
258 callback.Run(leveldb::mojom::DatabaseError::OK, std::move(all)); 258 std::move(callback).Run(leveldb::mojom::DatabaseError::OK, std::move(all));
259 if (complete_callback.is_valid()) { 259 if (complete_callback.is_valid()) {
260 mojom::LevelDBWrapperGetAllCallbackAssociatedPtr complete_ptr; 260 mojom::LevelDBWrapperGetAllCallbackAssociatedPtr complete_ptr;
261 complete_ptr.Bind(std::move(complete_callback)); 261 complete_ptr.Bind(std::move(complete_callback));
262 complete_ptr->Complete(true); 262 complete_ptr->Complete(true);
263 } 263 }
264 } 264 }
265 265
266 void LevelDBWrapperImpl::OnConnectionError() { 266 void LevelDBWrapperImpl::OnConnectionError() {
267 if (!bindings_.empty()) 267 if (!bindings_.empty())
268 return; 268 return;
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 weak_ptr_factory_.GetWeakPtr())); 436 weak_ptr_factory_.GetWeakPtr()));
437 } 437 }
438 438
439 void LevelDBWrapperImpl::OnCommitComplete(leveldb::mojom::DatabaseError error) { 439 void LevelDBWrapperImpl::OnCommitComplete(leveldb::mojom::DatabaseError error) {
440 --commit_batches_in_flight_; 440 --commit_batches_in_flight_;
441 StartCommitTimer(); 441 StartCommitTimer();
442 delegate_->DidCommit(error); 442 delegate_->DidCommit(error);
443 } 443 }
444 444
445 } // namespace content 445 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/leveldb_wrapper_impl.h ('k') | content/browser/loader/mojo_async_resource_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698