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:
parent
3ec9ba039f
commit
884ca4e484
1 changed files with 37 additions and 16 deletions
|
|
@ -78,6 +78,41 @@ struct CrtAssertFailure
|
|||
|
||||
#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
|
||||
static string GetExceptionMessage()
|
||||
{
|
||||
|
|
@ -90,9 +125,8 @@ static string GetExceptionMessage()
|
|||
#if wxDEBUG_LEVEL
|
||||
catch ( TestAssertFailure& e )
|
||||
{
|
||||
msg << "wxWidgets assert: " << e.m_cond << " failed "
|
||||
"at " << e.m_file << ":" << e.m_line << " in " << e.m_func
|
||||
<< " with message '" << e.m_msg << "'";
|
||||
msg << FormatAssertMessage(e.m_file, e.m_line, e.m_func,
|
||||
e.m_cond, e.m_msg);
|
||||
}
|
||||
#endif // wxDEBUG_LEVEL
|
||||
#ifdef wxUSE_VC_CRTDBG
|
||||
|
|
@ -274,19 +308,6 @@ static int TestCrtReportHook(int reportType, char *message, int *)
|
|||
|
||||
#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)
|
||||
{
|
||||
// tests can be ran non-interactively so make sure we don't show any assert
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue