9 #include "quill/backend/BackendManager.h" 10 #include "quill/backend/BackendOptions.h" 11 #include "quill/backend/SignalHandler.h" 12 #include "quill/core/Attributes.h" 13 #include "quill/core/MetricManager.h" 14 #include "quill/core/QuillError.h" 27 constexpr uint32_t VersionMajor{12};
28 constexpr uint32_t VersionMinor{0};
29 constexpr uint32_t VersionPatch{0};
30 constexpr uint32_t Version{VersionMajor * 10000 + VersionMinor * 100 + VersionPatch};
42 std::call_once(detail::BackendManager::instance().get_start_once_flag(),
55 (void)detail::SignalHandlerContext::instance();
56 (void)detail::MetricManager::instance();
59 detail::BackendManager::instance().start_backend_thread(options);
64 if (!detail::BackendManager::instance().is_atexit_registered())
66 detail::BackendManager::instance().set_atexit_registered();
98 template <
typename TFrontendOptions>
103 detail::BackendManager::instance().get_start_once_flag(),
104 [backend_options, signal_handler_options]()
107 QUILL_MAYBE_UNUSED
bool signal_handler_initialized{
false};
109 QUILL_MAYBE_UNUSED
bool exception_handler_initialized{
false};
111 sigset_t
set, oldset;
112 QUILL_MAYBE_UNUSED
bool signal_mask_modified{
false};
119 (void)detail::MetricManager::instance();
122 detail::init_exception_handler<TFrontendOptions>();
123 exception_handler_initialized =
true;
128 if (sigprocmask(SIG_SETMASK, &
set, &oldset) != 0)
130 QUILL_THROW(
QuillError{
"Failed to block signals before starting the backend thread"});
132 signal_mask_modified =
true;
133 detail::init_signal_handler<TFrontendOptions>(signal_handler_options.
catchable_signals);
134 signal_handler_initialized =
true;
137 auto& signal_handler_context = detail::SignalHandlerContext::instance();
138 signal_handler_context.logger_name = signal_handler_options.
logger_name;
140 signal_handler_context.signal_handler_timeout_seconds.store(signal_handler_options.
timeout_seconds);
143 detail::BackendManager::instance().start_backend_thread(backend_options);
146 signal_handler_context.backend_thread_id.store(
147 detail::BackendManager::instance().get_backend_thread_id());
153 if (sigprocmask(SIG_SETMASK, &oldset,
nullptr) != 0)
156 QuillError{
"Failed to restore the caller signal mask after backend startup"});
158 signal_mask_modified =
false;
164 if (!detail::BackendManager::instance().is_atexit_registered())
166 detail::BackendManager::instance().set_atexit_registered();
170 #if !defined(QUILL_NO_EXCEPTIONS) 173 if (signal_handler_initialized)
175 detail::restore_signal_handlers();
178 if (exception_handler_initialized)
180 detail::deinit_exception_handler<TFrontendOptions>();
183 if (signal_mask_modified)
185 sigprocmask(SIG_SETMASK, &oldset,
nullptr);
205 QUILL_ATTRIBUTE_COLD
static void stop()
207 uint32_t
const backend_thread_id = detail::BackendManager::instance().get_backend_thread_id();
210 QUILL_THROW(
QuillError{
"Backend::stop() cannot be called from the backend worker thread"});
213 detail::SignalHandlerContext::instance().backend_thread_id.store(0);
214 detail::BackendManager::instance().stop_backend_thread();
216 if (
auto const fn = detail::SignalHandlerContext::instance().exception_handler_deinit_callback)
221 detail::deinit_signal_handler();
231 static void notify() noexcept { detail::BackendManager::instance().notify_backend_thread(); }
239 return detail::BackendManager::instance().is_backend_thread_running();
248 return detail::BackendManager::instance().get_backend_thread_id();
264 return detail::BackendManager::instance().convert_rdtsc_to_epoch_time(rdtsc_value);
319 (void)detail::MetricManager::instance();
322 detail::BackendManager::instance().get_start_once_flag(), [&manual_backend_worker]()
mutable 323 { manual_backend_worker = detail::BackendManager::instance().get_manual_backend_worker(); });
325 if (!manual_backend_worker)
328 QuillError{
"acquire_manual_backend_worker() can only be called once per process. " 329 "Additionally, it should not be " 330 "called when start() has already been invoked"});
333 return manual_backend_worker;
static QUILL_NODISCARD uint32_t get_thread_id() noexcept
Retrieves the ID of the backend thread.
Definition: Backend.h:246
static QUILL_NODISCARD bool is_running() noexcept
Checks if the backend is currently running.
Definition: Backend.h:237
static QUILL_ATTRIBUTE_COLD void start(BackendOptions const &backend_options, SignalHandlerOptions const &signal_handler_options)
Starts the backend thread and initialises a signal handler.
Definition: Backend.h:99
uint32_t timeout_seconds
Defines the timeout duration in seconds for the signal handler alarm.
Definition: SignalHandler.h:67
std::vector< std::string > excluded_logger_substrings
List of substrings used to exclude loggers during automatic logger selection.
Definition: SignalHandler.h:89
static void notify() noexcept
Notifies the backend thread to wake up.
Definition: Backend.h:231
static QUILL_ATTRIBUTE_COLD void stop()
Stops the backend thread.
Definition: Backend.h:205
static QUILL_ATTRIBUTE_COLD ManualBackendWorker * acquire_manual_backend_worker()
This feature is designed for advanced users who need to run the backend worker on their own thread...
Definition: Backend.h:311
This class can be used when you want to run the backend worker on your own thread.
Definition: ManualBackendWorker.h:30
static QUILL_ATTRIBUTE_COLD void start(BackendOptions const &options=BackendOptions{})
Starts the backend thread.
Definition: Backend.h:40
custom exception
Definition: QuillError.h:47
std::vector< int > catchable_signals
List of signals that the backend should catch if with_signal_handler is enabled.
Definition: SignalHandler.h:58
Struct to hold options for the signal handler.
Definition: SignalHandler.h:50
static QUILL_NODISCARD uint64_t convert_rdtsc_to_epoch_time(uint64_t rdtsc_value)
Converts an rdtsc value to epoch time.
Definition: Backend.h:262
std::string logger_name
The name of the logger instance that the signal handler will use to log errors when the application c...
Definition: SignalHandler.h:79
QUILL_NODISCARD QUILL_EXPORT QUILL_ATTRIBUTE_USED uint32_t get_thread_id() noexcept
Returns the os assigned ID of the thread.
Definition: ThreadUtilities.h:213
Configuration options for the backend.
Definition: BackendOptions.h:51