quill
BackendManager.h
1 
7 #pragma once
8 
9 #include "quill/backend/BackendOptions.h"
10 #include "quill/backend/BackendWorker.h"
11 #include "quill/backend/ManualBackendWorker.h"
12 #include "quill/core/Attributes.h"
13 
14 #include <atomic>
15 #include <cstdint>
16 #include <mutex>
17 
18 QUILL_BEGIN_NAMESPACE
19 
20 QUILL_BEGIN_EXPORT
21 
22 // Forward declarations
23 class Backend;
24 class BackendTscClock;
25 
26 QUILL_END_EXPORT
27 
28 namespace detail
29 {
30 
31 #if defined(_WIN32) && defined(_MSC_VER) && !defined(__GNUC__)
32  #pragma warning(push)
33  #pragma warning(disable : 4324)
34 #endif
35 
43 {
44 public:
45  /***/
46  QUILL_EXPORT static BackendManager& instance() noexcept
47  {
48  static BackendManager instance;
49  return instance;
50  }
51 
52  /***/
53  BackendManager(BackendManager const&) = delete;
54  BackendManager& operator=(BackendManager const&) = delete;
55 
56 private:
57  friend class quill::Backend;
58  friend class quill::BackendTscClock;
59 
60  /***/
61  BackendManager() = default;
62  ~BackendManager() { delete _start_once_flag.load(); }
63 
64  /***/
65  QUILL_ATTRIBUTE_COLD void start_backend_thread(BackendOptions const& options)
66  {
67  // Start the backend worker
68  _backend_worker.run(options);
69  }
70 
71  /***/
72  QUILL_ATTRIBUTE_COLD std::once_flag& get_start_once_flag() noexcept
73  {
74  return *_start_once_flag.load();
75  }
76 
77  /***/
78  QUILL_ATTRIBUTE_COLD void stop_backend_thread() noexcept
79  {
80  _backend_worker.stop();
81 
82  auto* new_flag = new std::once_flag();
83  std::once_flag* old_flag = _start_once_flag.exchange(new_flag);
84  delete old_flag;
85  }
86 
87  /***/
88  QUILL_NODISCARD uint32_t get_backend_thread_id() const noexcept
89  {
90  return _backend_worker.get_backend_thread_id();
91  }
92 
93  /***/
94  void notify_backend_thread() noexcept { _backend_worker.notify(); }
95 
96  /***/
97  QUILL_NODISCARD bool is_backend_thread_running() const noexcept
98  {
99  return _backend_worker.is_running();
100  }
101 
102  /***/
103  QUILL_NODISCARD uint64_t convert_rdtsc_to_epoch_time(uint64_t rdtsc_value) const
104  {
105  return _backend_worker.time_since_epoch(rdtsc_value);
106  }
107 
108  /***/
109  QUILL_NODISCARD ManualBackendWorker* get_manual_backend_worker() noexcept
110  {
111  return &_manual_backend_worker;
112  }
113 
114 private:
115  /***/
116  QUILL_NODISCARD bool is_atexit_registered() const noexcept { return _atexit_registered.load(); }
117 
118  /***/
119  void set_atexit_registered() noexcept { _atexit_registered.store(true); }
120 
121 private:
122  BackendWorker _backend_worker;
123  ManualBackendWorker _manual_backend_worker{&_backend_worker};
124  std::atomic<std::once_flag*> _start_once_flag{new std::once_flag};
125  std::atomic<bool> _atexit_registered{false};
126 };
127 
128 #if defined(_WIN32) && defined(_MSC_VER) && !defined(__GNUC__)
129  #pragma warning(pop)
130 #endif
131 
132 } // namespace detail
133 
134 QUILL_END_NAMESPACE
void notify()
Wakes up the backend worker thread.
Definition: BackendWorker.h:300
QUILL_ATTRIBUTE_COLD void run(BackendOptions const &options)
Starts the backend worker thread.
Definition: BackendWorker.h:141
A utility class for accessing the Time Stamp Counter (TSC) clock used by the backend logging thread...
Definition: BackendTscClock.h:35
QUILL_NODISCARD uint64_t time_since_epoch(uint64_t rdtsc_value) const
Access the rdtsc class from any thread to convert an rdtsc value to wall time.
Definition: BackendWorker.h:115
Setups a signal handler to handle fatal signals.
Definition: BackendManager.h:28
Provides access to common collection class that are used by both the frontend and the backend compone...
Definition: BackendManager.h:42
QUILL_ATTRIBUTE_COLD void stop() noexcept
Stops the backend worker thread.
Definition: BackendWorker.h:248
Definition: Backend.h:32
This class can be used when you want to run the backend worker on your own thread.
Definition: ManualBackendWorker.h:30
QUILL_NODISCARD uint32_t get_backend_thread_id() const noexcept
Get the backend worker&#39;s thread id.
Definition: BackendWorker.h:132
Definition: BackendWorker.h:80
Configuration options for the backend.
Definition: BackendOptions.h:51