[Lldb-commits] [lldb] r313785 - Fix the SIGINT handlers

Adrian McCarthy via lldb-commits lldb-commits at lists.llvm.org
Wed Sep 20 11:09:39 PDT 2017


Author: amccarth
Date: Wed Sep 20 11:09:39 2017
New Revision: 313785

URL: http://llvm.org/viewvc/llvm-project?rev=313785&view=rev
Log:
Fix the SIGINT handlers

1. Fix a data race (g_interrupt_sent flag usage was not thread safe, signals
can be handled on arbitrary threads)

2. exit() is not signal-safe, replaced it with the signal-safe equivalent
_exit()

(This differs from the patch on Phabrictor because I had to add
`#include <atomic>` to get the definition of `std::atomic_flag`.)

patch by lemo

Differential Revision: https://reviews.llvm.org/D37926

Modified:
    lldb/trunk/tools/driver/Driver.cpp
    lldb/trunk/tools/lldb-mi/MIDriverMain.cpp

Modified: lldb/trunk/tools/driver/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/Driver.cpp?rev=313785&r1=313784&r2=313785&view=diff
==============================================================================
--- lldb/trunk/tools/driver/Driver.cpp (original)
+++ lldb/trunk/tools/driver/Driver.cpp Wed Sep 20 11:09:39 2017
@@ -9,6 +9,7 @@
 
 #include "Driver.h"
 
+#include <atomic>
 #include <csignal>
 #include <fcntl.h>
 #include <limits.h>
@@ -1177,17 +1178,16 @@ void sigwinch_handler(int signo) {
 }
 
 void sigint_handler(int signo) {
-  static bool g_interrupt_sent = false;
+  static std::atomic_flag g_interrupt_sent = ATOMIC_FLAG_INIT;
   if (g_driver) {
-    if (!g_interrupt_sent) {
-      g_interrupt_sent = true;
+    if (!g_interrupt_sent.test_and_set()) {
       g_driver->GetDebugger().DispatchInputInterrupt();
-      g_interrupt_sent = false;
+      g_interrupt_sent.clear();
       return;
     }
   }
 
-  exit(signo);
+  _exit(signo);
 }
 
 void sigtstp_handler(int signo) {

Modified: lldb/trunk/tools/lldb-mi/MIDriverMain.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MIDriverMain.cpp?rev=313785&r1=313784&r2=313785&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MIDriverMain.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MIDriverMain.cpp Wed Sep 20 11:09:39 2017
@@ -33,6 +33,7 @@
 
 // Third party headers:
 #include "lldb/API/SBHostOS.h"
+#include <atomic>
 #include <csignal>
 #include <stdio.h>
 
@@ -72,14 +73,13 @@ void sigint_handler(int vSigno) {
 #ifdef _WIN32 // Restore handler as it is not persistent on Windows
   signal(SIGINT, sigint_handler);
 #endif
-  static bool g_interrupt_sent = false;
+  static std::atomic_flag g_interrupt_sent = ATOMIC_FLAG_INIT;
   CMIDriverMgr &rDriverMgr = CMIDriverMgr::Instance();
   lldb::SBDebugger *pDebugger = rDriverMgr.DriverGetTheDebugger();
   if (pDebugger != nullptr) {
-    if (!g_interrupt_sent) {
-      g_interrupt_sent = true;
+    if (!g_interrupt_sent.test_and_set()) {
       pDebugger->DispatchInputInterrupt();
-      g_interrupt_sent = false;
+      g_interrupt_sent.clear();
     }
   }
 




More information about the lldb-commits mailing list