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