Commit fc507b26 authored by Adam Simpkins's avatar Adam Simpkins Committed by Facebook Github Bot

Don't try to access XlogFileScopeInfo->category if not supported

Summary: This was breaking Windows builds.

Reviewed By: Orvid

Differential Revision: D5351468

fbshipit-source-id: 3385931b82b11d71d98861fb45efc71a632d470b
parent b7fd076d
......@@ -52,20 +52,6 @@ LogStreamProcessor::LogStreamProcessor(
INTERNAL,
std::string()) {}
LogStreamProcessor::LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo,
LogLevel level,
folly::StringPiece filename,
unsigned int lineNumber,
AppendType) noexcept
: LogStreamProcessor(
fileScopeInfo,
level,
filename,
lineNumber,
INTERNAL,
std::string()) {}
LogStreamProcessor::LogStreamProcessor(
const LogCategory* category,
LogLevel level,
......@@ -90,13 +76,6 @@ LogCategory* getXlogCategory(
}
return categoryInfo->getCategory(&xlog_detail::xlogFileScopeInfo);
}
LogCategory* getXlogCategory(XlogFileScopeInfo* fileScopeInfo) {
// By the time a LogStreamProcessor is created, the XlogFileScopeInfo object
// should have already been initialized to perform the log level check.
// Therefore we never need to check if it is initialized here.
return fileScopeInfo->category;
}
}
/**
......@@ -125,12 +104,28 @@ LogStreamProcessor::LogStreamProcessor(
message_{std::move(msg)},
stream_{this} {}
#ifdef __INCLUDE_LEVEL__
namespace {
LogCategory* getXlogCategory(XlogFileScopeInfo* fileScopeInfo) {
// By the time a LogStreamProcessor is created, the XlogFileScopeInfo object
// should have already been initialized to perform the log level check.
// Therefore we never need to check if it is initialized here.
return fileScopeInfo->category;
}
}
/**
* Construct a LogStreamProcessor from an XlogFileScopeInfo.
*
* We intentionally define this in LogStreamProcessor.cpp instead of
* LogStreamProcessor.h to avoid having it inlined at every XLOG() call site,
* to reduce the emitted code size.
*
* This is only defined if __INCLUDE_LEVEL__ is available. The
* XlogFileScopeInfo APIs are only invoked if we can use __INCLUDE_LEVEL__ to
* tell that an XLOG() statement occurs in a non-header file. For compilers
* that do not support __INCLUDE_LEVEL__, the category information is always
* passed in as XlogCategoryInfo<true> rather than as XlogFileScopeInfo.
*/
LogStreamProcessor::LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo,
......@@ -146,6 +141,21 @@ LogStreamProcessor::LogStreamProcessor(
message_{std::move(msg)},
stream_{this} {}
LogStreamProcessor::LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo,
LogLevel level,
folly::StringPiece filename,
unsigned int lineNumber,
AppendType) noexcept
: LogStreamProcessor(
fileScopeInfo,
level,
filename,
lineNumber,
INTERNAL,
std::string()) {}
#endif
/*
* We intentionally define the LogStreamProcessor destructor in
* LogStreamProcessor.cpp instead of LogStreamProcessor.h to avoid having it
......
......@@ -108,39 +108,29 @@ class LogStreamProcessor {
AppendType) noexcept;
/**
* LogStreamProcessor constructors for use with XLOG() macros with no extra
* arguments.
* LogStreamProcessor constructor for use with a LOG() macro with arguments
* to be concatenated with folly::to<std::string>()
*
* These are defined separately from the above constructor so that the work
* of initializing the XLOG LogCategory data is done in a separate function
* body defined in LogStreamProcessor.cpp. We intentionally want to avoid
* inlining this work at every XLOG() statement, to reduce the emitted code
* size.
* Note that the filename argument is not copied. The caller should ensure
* that it points to storage that will remain valid for the lifetime of the
* LogStreamProcessor. (This is always the case for the __FILE__
* preprocessor macro.)
*/
template <typename... Args>
LogStreamProcessor(
XlogCategoryInfo<true>* categoryInfo,
LogLevel level,
folly::StringPiece categoryName,
bool isCategoryNameOverridden,
folly::StringPiece filename,
unsigned int lineNumber,
AppendType) noexcept;
LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo,
LogLevel level,
folly::StringPiece filename,
unsigned int lineNumber,
AppendType) noexcept;
LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo,
const LogCategory* category,
LogLevel level,
folly::StringPiece /* categoryName */,
bool /* isCategoryNameOverridden */,
folly::StringPiece filename,
unsigned int lineNumber,
AppendType) noexcept
: LogStreamProcessor(fileScopeInfo, level, filename, lineNumber, APPEND) {
}
AppendType,
Args&&... args) noexcept
: LogStreamProcessor(
category,
level,
filename,
lineNumber,
INTERNAL,
createLogString(std::forward<Args>(args)...)) {}
/**
* LogStreamProcessor constructor for use with a LOG() macro with arguments
......@@ -157,7 +147,8 @@ class LogStreamProcessor {
LogLevel level,
folly::StringPiece filename,
unsigned int lineNumber,
AppendType,
FormatType,
folly::StringPiece fmt,
Args&&... args) noexcept
: LogStreamProcessor(
category,
......@@ -165,11 +156,25 @@ class LogStreamProcessor {
filename,
lineNumber,
INTERNAL,
createLogString(std::forward<Args>(args)...)) {}
formatLogString(fmt, std::forward<Args>(args)...)) {}
/**
* Versions of the above constructor for use in XLOG() statements.
/*
* Versions of the above constructors for use in XLOG() statements.
*
* These are defined separately from the above constructor so that the work
* of initializing the XLOG LogCategory data is done in a separate function
* body defined in LogStreamProcessor.cpp. We intentionally want to avoid
* inlining this work at every XLOG() statement, to reduce the emitted code
* size.
*/
LogStreamProcessor(
XlogCategoryInfo<true>* categoryInfo,
LogLevel level,
folly::StringPiece categoryName,
bool isCategoryNameOverridden,
folly::StringPiece filename,
unsigned int lineNumber,
AppendType) noexcept;
template <typename... Args>
LogStreamProcessor(
XlogCategoryInfo<true>* categoryInfo,
......@@ -191,72 +196,69 @@ class LogStreamProcessor {
createLogString(std::forward<Args>(args)...)) {}
template <typename... Args>
LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo,
XlogCategoryInfo<true>* categoryInfo,
LogLevel level,
folly::StringPiece /* categoryName */,
bool /* isCategoryNameOverridden */,
folly::StringPiece categoryName,
bool isCategoryNameOverridden,
folly::StringPiece filename,
unsigned int lineNumber,
AppendType,
FormatType,
folly::StringPiece fmt,
Args&&... args) noexcept
: LogStreamProcessor(
fileScopeInfo,
categoryInfo,
level,
categoryName,
isCategoryNameOverridden,
filename,
lineNumber,
INTERNAL,
createLogString(std::forward<Args>(args)...)) {}
formatLogString(fmt, std::forward<Args>(args)...)) {}
/**
* LogStreamProcessor constructor for use with a LOG() macro with arguments
* to be concatenated with folly::to<std::string>()
#ifdef __INCLUDE_LEVEL__
/*
* Versions of the above constructors to use in XLOG() macros that appear in
* .cpp files. These are only used if the compiler supports the
* __INCLUDE_LEVEL__ macro, which we need to determine that the XLOG()
* statement is not in a header file.
*
* Note that the filename argument is not copied. The caller should ensure
* that it points to storage that will remain valid for the lifetime of the
* LogStreamProcessor. (This is always the case for the __FILE__
* preprocessor macro.)
* These behave identically to the XlogCategoryInfo<true> versions of the
* APIs, but slightly more optimized, and allow the XLOG() code to avoid
* storing category information at each XLOG() call site.
*/
template <typename... Args>
LogStreamProcessor(
const LogCategory* category,
XlogFileScopeInfo* fileScopeInfo,
LogLevel level,
folly::StringPiece filename,
unsigned int lineNumber,
FormatType,
folly::StringPiece fmt,
Args&&... args) noexcept
: LogStreamProcessor(
category,
level,
filename,
lineNumber,
INTERNAL,
formatLogString(fmt, std::forward<Args>(args)...)) {}
/**
* Versions of the above constructor for use in XLOG() statements.
*/
AppendType) noexcept;
LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo,
LogLevel level,
folly::StringPiece /* categoryName */,
bool /* isCategoryNameOverridden */,
folly::StringPiece filename,
unsigned int lineNumber,
AppendType) noexcept
: LogStreamProcessor(fileScopeInfo, level, filename, lineNumber, APPEND) {
}
template <typename... Args>
LogStreamProcessor(
XlogCategoryInfo<true>* categoryInfo,
XlogFileScopeInfo* fileScopeInfo,
LogLevel level,
folly::StringPiece categoryName,
bool isCategoryNameOverridden,
folly::StringPiece /* categoryName */,
bool /* isCategoryNameOverridden */,
folly::StringPiece filename,
unsigned int lineNumber,
FormatType,
folly::StringPiece fmt,
AppendType,
Args&&... args) noexcept
: LogStreamProcessor(
categoryInfo,
fileScopeInfo,
level,
categoryName,
isCategoryNameOverridden,
filename,
lineNumber,
INTERNAL,
formatLogString(fmt, std::forward<Args>(args)...)) {}
createLogString(std::forward<Args>(args)...)) {}
template <typename... Args>
LogStreamProcessor(
XlogFileScopeInfo* fileScopeInfo,
......@@ -275,6 +277,7 @@ class LogStreamProcessor {
lineNumber,
INTERNAL,
formatLogString(fmt, std::forward<Args>(args)...)) {}
#endif
~LogStreamProcessor() noexcept;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment