| OLD | NEW |
| 1 //===--- CrashRecoveryContext.cpp - Crash Recovery ------------------------===// | 1 //===--- CrashRecoveryContext.cpp - Crash Recovery ------------------------===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 | 9 |
| 10 #include "llvm/Support/CrashRecoveryContext.h" | 10 #include "llvm/Support/CrashRecoveryContext.h" |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 } | 270 } |
| 271 | 271 |
| 272 void CrashRecoveryContext::Enable() { | 272 void CrashRecoveryContext::Enable() { |
| 273 sys::ScopedLock L(*gCrashRecoveryContextMutex); | 273 sys::ScopedLock L(*gCrashRecoveryContextMutex); |
| 274 | 274 |
| 275 if (gCrashRecoveryEnabled) | 275 if (gCrashRecoveryEnabled) |
| 276 return; | 276 return; |
| 277 | 277 |
| 278 gCrashRecoveryEnabled = true; | 278 gCrashRecoveryEnabled = true; |
| 279 | 279 |
| 280 #if !defined(__native_client__) // @LOCALMOD |
| 280 // Setup the signal handler. | 281 // Setup the signal handler. |
| 281 struct sigaction Handler; | 282 struct sigaction Handler; |
| 282 Handler.sa_handler = CrashRecoverySignalHandler; | 283 Handler.sa_handler = CrashRecoverySignalHandler; |
| 283 Handler.sa_flags = 0; | 284 Handler.sa_flags = 0; |
| 284 sigemptyset(&Handler.sa_mask); | 285 sigemptyset(&Handler.sa_mask); |
| 285 | 286 |
| 286 for (unsigned i = 0; i != NumSignals; ++i) { | 287 for (unsigned i = 0; i != NumSignals; ++i) { |
| 287 sigaction(Signals[i], &Handler, &PrevActions[i]); | 288 sigaction(Signals[i], &Handler, &PrevActions[i]); |
| 288 } | 289 } |
| 290 // @LOCALMOD-START |
| 291 #else |
| 292 #warning Cannot setup the signal handler on this machine |
| 293 #endif |
| 294 // @LOCALMOD-END |
| 289 } | 295 } |
| 290 | 296 |
| 291 void CrashRecoveryContext::Disable() { | 297 void CrashRecoveryContext::Disable() { |
| 292 sys::ScopedLock L(*gCrashRecoveryContextMutex); | 298 sys::ScopedLock L(*gCrashRecoveryContextMutex); |
| 293 | 299 |
| 294 if (!gCrashRecoveryEnabled) | 300 if (!gCrashRecoveryEnabled) |
| 295 return; | 301 return; |
| 296 | 302 |
| 297 gCrashRecoveryEnabled = false; | 303 gCrashRecoveryEnabled = false; |
| 298 | 304 |
| 305 #if !defined(__native_client__) // @LOCALMOD |
| 299 // Restore the previous signal handlers. | 306 // Restore the previous signal handlers. |
| 300 for (unsigned i = 0; i != NumSignals; ++i) | 307 for (unsigned i = 0; i != NumSignals; ++i) |
| 301 sigaction(Signals[i], &PrevActions[i], nullptr); | 308 sigaction(Signals[i], &PrevActions[i], nullptr); |
| 309 #endif // @LOCALMOD |
| 302 } | 310 } |
| 303 | 311 |
| 304 #endif | 312 #endif |
| 305 | 313 |
| 306 bool CrashRecoveryContext::RunSafely(function_ref<void()> Fn) { | 314 bool CrashRecoveryContext::RunSafely(function_ref<void()> Fn) { |
| 307 // If crash recovery is disabled, do nothing. | 315 // If crash recovery is disabled, do nothing. |
| 308 if (gCrashRecoveryEnabled) { | 316 if (gCrashRecoveryEnabled) { |
| 309 assert(!Impl && "Crash recovery context already initialized!"); | 317 assert(!Impl && "Crash recovery context already initialized!"); |
| 310 CrashRecoveryContextImpl *CRCI = new CrashRecoveryContextImpl(this); | 318 CrashRecoveryContextImpl *CRCI = new CrashRecoveryContextImpl(this); |
| 311 Impl = CRCI; | 319 Impl = CRCI; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 } | 375 } |
| 368 bool CrashRecoveryContext::RunSafelyOnThread(function_ref<void()> Fn, | 376 bool CrashRecoveryContext::RunSafelyOnThread(function_ref<void()> Fn, |
| 369 unsigned RequestedStackSize) { | 377 unsigned RequestedStackSize) { |
| 370 bool UseBackgroundPriority = hasThreadBackgroundPriority(); | 378 bool UseBackgroundPriority = hasThreadBackgroundPriority(); |
| 371 RunSafelyOnThreadInfo Info = { Fn, this, UseBackgroundPriority, false }; | 379 RunSafelyOnThreadInfo Info = { Fn, this, UseBackgroundPriority, false }; |
| 372 llvm_execute_on_thread(RunSafelyOnThread_Dispatch, &Info, RequestedStackSize); | 380 llvm_execute_on_thread(RunSafelyOnThread_Dispatch, &Info, RequestedStackSize); |
| 373 if (CrashRecoveryContextImpl *CRC = (CrashRecoveryContextImpl *)Impl) | 381 if (CrashRecoveryContextImpl *CRC = (CrashRecoveryContextImpl *)Impl) |
| 374 CRC->setSwitchedThread(); | 382 CRC->setSwitchedThread(); |
| 375 return Info.Result; | 383 return Info.Result; |
| 376 } | 384 } |
| OLD | NEW |