proxygen
folly::XlogLevelInfo< IsInHeaderFile > Class Template Reference

#include <xlog.h>

Public Member Functions

bool check (LogLevel levelToCheck, folly::StringPiece categoryName, bool isOverridden, XlogFileScopeInfo *)
 

Private Member Functions

LogLevel loadLevelFull (folly::StringPiece categoryName, bool isOverridden)
 

Private Attributes

std::atomic< LogLevellevel_
 

Detailed Description

template<bool IsInHeaderFile>
class folly::XlogLevelInfo< IsInHeaderFile >

A file-static XlogLevelInfo and XlogCategoryInfo object is declared for each XLOG() statement.

We intentionally do not provide constructors for these structures, and rely on their members to be zero-initialized when the program starts. This ensures that everything will work as desired even if XLOG() statements are used during dynamic object initialization before main().

Definition at line 381 of file xlog.h.

Member Function Documentation

template<bool IsInHeaderFile>
bool folly::XlogLevelInfo< IsInHeaderFile >::check ( LogLevel  levelToCheck,
folly::StringPiece  categoryName,
bool  isOverridden,
XlogFileScopeInfo  
)
inline

Definition at line 383 of file xlog.h.

References LIKELY.

387  {
388  // Do an initial relaxed check. If this fails we know the category level
389  // is initialized and the log admittance check failed.
390  // Use LIKELY() to optimize for the case of disabled debug statements:
391  // we disabled debug statements to be cheap. If the log message is
392  // enabled then this check will still be minimal perf overhead compared to
393  // the overall cost of logging it.
394  if (LIKELY(levelToCheck < level_.load(std::memory_order_relaxed))) {
395  return false;
396  }
397 
398  // If we are still here, then either:
399  // - The log level check actually passed, or
400  // - level_ has not been initialized yet, and we have to initialize it and
401  // then re-perform the check.
402  //
403  // Do this work in a separate helper method. It is intentionally defined
404  // in the xlog.cpp file to avoid inlining, to reduce the amount of code
405  // emitted for each XLOG() statement.
406  auto currentLevel = loadLevelFull(categoryName, isOverridden);
407  return levelToCheck >= currentLevel;
408  }
#define LIKELY(x)
Definition: Likely.h:47
std::atomic< LogLevel > level_
Definition: xlog.h:415
LogLevel loadLevelFull(folly::StringPiece categoryName, bool isOverridden)
Definition: xlog.cpp:72
template<bool IsInHeaderFile>
LogLevel folly::XlogLevelInfo< IsInHeaderFile >::loadLevelFull ( folly::StringPiece  categoryName,
bool  isOverridden 
)
private

Definition at line 72 of file xlog.cpp.

References folly::LoggerDB::get(), folly::getXlogCategoryNameForFile(), folly::UNINITIALIZED, UNLIKELY, and folly::LoggerDB::xlogInit().

Referenced by folly::XlogCategoryInfo< IsInHeaderFile >::init().

74  {
75  auto currentLevel = level_.load(std::memory_order_acquire);
76  if (UNLIKELY(currentLevel == ::folly::LogLevel::UNINITIALIZED)) {
77  return LoggerDB::get().xlogInit(
78  isOverridden ? categoryName : getXlogCategoryNameForFile(categoryName),
79  &level_,
80  nullptr);
81  }
82  return currentLevel;
83 }
StringPiece getXlogCategoryNameForFile(StringPiece filename)
Definition: xlog.cpp:57
LogLevel xlogInit(folly::StringPiece categoryName, std::atomic< LogLevel > *xlogCategoryLevel, LogCategory **xlogCategory)
Definition: LoggerDB.cpp:597
std::atomic< LogLevel > level_
Definition: xlog.h:415
#define UNLIKELY(x)
Definition: Likely.h:48
static LoggerDB & get()
Definition: LoggerDB.cpp:112

Member Data Documentation

template<bool IsInHeaderFile>
std::atomic<LogLevel> folly::XlogLevelInfo< IsInHeaderFile >::level_
private

Definition at line 415 of file xlog.h.


The documentation for this class was generated from the following files: