Author: Jonas Devlieghere
Date: 2026-05-08T22:39:38-05:00
New Revision: 6f595b1d1bc12d45bcf8566ffdb9972ec42ed02d

URL: 
https://github.com/llvm/llvm-project/commit/6f595b1d1bc12d45bcf8566ffdb9972ec42ed02d
DIFF: 
https://github.com/llvm/llvm-project/commit/6f595b1d1bc12d45bcf8566ffdb9972ec42ed02d.diff

LOG: Revert "[lldb] Handle SIGINT via the MainLoop signal thread (on POSIX) 
(#195959)"

This reverts commit 38d79280ac57159b92a23d90eb34a2f646b57f71.

Added: 
    

Modified: 
    lldb/tools/driver/Driver.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/tools/driver/Driver.cpp b/lldb/tools/driver/Driver.cpp
index e58286f9ff41e..d47d3daf1c3fc 100644
--- a/lldb/tools/driver/Driver.cpp
+++ b/lldb/tools/driver/Driver.cpp
@@ -43,9 +43,6 @@
 #include <clocale>
 #include <csignal>
 #include <future>
-#ifndef _WIN32
-#include <pthread.h>
-#endif
 #include <string>
 #include <thread>
 #include <utility>
@@ -654,10 +651,11 @@ void Driver::UpdateWindowSize() {
   }
 }
 
-#ifdef _WIN32
 void sigint_handler(int signo) {
+#ifdef _WIN32
   // Restore handler as it is not persistent on Windows.
   signal(SIGINT, sigint_handler);
+#endif
 
   static std::atomic_flag g_interrupt_sent = ATOMIC_FLAG_INIT;
   if (g_driver != nullptr) {
@@ -670,7 +668,6 @@ void sigint_handler(int signo) {
 
   _exit(signo);
 }
-#endif
 
 static void printHelp(LLDBOptTable &table, llvm::StringRef tool_name) {
   std::string usage_str = tool_name.str() + " [options]";
@@ -784,64 +781,15 @@ int main(int argc, char const *argv[]) {
   // Setup LLDB signal handlers once the debugger has been initialized.
   SBDebugger::PrintDiagnosticsOnError();
 
-#ifdef _WIN32
+  //  FIXME: Migrate the SIGINT handler to be handled by the signal loop below.
   signal(SIGINT, sigint_handler);
-#else
+#if !defined(_WIN32)
   signal(SIGPIPE, SIG_IGN);
 
-  // Capture the main thread's id so the signal thread can target it.
-  pthread_t main_thread = pthread_self();
-
-  // Set when the signal thread sends itself a SIGINT to wake the main thread.
-  // The next callback invocation observes this flag and skips the work. A
-  // plain bool is sufficient because the callback only ever runs on the
-  // signal thread; it lives outside the lambda because MainLoopPosix copies
-  // the callback on every dispatch, which would discard in-lambda state.
-  bool skip_next_sigint = false;
-
   // Handle signals in a MainLoop running on a separate thread.
   MainLoop signal_loop;
   Status signal_status;
 
-  auto sigint_handler = signal_loop.RegisterSignal(
-      SIGINT,
-      [&, main_thread](MainLoopBase &) {
-        // Skip the self-sent wakeup SIGINT queued at the end of the previous
-        // invocation.
-        if (std::exchange(skip_next_sigint, false))
-          return;
-
-        // Temporarily restore the default disposition so that a second SIGINT
-        // delivered while DispatchInputInterrupt is running hard-terminates
-        // the process. This preserves the "double Ctrl-C to force exit"
-        // escape hatch users rely on when the debugger is unresponsive.
-        struct sigaction old_action;
-        struct sigaction new_action = {};
-        new_action.sa_handler = SIG_DFL;
-        sigemptyset(&new_action.sa_mask);
-
-        int ret = sigaction(SIGINT, &new_action, &old_action);
-        UNUSED_IF_ASSERT_DISABLED(ret);
-        assert(ret == 0 && "sigaction failed");
-
-        if (g_driver)
-          g_driver->GetDebugger().DispatchInputInterrupt();
-
-        ret = sigaction(SIGINT, &old_action, nullptr);
-        UNUSED_IF_ASSERT_DISABLED(ret);
-        assert(ret == 0 && "sigaction failed");
-
-        // Wake the main thread so any blocking syscall (e.g. the Python REPL
-        // waiting on input or sleeping) returns with EINTR. This lets Python
-        // observe the pending interrupt queued by DispatchInputInterrupt and
-        // raise KeyboardInterrupt. Flag the resulting callback invocation so
-        // it's skipped rather than re-running DispatchInputInterrupt.
-        skip_next_sigint = true;
-        pthread_kill(main_thread, SIGINT);
-      },
-      signal_status);
-  assert(sigint_handler && signal_status.Success());
-
   auto sigwinch_handler = signal_loop.RegisterSignal(
       SIGWINCH,
       [&](MainLoopBase &) {


        
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to