Index: win8/viewer/metro_viewer_process_host.cc |
diff --git a/win8/viewer/metro_viewer_process_host.cc b/win8/viewer/metro_viewer_process_host.cc |
index 276aa2c0b2f9265c6f6fea07f6f5a34d36ca9267..c75e1f4de4cf6cdbebf466902760c949757f5b12 100644 |
--- a/win8/viewer/metro_viewer_process_host.cc |
+++ b/win8/viewer/metro_viewer_process_host.cc |
@@ -67,20 +67,31 @@ MetroViewerProcessHost::~MetroViewerProcessHost() { |
channel_->Close(); |
if (message_filter_) { |
// Wait for the viewer process to go away. |
- if (viewer_process_id != base::kNullProcessId) { |
- base::ProcessHandle viewer_process = NULL; |
- base::OpenProcessHandleWithAccess( |
- viewer_process_id, |
- PROCESS_QUERY_INFORMATION | SYNCHRONIZE, |
- &viewer_process); |
- if (viewer_process) { |
+ DisposeViewer(viewer_process_id, false); |
+ channel_->RemoveFilter(message_filter_); |
+ } |
+ instance_ = NULL; |
+} |
+ |
+void MetroViewerProcessHost::DisposeViewer(base::ProcessId viewer_process_id, |
+ bool force_immediately) { |
+ if (viewer_process_id != base::kNullProcessId) { |
+ base::ProcessHandle viewer_process = NULL; |
+ base::OpenProcessHandleWithAccess(viewer_process_id, |
+ PROCESS_QUERY_INFORMATION | SYNCHRONIZE, |
+ &viewer_process); |
ananta
2014/09/20 00:32:54
You need to add PROCESS_TERMINATE to this mask
|
+ if (viewer_process) { |
+ if (force_immediately) { |
+ // In tests, we don't want to wait around for the viewer to |
+ // terminate, so kill it immediately. See http://crbug.com/411147 |
+ // for more details. |
+ ::TerminateProcess(viewer_process, 0); |
+ } else { |
::WaitForSingleObject(viewer_process, INFINITE); |
- ::CloseHandle(viewer_process); |
} |
+ ::CloseHandle(viewer_process); |
} |
- channel_->RemoveFilter(message_filter_); |
} |
- instance_ = NULL; |
} |
base::ProcessId MetroViewerProcessHost::GetViewerProcessId() { |