Chromium Code Reviews| 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_(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 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_.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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |