OLD | NEW |
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 Loading... |
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_on_io_(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_on_io_.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 Loading... |
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_on_io_.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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 } | 216 } |
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, |
224 base::Unretained(this), callback_task_runner, | 227 base::Bind(&V4Database::VerifyChecksumOnTaskRunner, |
225 db_ready_for_updates_callback)); | 228 weak_factory_on_io_.GetWeakPtr(), callback_task_runner, |
| 229 db_ready_for_updates_callback)); |
226 } | 230 } |
227 | 231 |
228 void V4Database::VerifyChecksumOnTaskRunner( | 232 void V4Database::VerifyChecksumOnTaskRunner( |
229 const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner, | 233 const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner, |
230 DatabaseReadyForUpdatesCallback db_ready_for_updates_callback) { | 234 DatabaseReadyForUpdatesCallback db_ready_for_updates_callback) { |
231 std::vector<ListIdentifier> stores_to_reset; | 235 std::vector<ListIdentifier> stores_to_reset; |
232 for (const auto& store_map_iter : *store_map_) { | 236 for (const auto& store_map_iter : *store_map_) { |
233 if (!store_map_iter.second->VerifyChecksum()) { | 237 if (!store_map_iter.second->VerifyChecksum()) { |
234 stores_to_reset.push_back(store_map_iter.first); | 238 stores_to_reset.push_back(store_map_iter.first); |
235 } | 239 } |
(...skipping 22 matching lines...) Expand all Loading... |
258 filename_(filename), | 262 filename_(filename), |
259 list_id_(list_id), | 263 list_id_(list_id), |
260 sb_threat_type_(sb_threat_type) { | 264 sb_threat_type_(sb_threat_type) { |
261 DCHECK(!fetch_updates_ || !filename_.empty()); | 265 DCHECK(!fetch_updates_ || !filename_.empty()); |
262 DCHECK_NE(SB_THREAT_TYPE_SAFE, sb_threat_type_); | 266 DCHECK_NE(SB_THREAT_TYPE_SAFE, sb_threat_type_); |
263 } | 267 } |
264 | 268 |
265 ListInfo::~ListInfo() {} | 269 ListInfo::~ListInfo() {} |
266 | 270 |
267 } // namespace safe_browsing | 271 } // namespace safe_browsing |
OLD | NEW |