Only register code range once
authorKevin Sawicki <kevin@github.com>
Tue, 26 Jul 2016 17:40:11 +0000 (10:40 -0700)
committerKevin Sawicki <kevin@github.com>
Tue, 26 Jul 2016 17:40:11 +0000 (10:40 -0700)
atom/common/crash_reporter/crash_reporter_win.cc
atom/common/crash_reporter/crash_reporter_win.h

index 7ce61d6..9d066aa 100644 (file)
@@ -138,7 +138,8 @@ void UnregisterNonABICompliantCodeRange(void* start) {
 }  // namespace
 
 CrashReporterWin::CrashReporterWin()
-    : skip_system_crash_handler_(false) {
+    : skip_system_crash_handler_(false),
+      code_range_registered_(false) {
 }
 
 CrashReporterWin::~CrashReporterWin() {
@@ -189,19 +190,20 @@ void CrashReporterWin::InitBreakpad(const std::string& product_name,
     LOG(ERROR) << "Cannot initialize out-of-process crash handler";
 
 #ifdef _WIN64
-  bool registered = false;
   // Hook up V8 to breakpad.
-  {
+  if (!code_range_registered_) {
     // gin::Debug::SetCodeRangeCreatedCallback only runs the callback when
     // Isolate is just created, so we have to manually run following code here.
     void* code_range = nullptr;
     size_t size = 0;
     v8::Isolate::GetCurrent()->GetCodeRange(&code_range, &size);
-    if (code_range && size)
-      registered = RegisterNonABICompliantCodeRange(code_range, size);
+    if (code_range && size &&
+        RegisterNonABICompliantCodeRange(code_range, size)) {
+      code_range_registered_ = true;
+      gin::Debug::SetCodeRangeDeletedCallback(
+          UnregisterNonABICompliantCodeRange);
+    }
   }
-  if (registered)
-    gin::Debug::SetCodeRangeDeletedCallback(UnregisterNonABICompliantCodeRange);
 #endif
 }
 
index 93be8af..806c3de 100644 (file)
@@ -62,6 +62,7 @@ class CrashReporterWin : public CrashReporter {
   google_breakpad::CustomClientInfo custom_info_;
 
   bool skip_system_crash_handler_;
+  bool code_range_registered_;
   std::unique_ptr<google_breakpad::ExceptionHandler> breakpad_;
 
   DISALLOW_COPY_AND_ASSIGN(CrashReporterWin);