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

Unified Diff: chrome/browser/win/enumerate_modules_model.cc

Issue 2368393004: Move EnumerateModulesModel work to the blocking pool. (Closed)
Patch Set: Created 4 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/win/enumerate_modules_model.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/win/enumerate_modules_model.cc
diff --git a/chrome/browser/win/enumerate_modules_model.cc b/chrome/browser/win/enumerate_modules_model.cc
index ef0e556cdb2132e5572761c97e410005e45c05ce..4b64f86030b5113aeebd201b6b27385da2c42448 100644
--- a/chrome/browser/win/enumerate_modules_model.cc
+++ b/chrome/browser/win/enumerate_modules_model.cc
@@ -376,10 +376,15 @@ void ModuleEnumerator::ScanNow(ModulesVector* list) {
enumerated_modules_ = list;
// This object can't be reaped until it has finished scanning, so its safe
- // to post a raw pointer to another thread.
- BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
- base::Bind(&ModuleEnumerator::ScanImpl,
- base::Unretained(this)));
+ // to post a raw pointer to another thread. It will simply be leaked if the
+ // scanning has not been finished before shutdown.
+ auto* pool = BrowserThread::GetBlockingPool();
+ auto token = pool->GetSequenceToken();
+ auto runner = pool->GetSequencedTaskRunnerWithShutdownBehavior(
+ token, base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
+ runner->PostTask(FROM_HERE,
gab 2016/09/26 19:37:21 Since you don't need a SequencedTaskRunner for mul
chrisha 2016/09/26 19:58:17 Ah, even better, thanks.
+ base::Bind(&ModuleEnumerator::ScanImpl,
+ base::Unretained(this)));
}
void ModuleEnumerator::ScanImpl() {
@@ -721,10 +726,18 @@ void EnumerateModulesModel::MaybePostScanningTask() {
void EnumerateModulesModel::ScanNow() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- // If a module enumerator exists then a scan is already underway.
+ // If a module enumerator exists then a scan is already underway. The client
+ // will receive a notification from that thread.
if (module_enumerator_)
return;
+ // Only allow a single scan per process lifetime. Immediately notify any
+ // observers that the scan is complete.
+ if (!enumerated_modules_.empty()) {
+ FOR_EACH_OBSERVER(Observer, observers_, OnScanCompleted());
+ return;
+ }
gab 2016/09/26 19:37:21 I'm unclear on why this change is required/related
chrisha 2016/09/26 19:58:17 Oops, that was meant to be another CL. Will move i
+
// ScanNow does not block, rather it simply schedules a task.
module_enumerator_.reset(new ModuleEnumerator(this));
module_enumerator_->ScanNow(&enumerated_modules_);
« no previous file with comments | « chrome/browser/win/enumerate_modules_model.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698