From 7991c141ee82592bba789d5de09c1a9e55eb5f6b Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Mon, 13 Apr 2026 19:05:16 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Separate=20GEOS=20/=20LvArray=20err?= =?UTF-8?q?or=20detection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/initializeEnvironment.cpp | 39 ++++++++++++++----- .../common/logger/ErrorHandling.cpp | 10 +++++ .../common/logger/ErrorHandling.hpp | 24 ++++++++++++ src/coreComponents/common/logger/Logger.hpp | 2 +- src/main/main.cpp | 4 +- 5 files changed, 66 insertions(+), 13 deletions(-) diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index e43263c8528..62772b42a7c 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -70,9 +70,9 @@ void setupLogger() { // setup error handling (using LvArray helper system functions) + ///// set external error handling behaviour ///// ExternalErrorHandler::instance().enableStderrPipeDeviation( true ); - ///// set external error handling behaviour ///// ExternalErrorHandler::instance().setErrorHandling( []( string_view errorMsg, string_view detectionLocation ) { @@ -105,25 +105,44 @@ void setupLogger() // Disable signal handling to prevent catching exit signal (infinite loop) LvArray::system::setSignalHandling( nullptr ); - // first of all, external error can await to be output, we must output them + // first of all, there can be external error that await to be output ExternalErrorHandler::instance().flush( "before signal error output" ); // error message output std::string const stackHistory = LvArray::system::stackTrace( true ); DiagnosticMsg diagnosticMsg; - ErrorLogger::global().flushErrorMsg( DiagnosticMsgBuilder::init( diagnosticMsg, - MsgType::ExternalError, "", - ::geos::logger::internal::g_rank ) - .addSignal( signal ) - .addCallStackInfo( stackHistory ) - .getDiagnosticMsg() ); + DiagnosticMsgBuilder::init( diagnosticMsg, + MsgType::ExternalError, "", + ::geos::logger::internal::g_rank ) + .addSignal( signal ) + .addCallStackInfo( stackHistory ); + ErrorLogger::global().flushErrorMsg( diagnosticMsg ); // call program termination - LvArray::system::callErrorHandler(); + ErrorHandler::instance().abortProgram(); } ); - ///// set Post-Handled Error behaviour ///// + ///// set LvArray to use the GEOS error behaviour in a way that can be traced ///// LvArray::system::setErrorHandler( []() + { + // first of all, there can be external error that await to be output + ExternalErrorHandler::instance().flush( "after LvArray error detection" ); + + // default error message output + DiagnosticMsg diagnosticMsg; + DiagnosticMsgBuilder::init( diagnosticMsg, + MsgType::ExternalError, + "LvArray Runtime Error", + ::geos::logger::internal::g_rank ) + .addCallStackInfo( LvArray::system::stackTrace( true ) ); + ErrorLogger::global().flushErrorMsg( diagnosticMsg ); + + // call program termination + ErrorHandler::instance().abortProgram(); + } ); + + ///// set Post-Handled Error behaviour ///// + ErrorHandler::instance().setProgramAborter( []() { #if defined( GEOS_USE_MPI ) int mpi = 0; diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 6881e11259a..9624f5efebd 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -453,4 +453,14 @@ void ErrorLogger::flushCurrentExceptionMessage() } } +ErrorHandler::ErrorHandler() + : m_abortingFunctor( []() { std::abort(); } ) +{} + +ErrorHandler & ErrorHandler::instance() +{ + static ErrorHandler s_instance; + return s_instance; +} + } /* namespace geos */ diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 38df2a2566c..7bab2763210 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -424,7 +424,31 @@ class ErrorLogger std::string_view indent ); }; +class ErrorHandler +{ +public: + + static ErrorHandler & instance(); + + void setProgramAborter( std::function< void() > const & abortingFunctor ) + { m_abortingFunctor = abortingFunctor; } + + /** + * @brief Post error-handling function that terminates the program. + */ + void abortProgram() + { m_abortingFunctor(); } +private: + + std::function< void() > m_abortingFunctor; + + /** + * @brief Static class, no public constructor + */ + ErrorHandler(); + +}; } /* namespace geos */ diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index b23ba87a39d..355b6f86596 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -164,7 +164,7 @@ .addCallStackInfo( LvArray::system::stackTrace( true ) ) \ .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ )); \ GEOS_GLOBAL_LOGGER.flushCurrentExceptionMessage(); \ - LvArray::system::callErrorHandler(); \ + ErrorHandler::instance().abortProgram(); \ } \ }while( false ) #elif __CUDA_ARCH__ diff --git a/src/main/main.cpp b/src/main/main.cpp index 00c7a560ef6..e2836d1f1db 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -81,7 +81,7 @@ int main( int argc, char *argv[] ) { // GEOS generated exceptions management ErrorLogger::global().flushCurrentExceptionMessage(); basicCleanup( true ); - LvArray::system::callErrorHandler(); + ErrorHandler::instance().abortProgram(); } catch( std::exception const & e ) { // native exceptions management @@ -91,7 +91,7 @@ int main( int argc, char *argv[] ) .addCallStackInfo( LvArray::system::stackTrace( true ) ) .getDiagnosticMsg()); basicCleanup( true ); - LvArray::system::callErrorHandler(); + ErrorHandler::instance().abortProgram(); } return 0; }