about summary refs log tree commit diff
path: root/src/libmain
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-03-29T13·08+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-03-29T14·37+0200
commitab3ce1cc13153b2053302cdb710cb411b0b9d84e (patch)
tree1548ea7b5316f7793cdb44d0da2642dafa1d4441 /src/libmain
parent4f34c403980e7f5ae3d5257b742af6fd6452c6cf (diff)
Improve SIGINT handling in multi-threaded programs
The flag remembering whether an Interrupted exception was thrown is
now thread-local. Thus, all threads will (eventually) throw
Interrupted. Previously, one thread would throw Interrupted, and then
the other threads wouldn't see that they were supposed to quit.
Diffstat (limited to 'src/libmain')
-rw-r--r--src/libmain/shared.cc11
1 files changed, 2 insertions, 9 deletions
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index e2648321130c..ed997052be20 100644
--- a/src/libmain/shared.cc
+++ b/src/libmain/shared.cc
@@ -24,15 +24,9 @@
 namespace nix {
 
 
-volatile sig_atomic_t blockInt = 0;
-
-
 static void sigintHandler(int signo)
 {
-    if (!blockInt) {
-        _isInterrupted = 1;
-        blockInt = 1;
-    }
+    _isInterrupted = 1;
 }
 
 
@@ -287,8 +281,7 @@ int handleExceptions(const string & programName, std::function<void()> fun)
                condition is discharged before we reach printMsg()
                below, since otherwise it will throw an (uncaught)
                exception. */
-            blockInt = 1; /* ignore further SIGINTs */
-            _isInterrupted = 0;
+            interruptThrown = true;
             throw;
         }
     } catch (Exit & e) {