diff options
author | ted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2011-11-11 19:05:51 +0000 |
---|---|---|
committer | ted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2011-11-11 19:05:51 +0000 |
commit | 06cede988b4d15b4d6b7e759fda676bfe3455682 (patch) | |
tree | fbe6cc1e33d29d251cf912aac1f35a5e7d823274 /src/client/windows/crash_generation/crash_generation_client.cc | |
parent | Correct leak. (diff) | |
download | breakpad-06cede988b4d15b4d6b7e759fda676bfe3455682.tar.xz |
Allow CrashGenerationClient to request that a dump of the parent process be written.
A=Jim Mathies <jmathies@mozilla.com> R=ted at https://bugzilla.mozilla.org/show_bug.cgi?id=679238
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@883 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/windows/crash_generation/crash_generation_client.cc')
-rw-r--r-- | src/client/windows/crash_generation/crash_generation_client.cc | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/client/windows/crash_generation/crash_generation_client.cc b/src/client/windows/crash_generation/crash_generation_client.cc index 5e4e3cb9..304c6061 100644 --- a/src/client/windows/crash_generation/crash_generation_client.cc +++ b/src/client/windows/crash_generation/crash_generation_client.cc @@ -194,6 +194,7 @@ bool CrashGenerationClient::RegisterClient(HANDLE pipe) { custom_info_, NULL, NULL, + NULL, NULL); ProtocolMessage reply; DWORD bytes_count = 0; @@ -220,8 +221,10 @@ bool CrashGenerationClient::RegisterClient(HANDLE pipe) { if (!WriteFile(pipe, &ack_msg, sizeof(ack_msg), &bytes_count, NULL)) { return false; } + crash_event_ = reply.dump_request_handle; crash_generated_ = reply.dump_generated_handle; + parent_dump_request_event_ = reply.parent_dump_request_handle; server_alive_ = reply.server_alive_handle; server_process_id_ = reply.pid; @@ -271,6 +274,39 @@ bool CrashGenerationClient::IsRegistered() const { return crash_event_ != NULL; } +bool CrashGenerationClient::RequestParentDump() { + if (!IsRegistered()) { + return false; + } + + assert(parent_dump_request_event_); + assert(server_alive_); + + // Reset the dump generated event before signaling the crash + // event so that the server can set the dump generated event + // once it is done generating the event. + if (!ResetEvent(crash_generated_)) { + return false; + } + + // Signal we want a server side crash dump generated + if (!SetEvent(parent_dump_request_event_)) { + return false; + } + + // Wait for the crash dump process to complete + HANDLE wait_handles[kWaitEventCount] = {crash_generated_, server_alive_}; + + DWORD result = WaitForMultipleObjects(kWaitEventCount, + wait_handles, + FALSE, + kWaitForServerTimeoutMs); + + // Crash dump was successfully generated only if the server + // signaled the crash generated event. + return result == WAIT_OBJECT_0; +} + bool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info, MDRawAssertionInfo* assert_info) { if (!IsRegistered()) { |