duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

cubeb_log.cpp (2081B)


      1 /*
      2  * Copyright © 2016 Mozilla Foundation
      3  *
      4  * This program is made available under an ISC-style license.  See the
      5  * accompanying file LICENSE for details.
      6  */
      7 #define NOMINMAX
      8 
      9 #include "cubeb_log.h"
     10 #include "cubeb_ringbuffer.h"
     11 #include "cubeb_tracing.h"
     12 #include <cstdarg>
     13 #ifdef _WIN32
     14 #include <windows.h>
     15 #else
     16 #include <time.h>
     17 #endif
     18 
     19 static std::atomic<cubeb_log_level> g_cubeb_log_level;
     20 static std::atomic<cubeb_log_callback> g_cubeb_log_callback;
     21 
     22 /** The maximum size of a log message, after having been formatted. */
     23 const size_t CUBEB_LOG_MESSAGE_MAX_SIZE = 256;
     24 /** The maximum number of log messages that can be queued before dropping
     25  * messages. */
     26 const size_t CUBEB_LOG_MESSAGE_QUEUE_DEPTH = 40;
     27 /** Number of milliseconds to wait before dequeuing log messages. */
     28 const size_t CUBEB_LOG_BATCH_PRINT_INTERVAL_MS = 10;
     29 
     30 void
     31 cubeb_noop_log_callback(char const * /* fmt */, ...)
     32 {
     33 }
     34 
     35 void
     36 cubeb_log_internal(char const * file, uint32_t line, char const * fmt, ...)
     37 {
     38   va_list args;
     39   va_start(args, fmt);
     40   char msg[CUBEB_LOG_MESSAGE_MAX_SIZE];
     41   vsnprintf(msg, CUBEB_LOG_MESSAGE_MAX_SIZE, fmt, args);
     42   va_end(args);
     43   g_cubeb_log_callback.load()("%s:%d:%s", file, line, msg);
     44 }
     45 
     46 void
     47 cubeb_log_internal_no_format(const char * msg)
     48 {
     49   g_cubeb_log_callback.load()(msg);
     50 }
     51 
     52 void
     53 cubeb_log_set(cubeb_log_level log_level, cubeb_log_callback log_callback)
     54 {
     55   g_cubeb_log_level = log_level;
     56   // Once a callback has a been set, `g_cubeb_log_callback` is never set back to
     57   // nullptr, to prevent a TOCTOU race between checking the pointer
     58   if (log_callback && log_level != CUBEB_LOG_DISABLED) {
     59     g_cubeb_log_callback = log_callback;
     60   } else if (!log_callback || CUBEB_LOG_DISABLED) {
     61     g_cubeb_log_callback = cubeb_noop_log_callback;
     62   } else {
     63     assert(false && "Incorrect parameters passed to cubeb_log_set");
     64   }
     65 }
     66 
     67 cubeb_log_level
     68 cubeb_log_get_level()
     69 {
     70   return g_cubeb_log_level;
     71 }
     72 
     73 cubeb_log_callback
     74 cubeb_log_get_callback()
     75 {
     76   if (g_cubeb_log_callback == cubeb_noop_log_callback) {
     77     return nullptr;
     78   }
     79   return g_cubeb_log_callback;
     80 }