xref: /aosp_15_r20/external/libbrillo/brillo/asynchronous_signal_handler.h (revision 1a96fba65179ea7d3f56207137718607415c5953)
1*1a96fba6SXin Li // Copyright 2014 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li 
5*1a96fba6SXin Li #ifndef LIBBRILLO_BRILLO_ASYNCHRONOUS_SIGNAL_HANDLER_H_
6*1a96fba6SXin Li #define LIBBRILLO_BRILLO_ASYNCHRONOUS_SIGNAL_HANDLER_H_
7*1a96fba6SXin Li 
8*1a96fba6SXin Li #include <sys/signalfd.h>
9*1a96fba6SXin Li 
10*1a96fba6SXin Li #include <map>
11*1a96fba6SXin Li #include <memory>
12*1a96fba6SXin Li 
13*1a96fba6SXin Li #include <base/callback.h>
14*1a96fba6SXin Li #include <base/files/file_descriptor_watcher_posix.h>
15*1a96fba6SXin Li #include <base/files/scoped_file.h>
16*1a96fba6SXin Li #include <brillo/asynchronous_signal_handler_interface.h>
17*1a96fba6SXin Li #include <brillo/brillo_export.h>
18*1a96fba6SXin Li 
19*1a96fba6SXin Li namespace brillo {
20*1a96fba6SXin Li // Sets up signal handlers for registered signals, and converts signal receipt
21*1a96fba6SXin Li // into a write on a pipe. Watches that pipe for data and, when some appears,
22*1a96fba6SXin Li // execute the associated callback.
23*1a96fba6SXin Li class BRILLO_EXPORT AsynchronousSignalHandler final :
24*1a96fba6SXin Li     public AsynchronousSignalHandlerInterface {
25*1a96fba6SXin Li  public:
26*1a96fba6SXin Li   using AsynchronousSignalHandlerInterface::SignalHandler;
27*1a96fba6SXin Li 
28*1a96fba6SXin Li   AsynchronousSignalHandler();
29*1a96fba6SXin Li   ~AsynchronousSignalHandler() override;
30*1a96fba6SXin Li 
31*1a96fba6SXin Li   AsynchronousSignalHandler(const AsynchronousSignalHandler&) = delete;
32*1a96fba6SXin Li   AsynchronousSignalHandler&
33*1a96fba6SXin Li   operator=(const AsynchronousSignalHandler&) = delete;
34*1a96fba6SXin Li 
35*1a96fba6SXin Li   // Initialize the handler.
36*1a96fba6SXin Li   void Init();
37*1a96fba6SXin Li 
38*1a96fba6SXin Li   // AsynchronousSignalHandlerInterface overrides.
39*1a96fba6SXin Li   void RegisterHandler(int signal, const SignalHandler& callback) override;
40*1a96fba6SXin Li   void UnregisterHandler(int signal) override;
41*1a96fba6SXin Li 
42*1a96fba6SXin Li  private:
43*1a96fba6SXin Li   // Called from the main loop when we can read from |descriptor_|, indicated
44*1a96fba6SXin Li   // that a signal was processed.
45*1a96fba6SXin Li   void OnReadable();
46*1a96fba6SXin Li 
47*1a96fba6SXin Li   // Updates the set of signals that this handler listens to.
48*1a96fba6SXin Li   BRILLO_PRIVATE void UpdateSignals();
49*1a96fba6SXin Li 
50*1a96fba6SXin Li   // Map from signal to its registered callback.
51*1a96fba6SXin Li   using Callbacks = std::map<int, SignalHandler>;
52*1a96fba6SXin Li   Callbacks registered_callbacks_;
53*1a96fba6SXin Li 
54*1a96fba6SXin Li   // File descriptor for accepting signals indicated by |signal_mask_|.
55*1a96fba6SXin Li   base::ScopedFD descriptor_;
56*1a96fba6SXin Li 
57*1a96fba6SXin Li   // Controller used to manage watching of signalling pipe.
58*1a96fba6SXin Li   std::unique_ptr<base::FileDescriptorWatcher::Controller> fd_watcher_;
59*1a96fba6SXin Li 
60*1a96fba6SXin Li   // A set of signals to be handled after the dispatcher is running.
61*1a96fba6SXin Li   sigset_t signal_mask_;
62*1a96fba6SXin Li 
63*1a96fba6SXin Li   // A copy of the signal mask before the dispatcher starts, which will be
64*1a96fba6SXin Li   // used to restore to the original state when the dispatcher stops.
65*1a96fba6SXin Li   sigset_t saved_signal_mask_;
66*1a96fba6SXin Li };
67*1a96fba6SXin Li 
68*1a96fba6SXin Li }  // namespace brillo
69*1a96fba6SXin Li 
70*1a96fba6SXin Li #endif  // LIBBRILLO_BRILLO_ASYNCHRONOUS_SIGNAL_HANDLER_H_
71