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

Unified Diff: chrome/chrome_watcher/chrome_watcher_main.cc

Issue 886613002: Introduce the ability to wait for the watcher process to initialize. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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
Index: chrome/chrome_watcher/chrome_watcher_main.cc
diff --git a/chrome/chrome_watcher/chrome_watcher_main.cc b/chrome/chrome_watcher/chrome_watcher_main.cc
index 4bd8410b4bb18eb551f06a9d19bc857761aa31b9..d5a6b467f802a4c4d3f4c020a822380d8d4fc0fa 100644
--- a/chrome/chrome_watcher/chrome_watcher_main.cc
+++ b/chrome/chrome_watcher/chrome_watcher_main.cc
@@ -41,16 +41,20 @@ class BrowserMonitor {
BrowserMonitor(base::RunLoop* run_loop, const base::char16* registry_path);
~BrowserMonitor();
- // Starts the monitor, returns true on success.
+ // Starts the monitor, returns true on success. |on_initialized_event| will be
+ // signaled from the background thread immediately before blocking on the exit
Sigurður Ásgeirsson 2015/01/29 16:59:57 nit: the background thread is implementation detai
erikwright (departed) 2015/01/30 20:39:57 I have made an attempt. Note that the code as it s
+ // of |process|.
bool StartWatching(const base::char16* registry_path,
- base::Process process);
+ base::Process process,
+ base::win::ScopedHandle on_initialized_event);
private:
// Called from EndSessionWatcherWindow on a WM_ENDSESSION message.
void OnEndSession(LPARAM lparam);
- // Blocking function that runs on |background_thread_|.
- void Watch();
+ // Blocking function that runs on |background_thread_|. Signals
+ // |on_initialized_event| before waiting for the browser process to exit.
+ void Watch(base::win::ScopedHandle on_initialized_event);
// Posted to main thread from Watch when browser exits.
void BrowserExited();
@@ -88,8 +92,10 @@ BrowserMonitor::BrowserMonitor(base::RunLoop* run_loop,
BrowserMonitor::~BrowserMonitor() {
}
-bool BrowserMonitor::StartWatching(const base::char16* registry_path,
- base::Process process) {
+bool BrowserMonitor::StartWatching(
+ const base::char16* registry_path,
+ base::Process process,
+ base::win::ScopedHandle on_initialized_event) {
if (!exit_code_watcher_.Initialize(process.Pass()))
return false;
@@ -103,8 +109,9 @@ bool BrowserMonitor::StartWatching(const base::char16* registry_path,
return false;
}
- if (!background_thread_.task_runner()->PostTask(FROM_HERE,
- base::Bind(&BrowserMonitor::Watch, base::Unretained(this)))) {
+ if (!background_thread_.task_runner()->PostTask(
+ FROM_HERE, base::Bind(&BrowserMonitor::Watch, base::Unretained(this),
+ base::Passed(&on_initialized_event)))) {
Sigurður Ásgeirsson 2015/01/29 16:59:57 ugh - this syntax irks me, but I guess that's just
erikwright (departed) 2015/01/30 20:39:57 You mean base::Passed(&movable)? I replaced it wit
Sigurður Ásgeirsson 2015/02/02 16:59:20 It's probably just me - but base::Passed(&movable)
erikwright (departed) 2015/02/03 20:05:34 Acknowledged.
background_thread_.Stop();
return false;
}
@@ -132,10 +139,15 @@ void BrowserMonitor::OnEndSession(LPARAM lparam) {
run_loop_->Quit();
}
-void BrowserMonitor::Watch() {
+void BrowserMonitor::Watch(base::win::ScopedHandle on_initialized_event) {
// This needs to run on an IO thread.
DCHECK_NE(main_thread_, base::MessageLoopProxy::current());
+ // Signal our client now that RPC is initialized and we have cleared all of
Sigurður Ásgeirsson 2015/01/29 16:59:57 RPC?
erikwright (departed) 2015/01/30 20:39:57 Done.
+ // the obstacles that might lead to an early exit.
+ ::SetEvent(on_initialized_event.Get());
+ on_initialized_event.Close();
+
exit_code_watcher_.WaitForExit();
exit_funnel_.RecordEvent(L"BrowserExit");
@@ -172,8 +184,10 @@ void BrowserMonitor::BrowserExited() {
// The main entry point to the watcher, declared as extern "C" to avoid name
// mangling.
extern "C" int WatcherMain(const base::char16* registry_path,
- HANDLE process_handle) {
+ HANDLE process_handle,
+ HANDLE on_initialized_event_handle) {
base::Process process(process_handle);
+ base::win::ScopedHandle on_initialized_event(on_initialized_event_handle);
// The exit manager is in charge of calling the dtors of singletons.
base::AtExitManager exit_manager;
@@ -192,8 +206,10 @@ extern "C" int WatcherMain(const base::char16* registry_path,
base::RunLoop run_loop;
BrowserMonitor monitor(&run_loop, registry_path);
- if (!monitor.StartWatching(registry_path, process.Pass()))
+ if (!monitor.StartWatching(registry_path, process.Pass(),
+ on_initialized_event.Pass())) {
return 1;
+ }
run_loop.Run();

Powered by Google App Engine
This is Rietveld 408576698