summaryrefslogtreecommitdiff
path: root/indra/llcommon
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llcommon')
-rw-r--r--indra/llcommon/llerror.cpp18
-rw-r--r--indra/llcommon/llerror.h6
-rw-r--r--indra/llcommon/llerrorcontrol.h11
-rw-r--r--indra/llcommon/tests/llerror_test.cpp8
-rw-r--r--indra/llcommon/tests/wrapllerrs.h8
5 files changed, 30 insertions, 21 deletions
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 77d7fe1b24..6fa9e590cb 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -719,7 +719,7 @@ namespace LLError
commonInit(user_dir, app_dir, log_to_stderr);
}
- void overrideCrashOnError(const FatalFunction& fatal_function)
+ void setFatalHandler(const FatalFunction& fatal_function)
{
SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
s->mCrashFunction = fatal_function;
@@ -1306,12 +1306,12 @@ namespace LLError
return ;
}
- bool Log::flush(std::ostringstream* out, const CallSite& site)
+ ErrCrashHandlerResult Log::flush(std::ostringstream* out, const CallSite& site)
{
LLMutexTrylock lock(&gLogMutex,5);
if (!lock.isLocked())
{
- return false; // because this wasn't logged, it cannot be fatal
+ return ERR_DO_NOT_CRASH; // because this wasn't logged, it cannot be fatal
}
// If we hit a logging request very late during shutdown processing,
@@ -1319,7 +1319,7 @@ namespace LLError
// DO NOT resurrect them.
if (Settings::wasDeleted() || Globals::wasDeleted())
{
- return false; // because this wasn't logged, it cannot be fatal
+ return ERR_DO_NOT_CRASH; // because this wasn't logged, it cannot be fatal
}
Globals* g = Globals::getInstance();
@@ -1353,7 +1353,7 @@ namespace LLError
}
else
{
- return false; // because this wasn't logged, it cannot be fatal
+ return ERR_DO_NOT_CRASH; // because this wasn't logged, it cannot be fatal
}
}
else
@@ -1369,20 +1369,18 @@ namespace LLError
if (site.mLevel == LEVEL_ERROR)
{
- g->mFatalMessage = message;
if (s->mCrashFunction)
{
- s->mCrashFunction(message);
- return false; // because an override is in effect
+ return s->mCrashFunction(message);
}
else
{
- return true; // calling macro should crash
+ return ERR_CRASH; // calling macro should crash
}
}
else
{
- return false; // not ERROR, so do not crash
+ return ERR_DO_NOT_CRASH; // not ERROR, so do not crash
}
}
}
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 07aa5c6f8b..2a73ccb36a 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -194,6 +194,8 @@ namespace LLError
struct CallSite;
+ enum ErrCrashHandlerResult { ERR_DO_NOT_CRASH, ERR_CRASH };
+
class LL_COMMON_API Log
{
public:
@@ -203,7 +205,7 @@ namespace LLError
static void flush(std::ostringstream* out, char* message);
// returns false iff the calling macro should crash
- static bool flush(std::ostringstream*, const CallSite&);
+ static ErrCrashHandlerResult flush(std::ostringstream*, const CallSite&);
static std::string demangle(const char* mangled);
};
@@ -386,7 +388,7 @@ volatile extern int* gCauseCrash;
#define LL_ENDL \
LLError::End(); \
- if (LLError::Log::flush(_out, _site)) \
+ if (LLError::ERR_CRASH == LLError::Log::flush(_out, _site)) \
LLERROR_CRASH \
} \
} while(0)
diff --git a/indra/llcommon/llerrorcontrol.h b/indra/llcommon/llerrorcontrol.h
index af46430f74..2fa220ba5a 100644
--- a/indra/llcommon/llerrorcontrol.h
+++ b/indra/llcommon/llerrorcontrol.h
@@ -93,16 +93,21 @@ namespace LLError
Control functions.
*/
- typedef boost::function<void(const std::string&)> FatalFunction;
+ // A FatalFunction is called if set using setFatalHandler; its return controls
+ // whether or not the calling error logging code should crash.
+ // ERR_DO_NOT_CRASH should be used only in test code.
+ typedef boost::function<LLError::ErrCrashHandlerResult(const std::string&)> FatalFunction;
+
/// Override the default behavior of crashing on LL_ERRS; this should NEVER be used except in test code
- LL_COMMON_API void overrideCrashOnError(const FatalFunction&);
+ LL_COMMON_API void setFatalHandler(const FatalFunction&);
// The fatal function will be called when an message of LEVEL_ERROR
// is logged. Note: supressing a LEVEL_ERROR message from being logged
// (by, for example, setting a class level to LEVEL_NONE), will keep
// the that message from causing the fatal funciton to be invoked.
+ // The
- /// Undo the effect of the overrideCrashOnError above
+ /// Undo the effect of the setFatalHandler above
LL_COMMON_API void restoreCrashOnError();
LL_COMMON_API std::string getFatalMessage();
diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp
index 2f8923d2de..9dcb5c145f 100644
--- a/indra/llcommon/tests/llerror_test.cpp
+++ b/indra/llcommon/tests/llerror_test.cpp
@@ -70,7 +70,11 @@ namespace
namespace
{
static bool fatalWasCalled;
- void fatalCall(const std::string&) { fatalWasCalled = true; }
+ LLError::ErrCrashHandlerResult fatalCall(const std::string&)
+ {
+ fatalWasCalled = true;
+ return LLError::ERR_DO_NOT_CRASH;
+ }
}
namespace tut
@@ -120,7 +124,7 @@ namespace tut
mPriorErrorSettings = LLError::saveAndResetSettings();
LLError::setDefaultLevel(LLError::LEVEL_DEBUG);
- LLError::overrideCrashOnError(fatalCall);
+ LLError::setFatalHandler(fatalCall);
LLError::addRecorder(mRecorder);
}
diff --git a/indra/llcommon/tests/wrapllerrs.h b/indra/llcommon/tests/wrapllerrs.h
index fedc17dbe9..a412e12a04 100644
--- a/indra/llcommon/tests/wrapllerrs.h
+++ b/indra/llcommon/tests/wrapllerrs.h
@@ -46,7 +46,7 @@
// statically reference the function in test.cpp... it's short, we could
// replicate, but better to reuse
-extern void wouldHaveCrashed(const std::string& message);
+extern LLError::ErrCrashHandlerResult wouldHaveCrashed(const std::string& message);
struct WrapLLErrs
{
@@ -57,7 +57,7 @@ struct WrapLLErrs
:mPriorErrorSettings(LLError::saveAndResetSettings())
{
// Make LL_ERRS call our own operator() method
- LLError::overrideCrashOnError(boost::bind(&WrapLLErrs::operator(), this, _1));
+ LLError::setFatalHandler(boost::bind(&WrapLLErrs::operator(), this, _1));
}
~WrapLLErrs()
@@ -71,7 +71,7 @@ struct WrapLLErrs
FatalException(const std::string& what): LLException(what) {}
};
- void operator()(const std::string& message)
+ LLError::ErrCrashHandlerResult operator()(const std::string& message)
{
// Save message for later in case consumer wants to sense the result directly
error = message;
@@ -201,7 +201,7 @@ public:
mOldSettings(LLError::saveAndResetSettings()),
mRecorder(new CaptureLogRecorder())
{
- LLError::overrideCrashOnError(wouldHaveCrashed);
+ LLError::setFatalHandler(wouldHaveCrashed);
LLError::setDefaultLevel(level);
LLError::addRecorder(mRecorder);
}