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

Side by Side Diff: components/safe_browsing_db/v4_database.cc

Issue 2649643002: [S] Use a weak_factory for V4Database callbacks + test (Closed)
Patch Set: InvalidateWeakPtrs in V4Database::Destroy Created 3 years, 11 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 <memory> 5 #include <memory>
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/debug/leak_annotations.h" 8 #include "base/debug/leak_annotations.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 84
85 UMA_HISTOGRAM_TIMES("SafeBrowsing.V4DatabaseOpen.Time", 85 UMA_HISTOGRAM_TIMES("SafeBrowsing.V4DatabaseOpen.Time",
86 TimeTicks::Now() - create_start_time); 86 TimeTicks::Now() - create_start_time);
87 } 87 }
88 88
89 V4Database::V4Database( 89 V4Database::V4Database(
90 const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, 90 const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
91 std::unique_ptr<StoreMap> store_map) 91 std::unique_ptr<StoreMap> store_map)
92 : db_task_runner_(db_task_runner), 92 : db_task_runner_(db_task_runner),
93 store_map_(std::move(store_map)), 93 store_map_(std::move(store_map)),
94 pending_store_updates_(0) { 94 pending_store_updates_(0),
95 weak_factory_(this) {
95 DCHECK(db_task_runner->RunsTasksOnCurrentThread()); 96 DCHECK(db_task_runner->RunsTasksOnCurrentThread());
96 } 97 }
97 98
98 // static 99 // static
99 void V4Database::Destroy(std::unique_ptr<V4Database> v4_database) { 100 void V4Database::Destroy(std::unique_ptr<V4Database> v4_database) {
100 DCHECK_CURRENTLY_ON(BrowserThread::IO); 101 DCHECK_CURRENTLY_ON(BrowserThread::IO);
101 V4Database* v4_database_raw = v4_database.release(); 102 V4Database* v4_database_raw = v4_database.release();
102 if (v4_database_raw) { 103 if (v4_database_raw) {
104 v4_database_raw->weak_factory_.InvalidateWeakPtrs();
103 v4_database_raw->db_task_runner_->DeleteSoon(FROM_HERE, v4_database_raw); 105 v4_database_raw->db_task_runner_->DeleteSoon(FROM_HERE, v4_database_raw);
104 } 106 }
105 } 107 }
106 108
107 V4Database::~V4Database() { 109 V4Database::~V4Database() {
108 DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); 110 DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
109 } 111 }
110 112
111 void V4Database::ApplyUpdate( 113 void V4Database::ApplyUpdate(
112 std::unique_ptr<ParsedServerResponse> parsed_server_response, 114 std::unique_ptr<ParsedServerResponse> parsed_server_response,
(...skipping 10 matching lines...) Expand all
123 base::ThreadTaskRunnerHandle::Get(); 125 base::ThreadTaskRunnerHandle::Get();
124 for (std::unique_ptr<ListUpdateResponse>& response : 126 for (std::unique_ptr<ListUpdateResponse>& response :
125 *parsed_server_response) { 127 *parsed_server_response) {
126 ListIdentifier identifier(*response); 128 ListIdentifier identifier(*response);
127 StoreMap::const_iterator iter = store_map_->find(identifier); 129 StoreMap::const_iterator iter = store_map_->find(identifier);
128 if (iter != store_map_->end()) { 130 if (iter != store_map_->end()) {
129 const std::unique_ptr<V4Store>& old_store = iter->second; 131 const std::unique_ptr<V4Store>& old_store = iter->second;
130 if (old_store->state() != response->new_client_state()) { 132 if (old_store->state() != response->new_client_state()) {
131 // A different state implies there are updates to process. 133 // A different state implies there are updates to process.
132 pending_store_updates_++; 134 pending_store_updates_++;
133 UpdatedStoreReadyCallback store_ready_callback = base::Bind( 135 UpdatedStoreReadyCallback store_ready_callback =
134 &V4Database::UpdatedStoreReady, base::Unretained(this), identifier); 136 base::Bind(&V4Database::UpdatedStoreReady,
137 weak_factory_.GetWeakPtr(), identifier);
135 db_task_runner_->PostTask( 138 db_task_runner_->PostTask(
136 FROM_HERE, 139 FROM_HERE,
137 base::Bind(&V4Store::ApplyUpdate, base::Unretained(old_store.get()), 140 base::Bind(&V4Store::ApplyUpdate, base::Unretained(old_store.get()),
138 base::Passed(std::move(response)), current_task_runner, 141 base::Passed(std::move(response)), current_task_runner,
139 store_ready_callback)); 142 store_ready_callback));
140 } 143 }
141 } else { 144 } else {
142 NOTREACHED() << "Got update for unexpected identifier: " << identifier; 145 NOTREACHED() << "Got update for unexpected identifier: " << identifier;
143 } 146 }
144 } 147 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 } 217 }
215 218
216 void V4Database::VerifyChecksum( 219 void V4Database::VerifyChecksum(
217 DatabaseReadyForUpdatesCallback db_ready_for_updates_callback) { 220 DatabaseReadyForUpdatesCallback db_ready_for_updates_callback) {
218 DCHECK_CURRENTLY_ON(BrowserThread::IO); 221 DCHECK_CURRENTLY_ON(BrowserThread::IO);
219 // TODO(vakh): Consider using PostTaskAndReply instead. 222 // TODO(vakh): Consider using PostTaskAndReply instead.
220 const scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner = 223 const scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner =
221 base::ThreadTaskRunnerHandle::Get(); 224 base::ThreadTaskRunnerHandle::Get();
222 db_task_runner_->PostTask( 225 db_task_runner_->PostTask(
223 FROM_HERE, base::Bind(&V4Database::VerifyChecksumOnTaskRunner, 226 FROM_HERE, base::Bind(&V4Database::VerifyChecksumOnTaskRunner,
224 base::Unretained(this), callback_task_runner, 227 weak_factory_.GetWeakPtr(), callback_task_runner,
Nathan Parker 2017/01/21 01:01:08 Hmm, but this one is going to get checked on the t
vakh (use Gerrit instead) 2017/01/21 01:16:31 The GetWeakPtr method has been called on the IO th
Scott Hess - ex-Googler 2017/01/21 04:18:20 Oh no! I think this is what I was worrying about!
225 db_ready_for_updates_callback)); 228 db_ready_for_updates_callback));
226 } 229 }
227 230
228 void V4Database::VerifyChecksumOnTaskRunner( 231 void V4Database::VerifyChecksumOnTaskRunner(
229 const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner, 232 const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner,
230 DatabaseReadyForUpdatesCallback db_ready_for_updates_callback) { 233 DatabaseReadyForUpdatesCallback db_ready_for_updates_callback) {
231 std::vector<ListIdentifier> stores_to_reset; 234 std::vector<ListIdentifier> stores_to_reset;
232 for (const auto& store_map_iter : *store_map_) { 235 for (const auto& store_map_iter : *store_map_) {
233 if (!store_map_iter.second->VerifyChecksum()) { 236 if (!store_map_iter.second->VerifyChecksum()) {
234 stores_to_reset.push_back(store_map_iter.first); 237 stores_to_reset.push_back(store_map_iter.first);
(...skipping 23 matching lines...) Expand all
258 filename_(filename), 261 filename_(filename),
259 list_id_(list_id), 262 list_id_(list_id),
260 sb_threat_type_(sb_threat_type) { 263 sb_threat_type_(sb_threat_type) {
261 DCHECK(!fetch_updates_ || !filename_.empty()); 264 DCHECK(!fetch_updates_ || !filename_.empty());
262 DCHECK_NE(SB_THREAT_TYPE_SAFE, sb_threat_type_); 265 DCHECK_NE(SB_THREAT_TYPE_SAFE, sb_threat_type_);
263 } 266 }
264 267
265 ListInfo::~ListInfo() {} 268 ListInfo::~ListInfo() {}
266 269
267 } // namespace safe_browsing 270 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698