summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnold Dumas <arnold@dumas.at>2017-02-02 20:50:44 +0100
committerNoel Grandin <noel.grandin@collabora.co.uk>2017-02-03 10:54:53 +0000
commitb3a11c8f4f307bbbb597c9c6e7e61ee93e794873 (patch)
treee36db538926a923d4da136ef48a00a1622a7b648
parent29337650a379d1bcfe28bc41182254935f77cacc (diff)
tdf#91872: Make SAL_INFO and friends more efficient
Change-Id: I8a5b1665660b0679439f07d3924bb90cb4c4075c Reviewed-on: https://gerrit.libreoffice.org/33848 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r--include/sal/log.hxx5
-rw-r--r--sal/osl/all/log.cxx162
-rw-r--r--sal/util/sal.map1
3 files changed, 86 insertions, 82 deletions
diff --git a/include/sal/log.hxx b/include/sal/log.hxx
index 4438ec559fae..ea070dd68d4e 100644
--- a/include/sal/log.hxx
+++ b/include/sal/log.hxx
@@ -34,6 +34,9 @@ extern "C" SAL_DLLPUBLIC void SAL_CALL sal_detail_log_backtrace(
enum sal_detail_LogLevel level, char const * area, char const * where,
char const * message, int maxNoStackFramesToDisplay);
+extern "C" SAL_DLLPUBLIC int SAL_CALL sal_detail_log_report(
+ enum sal_detail_LogLevel level, char const * area);
+
namespace sal { namespace detail {
inline void SAL_CALL log(
@@ -116,7 +119,7 @@ inline char const * unwrapStream(SAL_UNUSED_PARAMETER StreamIgnore const &) {
#define SAL_DETAIL_LOG_STREAM(condition, level, area, where, stream) \
do { \
- if (condition) { \
+ if ((condition) && sal_detail_log_report(level, area)) { \
if (sizeof ::sal::detail::getResult( \
::sal::detail::StreamStart() << stream) == 1) \
{ \
diff --git a/sal/osl/all/log.cxx b/sal/osl/all/log.cxx
index 7245a51000b4..5e4497fac24b 100644
--- a/sal/osl/all/log.cxx
+++ b/sal/osl/all/log.cxx
@@ -190,84 +190,6 @@ bool isDebug(sal_detail_LogLevel level) {
return level == SAL_DETAIL_LOG_LEVEL_DEBUG;
}
-bool report(sal_detail_LogLevel level, char const * area) {
- if (isDebug(level))
- return true;
- assert(area != nullptr);
- char const * env = getEnvironmentVariable();
- if (env == nullptr) {
- env = "+WARN";
- }
- std::size_t areaLen = std::strlen(area);
- enum Sense { POSITIVE = 0, NEGATIVE = 1 };
- std::size_t senseLen[2] = { 0, 1 };
- // initial senseLen[POSITIVE] < senseLen[NEGATIVE], so that if there are
- // no matching switches at all, the result will be negative (and
- // initializing with 1 is safe as the length of a valid switch, even
- // without the "+"/"-" prefix, will always be > 1)
- bool seenWarn = false;
- for (char const * p = env;;) {
- Sense sense;
- switch (*p++) {
- case '\0':
- if (level == SAL_DETAIL_LOG_LEVEL_WARN && !seenWarn)
- return report(SAL_DETAIL_LOG_LEVEL_INFO, area);
- return senseLen[POSITIVE] >= senseLen[NEGATIVE];
- // if a specific item is both positive and negative
- // (senseLen[POSITIVE] == senseLen[NEGATIVE]), default to
- // positive
- case '+':
- sense = POSITIVE;
- break;
- case '-':
- sense = NEGATIVE;
- break;
- default:
- return true; // upon an illegal SAL_LOG value, enable everything
- }
- char const * p1 = p;
- while (*p1 != '.' && *p1 != '+' && *p1 != '-' && *p1 != '\0') {
- ++p1;
- }
- bool match;
- if (equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("INFO"))) {
- match = level == SAL_DETAIL_LOG_LEVEL_INFO;
- } else if (equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("WARN")))
- {
- match = level == SAL_DETAIL_LOG_LEVEL_WARN;
- seenWarn = true;
- } else if (equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("TIMESTAMP")) ||
- equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("RELATIVETIMER")))
- {
- // handled later
- match = false;
- } else {
- return true;
- // upon an illegal SAL_LOG value, everything is considered
- // positive
- }
- char const * p2 = p1;
- while (*p2 != '+' && *p2 != '-' && *p2 != '\0') {
- ++p2;
- }
- if (match) {
- if (*p1 == '.') {
- ++p1;
- std::size_t n = p2 - p1;
- if ((n == areaLen && equalStrings(p1, n, area, areaLen))
- || (n < areaLen && area[n] == '.'
- && equalStrings(p1, n, area, n)))
- {
- senseLen[sense] = p2 - p;
- }
- } else {
- senseLen[sense] = p1 - p;
- }
- }
- p = p2;
- }
-}
-
void log(
sal_detail_LogLevel level, char const * area, char const * where,
char const * message)
@@ -367,7 +289,7 @@ void sal_detail_log(
sal_detail_LogLevel level, char const * area, char const * where,
char const * message)
{
- if (report(level, area)) {
+ if (sal_detail_log_report(level, area)) {
log(level, area, where, message);
}
}
@@ -376,7 +298,7 @@ void sal_detail_log_backtrace(
sal_detail_LogLevel level, char const * area, char const * where,
char const * message, int maxNoStackFramesToDisplay)
{
- if (report(level, area)) {
+ if (sal_detail_log_report(level, area)) {
log_backtrace(level, area, where, message, maxNoStackFramesToDisplay);
}
}
@@ -385,7 +307,7 @@ void sal_detail_logFormat(
sal_detail_LogLevel level, char const * area, char const * where,
char const * format, ...)
{
- if (report(level, area)) {
+ if (sal_detail_log_report(level, area)) {
std::va_list args;
va_start(args, format);
char buf[1024];
@@ -401,4 +323,82 @@ void sal_detail_logFormat(
}
}
+int sal_detail_log_report(enum sal_detail_LogLevel level, char const * area) {
+ if (isDebug(level))
+ return true;
+ assert(area != nullptr);
+ char const * env = getEnvironmentVariable();
+ if (env == nullptr) {
+ env = "+WARN";
+ }
+ std::size_t areaLen = std::strlen(area);
+ enum Sense { POSITIVE = 0, NEGATIVE = 1 };
+ std::size_t senseLen[2] = { 0, 1 };
+ // initial senseLen[POSITIVE] < senseLen[NEGATIVE], so that if there are
+ // no matching switches at all, the result will be negative (and
+ // initializing with 1 is safe as the length of a valid switch, even
+ // without the "+"/"-" prefix, will always be > 1)
+ bool seenWarn = false;
+ for (char const * p = env;;) {
+ Sense sense;
+ switch (*p++) {
+ case '\0':
+ if (level == SAL_DETAIL_LOG_LEVEL_WARN && !seenWarn)
+ return sal_detail_log_report(SAL_DETAIL_LOG_LEVEL_INFO, area);
+ return senseLen[POSITIVE] >= senseLen[NEGATIVE];
+ // if a specific item is both positive and negative
+ // (senseLen[POSITIVE] == senseLen[NEGATIVE]), default to
+ // positive
+ case '+':
+ sense = POSITIVE;
+ break;
+ case '-':
+ sense = NEGATIVE;
+ break;
+ default:
+ return true; // upon an illegal SAL_LOG value, enable everything
+ }
+ char const * p1 = p;
+ while (*p1 != '.' && *p1 != '+' && *p1 != '-' && *p1 != '\0') {
+ ++p1;
+ }
+ bool match;
+ if (equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("INFO"))) {
+ match = level == SAL_DETAIL_LOG_LEVEL_INFO;
+ } else if (equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("WARN")))
+ {
+ match = level == SAL_DETAIL_LOG_LEVEL_WARN;
+ seenWarn = true;
+ } else if (equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("TIMESTAMP")) ||
+ equalStrings(p, p1 - p, RTL_CONSTASCII_STRINGPARAM("RELATIVETIMER")))
+ {
+ // handled later
+ match = false;
+ } else {
+ return true;
+ // upon an illegal SAL_LOG value, everything is considered
+ // positive
+ }
+ char const * p2 = p1;
+ while (*p2 != '+' && *p2 != '-' && *p2 != '\0') {
+ ++p2;
+ }
+ if (match) {
+ if (*p1 == '.') {
+ ++p1;
+ std::size_t n = p2 - p1;
+ if ((n == areaLen && equalStrings(p1, n, area, areaLen))
+ || (n < areaLen && area[n] == '.'
+ && equalStrings(p1, n, area, n)))
+ {
+ senseLen[sense] = p2 - p;
+ }
+ } else {
+ senseLen[sense] = p1 - p;
+ }
+ }
+ p = p2;
+ }
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sal/util/sal.map b/sal/util/sal.map
index 96ea9d13b945..b99d5241a7dd 100644
--- a/sal/util/sal.map
+++ b/sal/util/sal.map
@@ -731,6 +731,7 @@ PRIVATE_1.2 { # LibreOffice 3.5
PRIVATE_1.3 { # LibreOffice 5.4
global:
sal_detail_log_backtrace;
+ sal_detail_log_report;
} PRIVATE_1.2;
PRIVATE_textenc.1 { # LibreOffice 3.6