Skip to content

Commit

Permalink
Drop the default logger in atexit callback
Browse files Browse the repository at this point in the history
  • Loading branch information
SpriteOvO committed Mar 22, 2024
1 parent 1a4b06d commit c241392
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions spdlog/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -310,10 +310,10 @@ pub const __EOL: &str = "\n";
#[doc(hidden)]
pub const __EOL: &str = "\r\n";

static DEFAULT_LOGGER: OnceCell<ArcSwap<Logger>> = OnceCell::new();
static DEFAULT_LOGGER: OnceCell<ArcSwapOption<Logger>> = OnceCell::new();

#[must_use]
fn default_logger_ref() -> &'static ArcSwap<Logger> {
fn default_logger_ref() -> &'static ArcSwapOption<Logger> {
DEFAULT_LOGGER.get_or_init(|| {
let stdout = StdStreamSink::builder()
.std_stream(StdStream::Stdout)
Expand All @@ -329,7 +329,8 @@ fn default_logger_ref() -> &'static ArcSwap<Logger> {

let sinks: [Arc<dyn Sink>; 2] = [Arc::new(stdout), Arc::new(stderr)];

let res = ArcSwap::from_pointee(Logger::builder().sinks(sinks).build_default().unwrap());
let res =
ArcSwapOption::from_pointee(Logger::builder().sinks(sinks).build_default().unwrap());

flush_default_logger_at_exit();
res
Expand Down Expand Up @@ -381,7 +382,7 @@ fn default_logger_ref() -> &'static ArcSwap<Logger> {
/// ```
#[must_use]
pub fn default_logger() -> Arc<Logger> {
default_logger_ref().load().clone()
default_logger_ref().load().clone().unwrap()
}

/// Sets the given logger as the default logger, and returns the old default
Expand All @@ -400,7 +401,7 @@ pub fn default_logger() -> Arc<Logger> {
/// info!(logger: old_logger, "this log will be handled by `old_logger`");
/// ```
pub fn swap_default_logger(logger: Arc<Logger>) -> Arc<Logger> {
default_logger_ref().swap(logger)
default_logger_ref().swap(Some(logger)).unwrap()
}

/// Sets the given logger as the default logger.
Expand Down Expand Up @@ -658,7 +659,10 @@ fn flush_default_logger_at_exit() {
extern "C" fn handler() {
IS_TEARING_DOWN.store(true, Ordering::SeqCst);
if let Some(default_logger) = DEFAULT_LOGGER.get() {
default_logger.load().flush()
// Swap with `None` so it will be dropped at the end of this function
if let Some(default_logger) = default_logger.swap(None) {
default_logger.flush();
}
}
}

Expand Down

0 comments on commit c241392

Please sign in to comment.