Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 "chrome/browser/conflicts/module_database_win.h" | 5 #include "chrome/browser/conflicts/module_database_win.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <tuple> | 8 #include <tuple> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "chrome/browser/conflicts/module_database_observer_win.h" | |
| 11 | 12 |
| 12 namespace { | 13 namespace { |
| 13 | 14 |
| 14 // Document the assumptions made on the ProcessType enum in order to convert | 15 // Document the assumptions made on the ProcessType enum in order to convert |
| 15 // them to bits. | 16 // them to bits. |
| 16 static_assert(content::PROCESS_TYPE_UNKNOWN == 1, | 17 static_assert(content::PROCESS_TYPE_UNKNOWN == 1, |
| 17 "assumes unknown process type has value 1"); | 18 "assumes unknown process type has value 1"); |
| 18 static_assert(content::PROCESS_TYPE_BROWSER == 2, | 19 static_assert(content::PROCESS_TYPE_BROWSER == 2, |
| 19 "assumes browser process type has value 2"); | 20 "assumes browser process type has value 2"); |
| 20 constexpr uint32_t kFirstValidProcessType = content::PROCESS_TYPE_BROWSER; | 21 constexpr uint32_t kFirstValidProcessType = content::PROCESS_TYPE_BROWSER; |
| 21 | 22 |
| 22 ModuleDatabase* g_instance = nullptr; | 23 ModuleDatabase* g_instance = nullptr; |
| 23 | 24 |
| 24 } // namespace | 25 } // namespace |
| 25 | 26 |
| 26 ModuleDatabase::ModuleDatabase( | 27 ModuleDatabase::ModuleDatabase( |
| 27 scoped_refptr<base::SequencedTaskRunner> task_runner) | 28 scoped_refptr<base::SequencedTaskRunner> task_runner) |
| 28 : task_runner_(std::move(task_runner)), | 29 : task_runner_(std::move(task_runner)), |
| 29 // ModuleDatabase owns |module_inspector_|, so it is safe to use | 30 // ModuleDatabase owns |module_inspector_|, so it is safe to use |
| 30 // base::Unretained(). | 31 // base::Unretained(). |
| 31 module_inspector_(base::Bind(&ModuleDatabase::OnModuleInspected, | 32 module_inspector_(base::Bind(&ModuleDatabase::OnModuleInspected, |
| 32 base::Unretained(this))), | 33 base::Unretained(this))), |
| 34 third_party_metrics_(this), | |
| 33 weak_ptr_factory_(this) {} | 35 weak_ptr_factory_(this) {} |
| 34 | 36 |
| 35 ModuleDatabase::~ModuleDatabase() { | 37 ModuleDatabase::~ModuleDatabase() { |
| 36 if (this == g_instance) | 38 if (this == g_instance) |
| 37 g_instance = nullptr; | 39 g_instance = nullptr; |
| 38 } | 40 } |
| 39 | 41 |
| 40 // static | 42 // static |
| 41 ModuleDatabase* ModuleDatabase::GetInstance() { | 43 ModuleDatabase* ModuleDatabase::GetInstance() { |
| 42 return g_instance; | 44 return g_instance; |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 145 task_runner_->PostTask( | 147 task_runner_->PostTask( |
| 146 FROM_HERE, | 148 FROM_HERE, |
| 147 base::Bind(&ModuleDatabase::OnProcessEnded, | 149 base::Bind(&ModuleDatabase::OnProcessEnded, |
| 148 weak_ptr_factory_.GetWeakPtr(), process_id, creation_time)); | 150 weak_ptr_factory_.GetWeakPtr(), process_id, creation_time)); |
| 149 return; | 151 return; |
| 150 } | 152 } |
| 151 | 153 |
| 152 DeleteProcessInfo(process_id, creation_time); | 154 DeleteProcessInfo(process_id, creation_time); |
| 153 } | 155 } |
| 154 | 156 |
| 157 void ModuleDatabase::AddObserver(ModuleDatabaseObserver* observer) { | |
| 158 observer_list_.AddObserver(observer); | |
| 159 for (const auto& module : modules_) { | |
| 160 if (module.second.inspection_result) | |
| 161 observer->OnNewModuleFound(module.first, module.second); | |
| 162 } | |
| 163 } | |
| 164 | |
| 165 void ModuleDatabase::RemoveObserver(ModuleDatabaseObserver* observer) { | |
| 166 observer_list_.RemoveObserver(observer); | |
| 167 } | |
| 168 | |
| 155 // static | 169 // static |
| 156 uint32_t ModuleDatabase::ProcessTypeToBit(content::ProcessType process_type) { | 170 uint32_t ModuleDatabase::ProcessTypeToBit(content::ProcessType process_type) { |
| 157 uint32_t bit_index = | 171 uint32_t bit_index = |
| 158 static_cast<uint32_t>(process_type) - kFirstValidProcessType; | 172 static_cast<uint32_t>(process_type) - kFirstValidProcessType; |
| 159 DCHECK_GE(31u, bit_index); | 173 DCHECK_GE(31u, bit_index); |
| 160 uint32_t bit = (1 << bit_index); | 174 uint32_t bit = (1 << bit_index); |
| 161 return bit; | 175 return bit; |
| 162 } | 176 } |
| 163 | 177 |
| 164 // static | 178 // static |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 330 ProcessInfoKey key(process_id, creation_time, content::PROCESS_TYPE_UNKNOWN); | 344 ProcessInfoKey key(process_id, creation_time, content::PROCESS_TYPE_UNKNOWN); |
| 331 processes_.erase(key); | 345 processes_.erase(key); |
| 332 } | 346 } |
| 333 | 347 |
| 334 void ModuleDatabase::OnModuleInspected( | 348 void ModuleDatabase::OnModuleInspected( |
| 335 const ModuleInfoKey& module_key, | 349 const ModuleInfoKey& module_key, |
| 336 std::unique_ptr<ModuleInspectionResult> inspection_result) { | 350 std::unique_ptr<ModuleInspectionResult> inspection_result) { |
| 337 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 351 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| 338 | 352 |
| 339 auto it = modules_.find(module_key); | 353 auto it = modules_.find(module_key); |
| 340 if (it != modules_.end()) | 354 if (it == modules_.end()) |
| 341 it->second.inspection_result = std::move(inspection_result); | 355 return; |
| 356 | |
| 357 it->second.inspection_result = std::move(inspection_result); | |
| 358 | |
| 359 for (auto& observer : observer_list_) | |
| 360 observer.OnNewModuleFound(it->first, it->second); | |
| 342 } | 361 } |
| 343 | 362 |
| 344 // ModuleDatabase::ProcessInfoKey ---------------------------------------------- | 363 // ModuleDatabase::ProcessInfoKey ---------------------------------------------- |
| 345 | 364 |
| 346 ModuleDatabase::ProcessInfoKey::ProcessInfoKey( | 365 ModuleDatabase::ProcessInfoKey::ProcessInfoKey( |
| 347 uint32_t process_id, | 366 uint32_t process_id, |
| 348 uint64_t creation_time, | 367 uint64_t creation_time, |
| 349 content::ProcessType process_type) | 368 content::ProcessType process_type) |
| 350 : process_id(process_id), | 369 : process_id(process_id), |
| 351 creation_time(creation_time), | 370 creation_time(creation_time), |
| 352 process_type(process_type) {} | 371 process_type(process_type) {} |
| 353 | 372 |
| 354 ModuleDatabase::ProcessInfoKey::~ProcessInfoKey() = default; | 373 ModuleDatabase::ProcessInfoKey::~ProcessInfoKey() = default; |
| 355 | 374 |
| 356 bool ModuleDatabase::ProcessInfoKey::operator<( | 375 bool ModuleDatabase::ProcessInfoKey::operator<( |
| 357 const ProcessInfoKey& pik) const { | 376 const ProcessInfoKey& pik) const { |
| 358 // The key consists of the pair of (process_id, creation_time). | 377 // The key consists of the pair of (process_id, creation_time). |
| 359 // Use the std::tuple lexicographic comparison operator. | 378 // Use the std::tuple lexicographic comparison operator. |
| 360 return std::make_tuple(process_id, creation_time) < | 379 return std::tie(process_id, creation_time) < |
|
chrisha
2017/05/02 21:28:25
I always forget about 'tie'....
| |
| 361 std::make_tuple(pik.process_id, pik.creation_time); | 380 std::tie(pik.process_id, pik.creation_time); |
| 362 } | 381 } |
| 363 | 382 |
| 364 // ModuleDatabase::ProcessInfoData --------------------------------------------- | 383 // ModuleDatabase::ProcessInfoData --------------------------------------------- |
| 365 | 384 |
| 366 ModuleDatabase::ProcessInfoData::ProcessInfoData() = default; | 385 ModuleDatabase::ProcessInfoData::ProcessInfoData() = default; |
| 367 | 386 |
| 368 ModuleDatabase::ProcessInfoData::ProcessInfoData(const ProcessInfoData& other) = | 387 ModuleDatabase::ProcessInfoData::ProcessInfoData(const ProcessInfoData& other) = |
| 369 default; | 388 default; |
| 370 | 389 |
| 371 ModuleDatabase::ProcessInfoData::~ProcessInfoData() = default; | 390 ModuleDatabase::ProcessInfoData::~ProcessInfoData() = default; |
| OLD | NEW |