Index: util/win/exception_handler_server.cc |
diff --git a/util/win/exception_handler_server.cc b/util/win/exception_handler_server.cc |
index bcdec6a21d43b10ed14b077bc0b6f2d69ebb5038..fba8c1a310213e78876424eef5d07308034bfff9 100644 |
--- a/util/win/exception_handler_server.cc |
+++ b/util/win/exception_handler_server.cc |
@@ -113,6 +113,8 @@ class ClientData { |
delegate_(delegate), |
dump_requested_event_( |
CreateEvent(nullptr, false /* auto reset */, false, nullptr)), |
+ dump_completed_event_( |
+ CreateEvent(nullptr, false /* auto reset */, false, nullptr)), |
process_(process.Pass()), |
exception_information_address_(exception_information_address) { |
RegisterThreadPoolWaits(dump_request_callback, process_end_callback); |
@@ -129,6 +131,7 @@ class ClientData { |
HANDLE port() const { return port_; } |
ExceptionHandlerServer::Delegate* delegate() const { return delegate_; } |
HANDLE dump_requested_event() const { return dump_requested_event_.get(); } |
+ HANDLE dump_completed_event() const { return dump_completed_event_.get(); } |
WinVMAddress exception_information_address() const { |
return exception_information_address_; |
} |
@@ -175,6 +178,7 @@ class ClientData { |
HANDLE port_; // weak |
ExceptionHandlerServer::Delegate* delegate_; // weak |
ScopedKernelHANDLE dump_requested_event_; |
+ ScopedKernelHANDLE dump_completed_event_; |
ScopedKernelHANDLE process_; |
WinVMAddress exception_information_address_; |
@@ -379,6 +383,9 @@ bool ExceptionHandlerServer::ServiceClientConnection( |
response.registration.request_report_event = |
base::checked_cast<uint32_t>(reinterpret_cast<uintptr_t>( |
DuplicateEvent(client->process(), client->dump_requested_event()))); |
+ response.registration.report_completed_event = |
+ base::checked_cast<uint32_t>(reinterpret_cast<uintptr_t>( |
+ DuplicateEvent(client->process(), client->dump_completed_event()))); |
if (!LoggingWriteFile(service_context.pipe(), &response, sizeof(response))) |
return false; |
@@ -414,10 +421,11 @@ void __stdcall ExceptionHandlerServer::OnDumpEvent(void* ctx, BOOLEAN) { |
base::AutoLock lock(*client->lock()); |
// Capture the exception. |
- unsigned int exit_code = client->delegate()->ExceptionHandlerServerException( |
+ client->delegate()->ExceptionHandlerServerException( |
client->process(), client->exception_information_address()); |
- TerminateProcess(client->process(), exit_code); |
+ // Release the client. |
+ SetEvent(client->dump_completed_event()); |
Mark Mentovai
2015/09/23 20:00:52
PLOG_IF this fails.
scottmg
2015/09/24 19:16:52
Done.
|
} |
// static |