Nix 2.93.3
Lix: A modern, delicious implementation of the Nix package manager; unstable internal interfaces
Loading...
Searching...
No Matches
signals.hh
1#pragma once
20
21
22#include "lix/libutil/error.hh"
23#include "lix/libutil/result.hh"
24
25#include <kj/async.h>
26#include <memory>
27#include <sys/types.h>
28#include <sys/stat.h>
29#include <dirent.h>
30#include <unistd.h>
31#include <signal.h>
32
33#include <atomic>
34#include <functional>
35
36namespace nix {
37
38/* User interruption. */
39
40class Interrupted;
41
42extern std::atomic<bool> _isInterrupted;
43
44extern thread_local std::function<bool()> interruptCheck;
45
46Interrupted makeInterrupted();
47void _interrupted();
48
49void inline checkInterrupt()
50{
51 if (_isInterrupted || (interruptCheck && interruptCheck()))
52 _interrupted();
53}
54
55MakeError(Interrupted, BaseError);
56
57void restoreSignals();
58
59
66enum class DoSignalSave
67{
68 Save,
69 DontSaveBecauseAdvancedProcess,
70};
71
84void startSignalHandlerThread(DoSignalSave doSave = DoSignalSave::Save);
85
92void saveSignalMask();
93
99void setChildSignalMask(sigset_t *sigs);
100
102{
103 virtual ~InterruptCallback() { };
104};
105
110std::unique_ptr<InterruptCallback> createInterruptCallback(
111 std::function<void()> callback);
112
113template<typename T>
114kj::Promise<Result<T>> makeInterruptible(kj::Promise<Result<T>> p)
115{
116 auto onInterrupt = kj::newPromiseAndCrossThreadFulfiller<Result<T>>();
117 auto interruptCallback = createInterruptCallback([fulfiller{onInterrupt.fulfiller.get()}] {
118 fulfiller->fulfill(result::failure(std::make_exception_ptr(makeInterrupted())));
119 });
120 return p.attach(std::move(onInterrupt.fulfiller), std::move(interruptCallback))
121 .exclusiveJoin(std::move(onInterrupt.promise));
122}
123
124void triggerInterrupt();
125
131struct ReceiveInterrupts
132{
133 pthread_t target;
134 std::unique_ptr<InterruptCallback> callback;
135
136 ReceiveInterrupts()
137 : target(pthread_self())
138 , callback(createInterruptCallback([&]() { pthread_kill(target, SIGUSR1); }))
139 { }
140};
141
142};
Definition error.hh:140
This file defines two main structs/classes used in nix error handling.
Definition signals.hh:102