/ src / kernel / notifications_interface.h
notifications_interface.h
 1  // Copyright (c) 2023 The Bitcoin Core developers
 2  // Distributed under the MIT software license, see the accompanying
 3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 4  
 5  #ifndef BITCOIN_KERNEL_NOTIFICATIONS_INTERFACE_H
 6  #define BITCOIN_KERNEL_NOTIFICATIONS_INTERFACE_H
 7  
 8  #include <cstdint>
 9  #include <variant>
10  
11  class CBlockIndex;
12  enum class SynchronizationState;
13  struct bilingual_str;
14  
15  namespace kernel {
16  
17  //! Result type for use with std::variant to indicate that an operation should be interrupted.
18  struct Interrupted{};
19  
20  //! Simple result type for functions that need to propagate an interrupt status and don't have other return values.
21  using InterruptResult = std::variant<std::monostate, Interrupted>;
22  
23  template <typename T>
24  bool IsInterrupted(const T& result)
25  {
26      return std::holds_alternative<kernel::Interrupted>(result);
27  }
28  
29  /**
30   * A base class defining functions for notifying about certain kernel
31   * events.
32   */
33  class Notifications
34  {
35  public:
36      virtual ~Notifications(){};
37  
38      [[nodiscard]] virtual InterruptResult blockTip(SynchronizationState state, CBlockIndex& index) { return {}; }
39      virtual void headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync) {}
40      virtual void progress(const bilingual_str& title, int progress_percent, bool resume_possible) {}
41      virtual void warning(const bilingual_str& warning) {}
42  
43      //! The flush error notification is sent to notify the user that an error
44      //! occurred while flushing block data to disk. Kernel code may ignore flush
45      //! errors that don't affect the immediate operation it is trying to
46      //! perform. Applications can choose to handle the flush error notification
47      //! by logging the error, or notifying the user, or triggering an early
48      //! shutdown as a precaution against causing more errors.
49      virtual void flushError(const bilingual_str& message) {}
50  
51      //! The fatal error notification is sent to notify the user when an error
52      //! occurs in kernel code that can't be recovered from. After this
53      //! notification is sent, whatever function triggered the error should also
54      //! return an error code or raise an exception. Applications can choose to
55      //! handle the fatal error notification by logging the error, or notifying
56      //! the user, or triggering an early shutdown as a precaution against
57      //! causing more errors.
58      virtual void fatalError(const bilingual_str& message) {}
59  };
60  } // namespace kernel
61  
62  #endif // BITCOIN_KERNEL_NOTIFICATIONS_INTERFACE_H