Use TLS for last exception stack trace.

This commit is contained in:
Gunnar Beutner 2013-03-08 14:41:01 +01:00
parent cada2abeb3
commit 756d465ca9
2 changed files with 7 additions and 8 deletions

View File

@ -21,7 +21,7 @@
using namespace icinga; using namespace icinga;
StackTrace *Exception::m_StackTrace = NULL; boost::thread_specific_ptr<StackTrace> Exception::m_LastStackTrace;
/** /**
* Retrieves the error code for the exception. * Retrieves the error code for the exception.
@ -146,11 +146,13 @@ void __cxa_throw(void *obj, void *pvtinfo, void (*dest)(void *))
if (tinfo->__is_pointer_p()) if (tinfo->__is_pointer_p())
thrown_ptr = *(void **)thrown_ptr; thrown_ptr = *(void **)thrown_ptr;
StackTrace trace;
Exception::SetLastStackTrace(trace);
/* Check if thrown_ptr inherits from boost::exception. */ /* Check if thrown_ptr inherits from boost::exception. */
if (boost_exc->__do_catch(tinfo, &thrown_ptr, 1)) { if (boost_exc->__do_catch(tinfo, &thrown_ptr, 1)) {
boost::exception *ex = (boost::exception *)thrown_ptr; boost::exception *ex = (boost::exception *)thrown_ptr;
StackTrace trace;
*ex << StackTraceErrorInfo(trace); *ex << StackTraceErrorInfo(trace);
} }
@ -160,14 +162,11 @@ void __cxa_throw(void *obj, void *pvtinfo, void (*dest)(void *))
StackTrace *Exception::GetLastStackTrace(void) StackTrace *Exception::GetLastStackTrace(void)
{ {
return m_StackTrace; return m_LastStackTrace.get();
} }
void Exception::SetLastStackTrace(const StackTrace& trace) void Exception::SetLastStackTrace(const StackTrace& trace)
{ {
if (m_StackTrace) m_LastStackTrace.reset(new StackTrace(trace));
delete m_StackTrace;
m_StackTrace = new StackTrace(trace);
} }

View File

@ -65,7 +65,7 @@ private:
String m_Message; String m_Message;
int m_Code; int m_Code;
static StackTrace *m_StackTrace; static boost::thread_specific_ptr<StackTrace> m_LastStackTrace;
}; };
typedef boost::error_info<StackTrace, StackTrace> StackTraceErrorInfo; typedef boost::error_info<StackTrace, StackTrace> StackTraceErrorInfo;