From 884ca4e484c3c867407649c74b6f16a428d31a26 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 21 Sep 2009 14:45:37 +0000 Subject: [PATCH] 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 --- tests/test.cpp | 53 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 16 deletions(-) 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 -- 2.47.2