OLD | NEW |
1 // Copyright 2015 The Crashpad Authors. All rights reserved. | 1 // Copyright 2015 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 // anything that might cause allocations, call into kernel mode, etc. So, we | 49 // anything that might cause allocations, call into kernel mode, etc. So, we |
50 // don't want to take a critical section here to avoid simultaneous access to | 50 // don't want to take a critical section here to avoid simultaneous access to |
51 // the global exception pointers in CrashpadInfo. Because the crash handler | 51 // the global exception pointers in CrashpadInfo. Because the crash handler |
52 // will record all threads, it's fine to simply have the second and subsequent | 52 // will record all threads, it's fine to simply have the second and subsequent |
53 // entrants block here. They will soon be suspended by the crash handler, and | 53 // entrants block here. They will soon be suspended by the crash handler, and |
54 // then the entire process will be terminated below. This means that we won't | 54 // then the entire process will be terminated below. This means that we won't |
55 // save the exception pointers from the second and further crashes, but | 55 // save the exception pointers from the second and further crashes, but |
56 // contention here is very unlikely, and we'll still have a stack that's | 56 // contention here is very unlikely, and we'll still have a stack that's |
57 // blocked at this location. | 57 // blocked at this location. |
58 if (base::subtle::Barrier_AtomicIncrement(&g_have_crashed, 1) > 1) { | 58 if (base::subtle::Barrier_AtomicIncrement(&g_have_crashed, 1) > 1) { |
59 SleepEx(false, INFINITE); | 59 SleepEx(INFINITE, false); |
60 } | 60 } |
61 | 61 |
62 // Otherwise, we're the first thread, so record the exception pointer and | 62 // Otherwise, we're the first thread, so record the exception pointer and |
63 // signal the crash handler. | 63 // signal the crash handler. |
| 64 crashpad::CrashpadInfo::GetCrashpadInfo()->set_thread_id( |
| 65 GetCurrentThreadId()); |
64 crashpad::CrashpadInfo::GetCrashpadInfo()->set_exception_pointers( | 66 crashpad::CrashpadInfo::GetCrashpadInfo()->set_exception_pointers( |
65 exception_pointers); | 67 exception_pointers); |
66 DWORD rv = SignalObjectAndWait(g_signal_exception, | 68 DWORD rv = SignalObjectAndWait(g_signal_exception, |
67 g_wait_termination, | 69 g_wait_termination, |
68 kMillisecondsUntilTerminate, | 70 kMillisecondsUntilTerminate, |
69 FALSE); | 71 false); |
70 if (rv != WAIT_OBJECT_0) { | 72 if (rv != WAIT_OBJECT_0) { |
71 // Something went wrong. It is likely that a dump has not been created. | 73 // Something went wrong. It is likely that a dump has not been created. |
72 if (rv == WAIT_TIMEOUT) { | 74 if (rv == WAIT_TIMEOUT) { |
73 LOG(WARNING) << "SignalObjectAndWait timed out"; | 75 LOG(WARNING) << "SignalObjectAndWait timed out"; |
74 } else { | 76 } else { |
75 PLOG(WARNING) << "SignalObjectAndWait error"; | 77 PLOG(WARNING) << "SignalObjectAndWait error"; |
76 } | 78 } |
77 } | 79 } |
78 // We don't want to generate more exceptions, so we take the fast route. | 80 // We don't want to generate more exceptions, so we take the fast route. |
79 TerminateProcess(GetCurrentProcess(), kCrashExitCode); | 81 TerminateProcess(GetCurrentProcess(), kCrashExitCode); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 return false; | 168 return false; |
167 if (!g_wait_termination) | 169 if (!g_wait_termination) |
168 return false; | 170 return false; |
169 // In theory we could store the previous handler but it is not clear what | 171 // In theory we could store the previous handler but it is not clear what |
170 // use we have for it. | 172 // use we have for it. |
171 SetUnhandledExceptionFilter(&UnhandledExceptionHandler); | 173 SetUnhandledExceptionFilter(&UnhandledExceptionHandler); |
172 return true; | 174 return true; |
173 } | 175 } |
174 | 176 |
175 } // namespace crashpad | 177 } // namespace crashpad |
OLD | NEW |