Skip to content

Commit

Permalink
Fix the SIGINT handlers
Browse files Browse the repository at this point in the history
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

llvm-svn: 313785
  • Loading branch information
amccarth-google committed Sep 20, 2017
1 parent b9be536 commit 6c84ffb
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 9 deletions.
10 changes: 5 additions & 5 deletions lldb/tools/driver/Driver.cpp
Expand Up @@ -9,6 +9,7 @@

#include "Driver.h"

#include <atomic>
#include <csignal>
#include <fcntl.h>
#include <limits.h>
Expand Down Expand Up @@ -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) {
Expand Down
8 changes: 4 additions & 4 deletions lldb/tools/lldb-mi/MIDriverMain.cpp
Expand Up @@ -33,6 +33,7 @@

// Third party headers:
#include "lldb/API/SBHostOS.h"
#include <atomic>
#include <csignal>
#include <stdio.h>

Expand Down Expand Up @@ -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();
}
}

Expand Down

0 comments on commit 6c84ffb

Please sign in to comment.