diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-01-17T17·21+0100 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-01-17T17·21+0100 |
commit | cc3b93c991e04aff49a44dbced53f070a06f426e (patch) | |
tree | bc88ad9093faabd477ce935aedb5bd6a09459107 /src/libutil/util.hh | |
parent | c0d55f918379f46b87e43457745895439a85555c (diff) |
Handle SIGINT etc. via a sigwait() signal handler thread
This allows other threads to install callbacks that run in a regular, non-signal context. In particular, we can use this to signal the downloader thread to quit. Closes #1183.
Diffstat (limited to 'src/libutil/util.hh')
-rw-r--r-- | src/libutil/util.hh | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/libutil/util.hh b/src/libutil/util.hh index 679c3a1b6df4..052173ff9976 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -263,7 +263,7 @@ void restoreSIGPIPE(); /* User interruption. */ -extern volatile sig_atomic_t _isInterrupted; +extern bool _isInterrupted; extern thread_local bool interruptThrown; @@ -416,4 +416,19 @@ void callSuccess( } +/* Start a thread that handles various signals. Also block those signals + on the current thread (and thus any threads created by it). */ +void startSignalHandlerThread(); + +struct InterruptCallback +{ + virtual ~InterruptCallback() { }; +}; + +/* Register a function that gets called on SIGINT (in a non-signal + context). */ +std::unique_ptr<InterruptCallback> createInterruptCallback( + std::function<void()> callback); + + } |