Index: chrome/app/breakpad_win.cc |
diff --git a/chrome/app/breakpad_win.cc b/chrome/app/breakpad_win.cc |
index 9fc453127f3215c29f3f2f59fdc8600a7c93f43d..2a616f6ca508d7b4e36e0b8d5050c9d80ae30b49 100644 |
--- a/chrome/app/breakpad_win.cc |
+++ b/chrome/app/breakpad_win.cc |
@@ -13,6 +13,7 @@ |
#include <algorithm> |
#include <vector> |
+#include "base/atomicops.h" |
#include "base/basictypes.h" |
#include "base/base_switches.h" |
#include "base/command_line.h" |
@@ -127,6 +128,7 @@ static HKEY g_browser_crash_dump_regkey = NULL; |
static const wchar_t kBrowserCrashDumpValueFormatStr[] = L"%08x-%08x"; |
static const int kBrowserCrashDumpValueLength = 17; |
static wchar_t g_browser_crash_dump_value[kBrowserCrashDumpValueLength+1] = {0}; |
+static base::subtle::Atomic32 g_browser_crash_dump_count = 0; |
cpu_(ooo_6.6-7.5)
2013/09/04 23:29:45
aka int32 btw
Roger McFarlane (Chromium)
2013/09/05 13:57:53
Yes, I know. But this communicates the intended us
|
void InitBrowserCrashDumpsRegKey() { |
DCHECK(g_browser_crash_dump_regkey == NULL); |
@@ -142,6 +144,7 @@ void InitBrowserCrashDumpsRegKey() { |
return; |
} |
+ // Hold the registry key in a global for update on crash dump. |
g_browser_crash_dump_regkey = regkey.Take(); |
// We use the current process id and the curren tick count as a (hopefully) |
@@ -159,11 +162,24 @@ void InitBrowserCrashDumpsRegKey() { |
} |
void SendSmokeSignalForCrashDump() { |
- if (g_browser_crash_dump_regkey != NULL) { |
- base::win::RegKey regkey(g_browser_crash_dump_regkey); |
- regkey.WriteValue(g_browser_crash_dump_value, 1); |
- g_browser_crash_dump_regkey = NULL; |
- } |
+ // If we're not a browser (or the registry is unavailable to us for some |
+ // reason) then there's nothing to do. |
+ if (g_browser_crash_dump_regkey == NULL) |
+ return; |
+ |
+ // Increment the number of crash dumps and persist it to the registry. |
+ // Note that there is a race condition here: the final count could be off by |
+ // one if two dumps are triggered at the same moment and the registry writes |
+ // happen to be committed in the reverse order of the atomic increments. |
+ // We'll live with this, as we don't want to attempt any "real" work while |
+ // we may be in a crashing state. |
+ base::win::RegKey regkey(g_browser_crash_dump_regkey); |
+ regkey.WriteValue( |
+ g_browser_crash_dump_value, |
+ base::subtle::NoBarrier_AtomicIncrement(&g_browser_crash_dump_count, 1)); |
+ |
+ // Don't let regkey auto-close the key. More crash dumps may follow. |
+ ignore_result(regkey.Take()); |
} |
// Dumps the current process memory. |