From c8d3882cdc8f9e22c58af285c1996265c1af75d5 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 11 May 2004 18:05:44 +0000 Subject: * True parallel builds. Nix can now run as many build jobs in parallel as possible (similar to GNU Make's `-j' switch). This is useful on SMP systems, but it is especially useful for doing builds on multiple machines. The idea is that a large derivation is initiated on one master machine, which then distributes sub-derivations to any number of slave machines. This should not happen synchronously or in lock-step, so the master must be capable of dealing with multiple parallel build jobs. We now have the infrastructure to support this. TODO: substitutes are currently broken. --- src/libmain/shared.cc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/libmain/shared.cc') diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index fce4271061..d9cc990f90 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -15,9 +15,15 @@ extern "C" { #include "config.h" +volatile sig_atomic_t blockInt = 0; + + void sigintHandler(int signo) { - _isInterrupted = 1; + if (!blockInt) { + _isInterrupted = 1; + blockInt = 1; + } } @@ -150,7 +156,17 @@ int main(int argc, char * * argv) #endif try { - initAndRun(argc, argv); + try { + initAndRun(argc, argv); + } catch (...) { + /* Subtle: we have to make sure that any `interrupted' + condition is discharged before we reach printMsg() + below, since otherwise it will throw an (uncaught) + exception. */ + blockInt = 1; /* ignore further SIGINTs */ + _isInterrupted = 0; + throw; + } } catch (UsageError & e) { printMsg(lvlError, format( -- cgit 1.4.1