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 {
33 {
34 public:
35  /***/
36  QUILL_EXPORT static BackendManager& instance() noexcept
37  {
38  static BackendManager instance;
39  return instance;
40  }
41 
42  /***/
43  BackendManager(BackendManager const&) = delete;
44  BackendManager& operator=(BackendManager const&) = delete;
45 
46 private:
47  friend class quill::Backend;
48  friend class quill::BackendTscClock;
49 
50  /***/
51  BackendManager() = default;
52  ~BackendManager() { delete _start_once_flag.load(); }
53 
54  /***/
55  QUILL_ATTRIBUTE_COLD void start_backend_thread(BackendOptions const& options)
56  {
57  // Start the backend worker
58  _backend_worker.run(options);
59  }
60 
61  /***/
62  QUILL_ATTRIBUTE_COLD std::once_flag& get_start_once_flag() noexcept
63  {
64  return *_start_once_flag.load();
65  }
66 
67  /***/
68  QUILL_ATTRIBUTE_COLD void stop_backend_thread() noexcept
69  {
70  _backend_worker.stop();
71 
72  auto* new_flag = new std::once_flag();
73  std::once_flag* old_flag = _start_once_flag.exchange(new_flag);
74  delete old_flag;
75  }
76 
77  /***/
78  QUILL_NODISCARD uint32_t get_backend_thread_id() const noexcept
79  {
80  return _backend_worker.get_backend_thread_id();
81  }
82 
83  /***/
84  void notify_backend_thread() noexcept { _backend_worker.notify(); }
85 
86  /***/
87  QUILL_NODISCARD bool is_backend_thread_running() const noexcept
88  {
89  return _backend_worker.is_running();
90  }
91 
92  /***/
93  QUILL_NODISCARD uint64_t convert_rdtsc_to_epoch_time(uint64_t rdtsc_value) const
94  {
95  return _backend_worker.time_since_epoch(rdtsc_value);
96  }
97 
98  /***/
99  QUILL_NODISCARD ManualBackendWorker* get_manual_backend_worker() noexcept
100  {
101  return &_manual_backend_worker;
102  }
103 
104 private:
105  BackendWorker _backend_worker;
106  ManualBackendWorker _manual_backend_worker{&_backend_worker};
107  std::atomic<std::once_flag*> _start_once_flag{new std::once_flag};
108 };
109 } // namespace detail
110 
111 QUILL_END_NAMESPACE
void notify()
Wakes up the backend worker thread.
Definition: BackendWorker.h:237
QUILL_ATTRIBUTE_COLD void run(BackendOptions const &options)
Starts the backend worker thread.
Definition: BackendWorker.h:133
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:107
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:32
QUILL_ATTRIBUTE_COLD void stop() noexcept
Stops the backend worker thread.
Definition: BackendWorker.h:211
Definition: Backend.h:29
This class can be used when you want to run the backend worker on your own thread.
Definition: ManualBackendWorker.h:20
QUILL_NODISCARD uint32_t get_backend_thread_id() const noexcept
Get the backend worker&#39;s thread id.
Definition: BackendWorker.h:124
Definition: BackendWorker.h:72
Configuration options for the backend.
Definition: BackendOptions.h:30