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 84706a0ee5f73c995a39a4073ba5091997241743..ea6756b9e6ed6df33ada705fd9cd5ba356b87fa5 100644 |
--- a/chrome/chrome_watcher/chrome_watcher_main.cc |
+++ b/chrome/chrome_watcher/chrome_watcher_main.cc |
@@ -7,8 +7,10 @@ |
#include "base/at_exit.h" |
#include "base/command_line.h" |
#include "base/logging_win.h" |
+#include "base/process/process_handle.h" |
#include "base/template_util.h" |
#include "components/browser_watcher/exit_code_watcher_win.h" |
+#include "components/browser_watcher/exit_funnel_win.h" |
#include "components/browser_watcher/watcher_main_api_win.h" |
namespace { |
@@ -42,8 +44,30 @@ extern "C" int WatcherMain(const base::char16* registry_path) { |
// Attempt to wait on our parent process, and record its exit status. |
if (exit_code_watcher.ParseArguments( |
*base::CommandLine::ForCurrentProcess())) { |
+ base::ProcessHandle dupe = base::kNullProcessHandle; |
rvargas (doing something else)
2014/12/13 01:32:53
It would be nice to use base::Process here... but
|
+ // Duplicate the process handle for the exit funnel due to the wonky |
+ // process handle lifetime management in base. |
+ if (!::DuplicateHandle(base::GetCurrentProcessHandle(), |
+ exit_code_watcher.process(), |
+ base::GetCurrentProcessHandle(), |
+ &dupe, |
+ 0, |
+ FALSE, |
+ DUPLICATE_SAME_ACCESS)) { |
+ dupe = base::kNullProcessHandle; |
+ } |
+ |
// Wait on the process. |
exit_code_watcher.WaitForExit(); |
+ |
+ if (dupe != base::kNullProcessHandle) { |
+ browser_watcher::ExitFunnel funnel; |
+ funnel.Init(registry_path, dupe); |
+ funnel.RecordEvent(L"BrowserExit"); |
+ |
+ base::CloseProcessHandle(dupe); |
+ } |
+ |
ret = 0; |
} |