From: Vadim Zeitlin Date: Mon, 21 Sep 2009 14:45:37 +0000 (+0000) Subject: Abort on asserts in worker threads. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/884ca4e484c3c867407649c74b6f16a428d31a26 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 --- diff --git a/tests/test.cpp b/tests/test.cpp index eeefa10849..676e33b351 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -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