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

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

Issue 2420133002: Make module enumeration a low priority background task. (Closed)
Patch Set: Fix small bug. Created 4 years, 2 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/ui/webui/conflicts_ui.cc ('k') | chrome/browser/win/enumerate_modules_model.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/win/enumerate_modules_model.h
diff --git a/chrome/browser/win/enumerate_modules_model.h b/chrome/browser/win/enumerate_modules_model.h
index 5b3beac73a192659018ac600f5b962a267df06c1..045e05c027dc5617944d64b30378461c9ab5a24f 100644
--- a/chrome/browser/win/enumerate_modules_model.h
+++ b/chrome/browser/win/enumerate_modules_model.h
@@ -155,28 +155,51 @@ class ModuleEnumerator {
// will notify when done by calling the DoneScanning method of |observer_|.
void ScanNow(ModulesVector* list);
+ // Sets |per_module_delay_| to zero, causing the modules to be inspected
+ // in realtime.
+ void SetPerModuleDelayToZero();
+
private:
FRIEND_TEST_ALL_PREFIXES(EnumerateModulesTest, CollapsePath);
- // This function does the actual file scanning work in the blocking pool. It
- // enumerates all loaded modules in the process and other modules of interest,
- // such as the registered Winsock LSP modules and stores them in
- // |enumerated_modules_|. It then normalizes the module info and matches them
- // against a blacklist of known bad modules. Finally, notifies the observer
- // that the enumeration is complete by invoking DoneScanning.
- void ScanImpl();
-
- // Enumerate all modules loaded into the Chrome process.
+ // This function enumerates all modules in the blocking pool. Once the list of
+ // module filenames is populated it posts a delayed task to call
+ // ScanImplDelay for the first module.
+ void ScanImplStart();
+
+ // Immediately posts a CONTINUE_ON_SHUTDOWN task to ScanImplModule for the
+ // given module. This ping-ponging is because the blocking pool does not
+ // offer a delayed CONTINUE_ON_SHUTDOWN task.
+ // TODO(chrisha): When the new scheduler enables delayed CONTINUE_ON_SHUTDOWN
+ // tasks, simplify this logic.
+ void ScanImplDelay(size_t index);
+
+ // Inspects the module in |enumerated_modules_| at the given |index|. Gets
+ // module information, normalizes it, and collapses the path. This is an
+ // expensive operation and non-critical. Posts a delayed task to ScanImplDelay
+ // for the next module. When all modules are finished forwards directly to
+ // ScanImplFinish.
+ void ScanImplModule(size_t index);
+
+ // Collects metrics and notifies the observer that the enumeration is complete
+ // by invoking DoneScanning on the UI thread.
+ void ScanImplFinish();
+
+ // Enumerate all modules loaded into the Chrome process. Creates empty
+ // entries in |enumerated_modules_| with a populated |location| field.
void EnumerateLoadedModules();
- // Enumerate all registered Windows shell extensions.
+ // Enumerate all registered Windows shell extensions. Creates empty
+ // entries in |enumerated_modules_| with a populated |location| field.
void EnumerateShellExtensions();
- // Enumerate all registered Winsock LSP modules.
+ // Enumerate all registered Winsock LSP modules. Creates empty
+ // entries in |enumerated_modules_| with a populated |location| field.
void EnumerateWinsockModules();
// Reads the registered shell extensions found under |parent| key in the
- // registry.
+ // registry. Creates empty entries in |enumerated_modules_| with a populated
+ // |location| field.
void ReadShellExtensions(HKEY parent);
// Given a |module|, initializes the structure and loads additional
@@ -202,8 +225,7 @@ class ModuleEnumerator {
void CollapsePath(Module* module);
// Reports (via UMA) a handful of high-level metrics regarding third party
- // modules in this process. Called by ScanImpl after modules have been
- // enumerated and processed.
+ // modules in this process. Called by ScanImplFinish.
void ReportThirdPartyMetrics();
// The typedef for the vector that maps a regular file path to %env_var%.
@@ -220,6 +242,19 @@ class ModuleEnumerator {
// The observer, which needs to be notified when the scan is complete.
EnumerateModulesModel* observer_;
+ // The delay that is observed between module inspection tasks. This is
+ // currently 1 second, which means it takes several minutes to iterate over
+ // all modules on average.
+ base::TimeDelta per_module_delay_;
+
+ // The amount of time taken for on-disk module inspection. Reported in
+ // ScanImplFinish.
+ base::TimeDelta enumeration_inspection_time_;
+
+ // The total amount of time taken for module enumeration. Reported in
+ // ScanImplFinish.
+ base::TimeDelta enumeration_total_time_;
+
DISALLOW_COPY_AND_ASSIGN(ModuleEnumerator);
};
@@ -295,10 +330,14 @@ class EnumerateModulesModel {
int modules_to_notify_about() const;
// Checks to see if a scanning task should be started and sets one off, if so.
+ // This will cause ScanNow to be invoked in background mode.
void MaybePostScanningTask();
- // Asynchronously start the scan for the loaded module list.
- void ScanNow();
+ // Asynchronously start the scan for the loaded module list. If
+ // |background_mode| is true the scan will happen slowly over a process of
+ // minutes, spread across dozens or even hundreds of delayed tasks. Otherwise
+ // the processing will occur in a single task.
+ void ScanNow(bool background_mode);
// Gets the whole module list as a ListValue.
base::ListValue* GetModuleList();
« no previous file with comments | « chrome/browser/ui/webui/conflicts_ui.cc ('k') | chrome/browser/win/enumerate_modules_model.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698