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