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:
@@ -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
|
||||||
|
Reference in New Issue
Block a user