diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index dc9cffb94e8c5f8c5b0242fcac99261a8ff62e7f..31d05d05dad8563a6a426b03a33efe7389418239 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -46,8 +46,10 @@ #include <vector> #include <string_view> #include "string.h" -#include <absl/container/flat_hash_map.h> -#include <absl/strings/str_format.h> + +#include "absl/synchronization/mutex.h" +#include "absl/container/flat_hash_map.h" +#include "absl/strings/str_format.h" #include "llapp.h" #include "llapr.h" @@ -1276,16 +1278,26 @@ namespace { LOG_MUTEX, STACKS_MUTEX }; - // Some logging calls happen very early in processing -- so early that our - // module-static variables aren't yet initialized. getMutex() wraps a - // function-static LLMutex so that early calls can still have a valid - // LLMutex instance. + + ABSL_CONST_INIT absl::Mutex sLogMutex(absl::kConstInit); + ABSL_CONST_INIT absl::Mutex sStackMutex(absl::kConstInit); + template <MutexDiscriminator MTX> - LLMutex* getMutex() + absl::Mutex* getMutex() + { + return nullptr; + } + + template <> + absl::Mutex* getMutex<LOG_MUTEX>() + { + return &sLogMutex; + } + + template <> + absl::Mutex* getMutex<STACKS_MUTEX>() { - // guaranteed to be initialized the first time control reaches here - static LLMutex sMutex; - return &sMutex; + return &sStackMutex; } bool checkLevelMap(const LevelMap& map, const std::string& key, @@ -1334,7 +1346,7 @@ namespace LLError bool Log::shouldLog(CallSite& site) { - LLMutexTrylock lock(getMutex<LOG_MUTEX>(), 5); + AbslMutexMaybeTrylock lock(getMutex<LOG_MUTEX>(), 5); if (!lock.isLocked()) { return false; @@ -1377,7 +1389,7 @@ namespace LLError std::ostringstream* Log::out() { - LLMutexTrylock lock(getMutex<LOG_MUTEX>(),5); + AbslMutexMaybeTrylock lock(getMutex<LOG_MUTEX>(),5); if (lock.isLocked()) { @@ -1395,7 +1407,7 @@ namespace LLError void Log::flush(std::ostringstream* out, char* message) { - LLMutexTrylock lock(getMutex<LOG_MUTEX>(),5); + AbslMutexMaybeTrylock lock(getMutex<LOG_MUTEX>(),5); if (!lock.isLocked()) { return; @@ -1427,7 +1439,7 @@ namespace LLError void Log::flush(std::ostringstream* out, const CallSite& site) { - LLMutexTrylock lock(getMutex<LOG_MUTEX>(),5); + AbslMutexMaybeTrylock lock(getMutex<LOG_MUTEX>(),5); if (!lock.isLocked()) { return; @@ -1616,7 +1628,7 @@ namespace LLError //static void LLCallStacks::push(const char* function, const int line) { - LLMutexTrylock lock(getMutex<STACKS_MUTEX>(), 5); + AbslMutexMaybeTrylock lock(getMutex<STACKS_MUTEX>(), 5); if (!lock.isLocked()) { return; @@ -1650,7 +1662,7 @@ namespace LLError //static void LLCallStacks::end(std::ostringstream* _out) { - LLMutexTrylock lock(getMutex<STACKS_MUTEX>(), 5); + AbslMutexMaybeTrylock lock(getMutex<STACKS_MUTEX>(), 5); if (!lock.isLocked()) { return; @@ -1672,7 +1684,7 @@ namespace LLError //static void LLCallStacks::print() { - LLMutexTrylock lock(getMutex<STACKS_MUTEX>(), 5); + AbslMutexMaybeTrylock lock(getMutex<STACKS_MUTEX>(), 5); if (!lock.isLocked()) { return; @@ -1715,7 +1727,7 @@ namespace LLError bool debugLoggingEnabled(const std::string& tag) { - LLMutexTrylock lock(getMutex<LOG_MUTEX>(), 5); + AbslMutexMaybeTrylock lock(getMutex<LOG_MUTEX>(), 5); if (!lock.isLocked()) { return false;