Abort on asserts in worker threads.

Throwing an exception from worker threads is useless as it is not caught by
our wxUnitTestProtector which only protects the main thread, so abort
immediately to be sure to provide at least some information about the problem
as otherwise nothing may be output at all and the program can end up
deadlocked.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61996 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-09-21 14:45:37 +00:00
parent 3ec9ba039f
commit 884ca4e484

View File

@@ -78,6 +78,41 @@ struct CrtAssertFailure
#endif // wxUSE_VC_CRTDBG #endif // wxUSE_VC_CRTDBG
#if wxDEBUG_LEVEL
static wxString FormatAssertMessage(const wxString& file,
int line,
const wxString& func,
const wxString& cond,
const wxString& msg)
{
wxString str;
str << "wxWidgets assert: " << cond << " failed "
"at " << file << ":" << line << " in " << func
<< " with message '" << msg << "'";
return str;
}
static void TestAssertHandler(const wxString& file,
int line,
const wxString& func,
const wxString& cond,
const wxString& msg)
{
// can't throw from other threads, die immediately
if ( !wxIsMainThread() )
{
wxPrintf("%s in a worker thread -- aborting.",
FormatAssertMessage(file, line, func, cond, msg));
fflush(stdout);
_exit(-1);
}
throw TestAssertFailure(file, line, func, cond, msg);
}
#endif // wxDEBUG_LEVEL
// this function should only be called from a catch clause // this function should only be called from a catch clause
static string GetExceptionMessage() static string GetExceptionMessage()
{ {
@@ -90,9 +125,8 @@ static string GetExceptionMessage()
#if wxDEBUG_LEVEL #if wxDEBUG_LEVEL
catch ( TestAssertFailure& e ) catch ( TestAssertFailure& e )
{ {
msg << "wxWidgets assert: " << e.m_cond << " failed " msg << FormatAssertMessage(e.m_file, e.m_line, e.m_func,
"at " << e.m_file << ":" << e.m_line << " in " << e.m_func e.m_cond, e.m_msg);
<< " with message '" << e.m_msg << "'";
} }
#endif // wxDEBUG_LEVEL #endif // wxDEBUG_LEVEL
#ifdef wxUSE_VC_CRTDBG #ifdef wxUSE_VC_CRTDBG
@@ -274,19 +308,6 @@ static int TestCrtReportHook(int reportType, char *message, int *)
#endif // wxUSE_VC_CRTDBG #endif // wxUSE_VC_CRTDBG
#if wxDEBUG_LEVEL
static void TestAssertHandler(const wxString& file,
int line,
const wxString& func,
const wxString& cond,
const wxString& msg)
{
throw TestAssertFailure(file, line, func, cond, msg);
}
#endif // wxDEBUG_LEVEL
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
// tests can be ran non-interactively so make sure we don't show any assert // tests can be ran non-interactively so make sure we don't show any assert