20 #ifndef GEOS_COMMON_LOGGER_HPP
21 #define GEOS_COMMON_LOGGER_HPP
24 #include "LvArray/src/Macros.hpp"
30 #if defined(GEOS_USE_MPI)
38 #define GEOS_LOG( ... ) LVARRAY_LOG( __VA_ARGS__ )
44 #define GEOS_LOG_VAR( ... ) LVARRAY_LOG_VAR( __VA_ARGS__ )
52 #if defined(GEOS_DEVICE_COMPILE)
53 #define GEOS_LOG_IF( EXP, msg )
55 #define GEOS_LOG_IF( EXP, msg ) \
59 std::cout<< msg << std::endl; \
70 #define GEOS_LOG_RANK_0_IF( EXP, msg ) \
72 if( ::geos::logger::internal::g_rank == 0 && EXP ) \
74 std::ostringstream oss; \
76 std::cout << oss.str() << std::endl; \
85 #define GEOS_LOG_RANK_0_IF_NLR( EXP, msg ) \
87 if( ::geos::logger::internal::g_rank == 0 && EXP ) \
89 std::ostringstream oss; \
91 std::cout << oss.str(); \
99 #define GEOS_LOG_RANK_0( msg ) GEOS_LOG_RANK_0_IF( true, msg )
106 #if defined(GEOS_DEVICE_COMPILE)
107 #define GEOS_LOG_RANK_IF( EXP, msg )
109 #define GEOS_LOG_RANK_IF( EXP, msg ) \
113 std::ostringstream oss; \
114 oss << "Rank " << ::geos::logger::internal::g_rankString << ": " << msg; \
115 *logger::internal::g_rankStream << oss.str() << std::endl; \
124 #define GEOS_LOG_RANK( msg ) GEOS_LOG_RANK_IF( true, msg )
130 #define GEOS_LOG_RANK_VAR( var ) GEOS_LOG_RANK( #var " = " << var )
137 #if !defined(GEOS_DEVICE_COMPILE) && !defined(GEOS_GLOBAL_LOGGER)
138 #define GEOS_GLOBAL_LOGGER ErrorLogger::global()
150 #if !defined(GEOS_DEVICE_COMPILE)
151 #define GEOS_ERROR_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \
156 std::ostringstream __msgoss; \
157 __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \
158 std::ostringstream __causemsgsoss; \
159 __causemsgsoss << CAUSE_MESSAGE; \
160 GEOS_GLOBAL_LOGGER.initCurrentExceptionMessage( MsgType::Error, __msgoss.str(), \
161 ::geos::logger::internal::g_rank ) \
162 .setCodeLocation( __FILE__, __LINE__ ) \
163 .setCause( __causemsgsoss.str() ) \
164 .addCallStackInfo( LvArray::system::stackTrace( true ) ) \
165 .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ )); \
166 GEOS_GLOBAL_LOGGER.flushCurrentExceptionMessage(); \
167 LvArray::system::callErrorHandler(); \
171 #define GEOS_ERROR_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \
176 constexpr char const * formatString = "***** ERROR\n" \
177 "***** LOCATION" LOCATION "\n" \
178 "***** BLOCK: [%u, %u, %u]\n" \
179 "***** THREAD: [%u, %u, %u]\n" \
180 "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \
181 "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \
182 printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \
186 #elif __HIP_DEVICE_COMPILE__
187 #define GEOS_ERROR_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \
192 GEOS_UNUSED_VAR( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ); \
193 constexpr char const * formatString = "***** ERROR\n" \
194 "***** LOCATION" LOCATION "\n" \
195 "***** BLOCK: [%u, %u, %u]\n" \
196 "***** THREAD: [%u, %u, %u]\n" \
199 printf( formatString, \
200 blockIdx.x, blockIdx.y, blockIdx.z, \
201 threadIdx.x, threadIdx.y, threadIdx.z, \
202 STRINGIZE( CAUSE_MESSAGE ), \
203 STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) \
205 asm volatile ( "s_trap 2" ); \
217 #define GEOS_ERROR_IF( COND, ... ) \
218 GEOS_ERROR_IF_CAUSE( COND, "Error cause: " STRINGIZE( COND ), __VA_ARGS__ )
226 #define GEOS_ERROR( ... ) GEOS_ERROR_IF_CAUSE( true, "", __VA_ARGS__ )
237 #if !defined(GEOS_DEVICE_COMPILE)
238 #define GEOS_THROW_IF_CAUSE( COND, CAUSE_MESSAGE, MSG, ... ) \
243 std::ostringstream __msgoss; \
245 std::ostringstream __causemsgsoss; \
246 __causemsgsoss << CAUSE_MESSAGE; \
247 DiagnosticMsg exceptionMsg = GEOS_GLOBAL_LOGGER.initCurrentExceptionMessage( MsgType::Exception, __msgoss.str(), \
248 ::geos::logger::internal::g_rank ) \
249 .setCodeLocation( __FILE__, __LINE__ ) \
250 .setCause( __causemsgsoss.str() ) \
251 .addCallStackInfo( LvArray::system::stackTrace( true ) ) \
252 .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ )) \
253 .getDiagnosticMsg(); \
254 auto ex = GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )(); \
255 ex.prepareWhat( exceptionMsg ); \
260 #define GEOS_THROW_IF_CAUSE( COND, CAUSE_MESSAGE, MSG, ... ) \
265 static char const formatString[] = "***** ERROR\n" \
266 "***** LOCATION" LOCATION "\n" \
267 "***** BLOCK: [%u, %u, %u]\n" \
268 "***** THREAD: [%u, %u, %u]\n" \
269 "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \
270 "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \
271 printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \
275 #elif __HIP_DEVICE_COMPILE__
276 #define GEOS_THROW_IF_CAUSE( COND, CAUSE_MESSAGE, MSG, ... ) \
281 ::geos::internal::DeviceNullStream __geosNullStream; \
282 __geosNullStream << MSG; \
283 static char const formatString[] = "***** ERROR\n" \
284 "***** LOCATION" LOCATION "\n" \
285 "***** BLOCK: [%u, %u, %u]\n" \
286 "***** THREAD: [%u, %u, %u]\n" \
289 printf( formatString, \
290 blockIdx.x, blockIdx.y, blockIdx.z, \
291 threadIdx.x, threadIdx.y, threadIdx.z, \
292 STRINGIZE( CAUSE_MESSAGE ), \
293 STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) \
295 asm volatile ( "s_trap 2" ); \
308 #define GEOS_THROW_IF( COND, MSG, ... ) \
309 GEOS_THROW_IF_CAUSE( COND, "Error cause: " STRINGIZE( COND ), MSG, __VA_ARGS__ )
318 #define GEOS_THROW( MSG, ... ) GEOS_THROW_IF_CAUSE( true, "", MSG, __VA_ARGS__ )
328 #if !defined(GEOS_DEVICE_COMPILE)
329 #define GEOS_WARNING_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \
334 std::ostringstream __msgoss; \
335 __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \
336 std::ostringstream __causemsgsoss; \
337 __causemsgsoss << CAUSE_MESSAGE; \
338 DiagnosticMsg __warningMsg; \
339 GEOS_GLOBAL_LOGGER.flushErrorMsg( DiagnosticMsgBuilder::init( __warningMsg, \
340 MsgType::Warning, __msgoss.str(), \
341 ::geos::logger::internal::g_rank ) \
342 .setCodeLocation( __FILE__, __LINE__ ) \
343 .setCause( __causemsgsoss.str() ) \
344 .addCallStackInfo( LvArray::system::stackTrace( true ) ) \
345 .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ )) \
346 .getDiagnosticMsg() ); \
350 #define GEOS_WARNING_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \
355 static char const formatString[] = "***** WARNING\n" \
356 "***** LOCATION" LOCATION "\n" \
357 "***** BLOCK: [%u, %u, %u]\n" \
358 "***** THREAD: [%u, %u, %u]\n" \
359 "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \
360 "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \
361 printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \
365 #elif __HIP_DEVICE_COMPILE__
366 #define GEOS_WARNING_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \
371 static char const formatString[] = "***** WARNING\n" \
372 "***** LOCATION" LOCATION "\n" \
373 "***** BLOCK: [%u, %u, %u]\n" \
374 "***** THREAD: [%u, %u, %u]\n" \
377 printf( formatString, \
378 blockIdx.x, blockIdx.y, blockIdx.z, \
379 threadIdx.x, threadIdx.y, threadIdx.z, \
380 STRINGIZE( CAUSE_MESSAGE ), \
381 STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) \
383 asm volatile ( "s_trap 2" ); \
395 #define GEOS_WARNING_IF( COND, ... ) \
396 GEOS_WARNING_IF_CAUSE( COND, "Warning cause: " STRINGIZE( COND ), __VA_ARGS__ )
404 #define GEOS_WARNING( ... ) GEOS_WARNING_IF_CAUSE( true, "", __VA_ARGS__ )
411 #define GEOS_INFO_IF( EXP, msg ) LVARRAY_INFO_IF( EXP, msg )
417 #define GEOS_INFO( msg ) LVARRAY_INFO( msg )
424 #define GEOS_ERROR_LHS_RHS_DECLS( lhs, rhs ) \
425 GEOS_MAYBE_UNUSED auto const lhsResult = (lhs); \
426 GEOS_MAYBE_UNUSED auto const rhsResult = (rhs)
438 #define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \
440 GEOS_ERROR_LHS_RHS_DECLS( lhs, rhs ); \
441 GEOS_ERROR_IF_CAUSE( lhsResult OP rhsResult, \
442 "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = " << lhsResult << "\n* " #rhs " = " << rhsResult << "\n", \
455 #define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, __VA_ARGS__ )
462 #define GEOS_ERROR_IF_EQ( lhs, rhs ) GEOS_ERROR_IF_EQ_MSG( lhs, rhs, "" )
472 #define GEOS_ERROR_IF_NE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, __VA_ARGS__ )
479 #define GEOS_ERROR_IF_NE( lhs, rhs ) GEOS_ERROR_IF_NE_MSG( lhs, rhs, "" )
489 #define GEOS_ERROR_IF_GT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >, <=, rhs, __VA_ARGS__ )
496 #define GEOS_ERROR_IF_GT( lhs, rhs ) GEOS_ERROR_IF_GT_MSG( lhs, rhs, "" )
506 #define GEOS_ERROR_IF_GE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >=, <, rhs, __VA_ARGS__ )
513 #define GEOS_ERROR_IF_GE( lhs, rhs ) GEOS_ERROR_IF_GE_MSG( lhs, rhs, "" )
523 #define GEOS_ERROR_IF_LT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <, >=, rhs, __VA_ARGS__ )
530 #define GEOS_ERROR_IF_LT( lhs, rhs ) GEOS_ERROR_IF_LT_MSG( lhs, rhs, "" )
540 #define GEOS_ERROR_IF_LE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <=, >, rhs, __VA_ARGS__ )
548 #define GEOS_ERROR_IF_LE( lhs, rhs ) GEOS_ERROR_IF_LE_MSG( lhs, rhs, "" )
560 #define GEOS_WARNING_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \
562 GEOS_ERROR_LHS_RHS_DECLS( lhs, rhs ); \
563 GEOS_WARNING_IF_CAUSE( lhsResult OP rhsResult, \
564 "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = " << lhsResult << "\n* " #rhs " = " << rhsResult << "\n", \
577 #define GEOS_WARNING_IF_EQ_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, ==, !=, rhs, __VA_ARGS__ )
584 #define GEOS_WARNING_IF_EQ( lhs, rhs ) GEOS_WARNING_IF_EQ_MSG( lhs, rhs, "" )
594 #define GEOS_WARNING_IF_NE_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, !=, ==, rhs, __VA_ARGS__ )
601 #define GEOS_WARNING_IF_NE( lhs, rhs ) GEOS_WARNING_IF_NE_MSG( lhs, rhs, "" )
611 #define GEOS_WARNING_IF_GT_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, >, <=, rhs, __VA_ARGS__ )
618 #define GEOS_WARNING_IF_GT( lhs, rhs ) GEOS_WARNING_IF_GT_MSG( lhs, rhs, "" )
628 #define GEOS_WARNING_IF_GE_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, >=, <, rhs, __VA_ARGS__ )
635 #define GEOS_WARNING_IF_GE( lhs, rhs ) GEOS_WARNING_IF_GE_MSG( lhs, rhs, "" )
645 #define GEOS_WARNING_IF_LT_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, <, >=, rhs, __VA_ARGS__ )
652 #define GEOS_WARNING_IF_LT( lhs, rhs ) GEOS_WARNING_IF_LT_MSG( lhs, rhs, "" )
662 #define GEOS_WARNING_IF_LE_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, <=, >, rhs, __VA_ARGS__ )
669 #define GEOS_WARNING_IF_LE( lhs, rhs ) GEOS_WARNING_IF_LE_MSG( lhs, rhs, "" )
682 #define GEOS_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, MSG, ... ) \
684 GEOS_ERROR_LHS_RHS_DECLS( lhs, rhs ); \
685 GEOS_THROW_IF_CAUSE( lhsResult OP rhsResult, \
686 "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = " << lhsResult << "\n* " #rhs " = " << rhsResult << "\n", \
687 MSG, __VA_ARGS__ ); \
701 #define GEOS_THROW_IF_EQ_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, MSG, __VA_ARGS__ )
711 #define GEOS_THROW_IF_EQ( lhs, rhs, ... ) GEOS_THROW_IF_EQ_MSG( lhs, rhs, "", __VA_ARGS__ )
722 #define GEOS_THROW_IF_NE_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, !=, ==, rhs, MSG, __VA_ARGS__ )
732 #define GEOS_THROW_IF_NE( lhs, rhs, ... ) GEOS_THROW_IF_NE_MSG( lhs, rhs, "", __VA_ARGS__ )
743 #define GEOS_THROW_IF_GT_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, MSG, __VA_ARGS__ )
753 #define GEOS_THROW_IF_GT( lhs, rhs, ... ) GEOS_THROW_IF_GT_MSG( lhs, rhs, "", __VA_ARGS__ )
764 #define GEOS_THROW_IF_GE_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, >=, <, rhs, MSG, __VA_ARGS__ )
774 #define GEOS_THROW_IF_GE( lhs, rhs, ... ) GEOS_THROW_IF_GE_MSG( lhs, rhs, "", __VA_ARGS__ )
785 #define GEOS_THROW_IF_LT_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, <, >=, rhs, MSG, __VA_ARGS__ )
795 #define GEOS_THROW_IF_LT( lhs, rhs, ... ) GEOS_THROW_IF_LT_MSG( lhs, rhs, "", __VA_ARGS__ )
806 #define GEOS_THROW_IF_LE_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, <=, >, rhs, MSG, __VA_ARGS__ )
816 #define GEOS_THROW_IF_LE( lhs, rhs, ... ) GEOS_THROW_IF_LE_MSG( lhs, rhs, "", __VA_ARGS__ )
818 #if !defined(NDEBUG) || defined(GEOS_ASSERT_ENABLED)
823 #define GEOS_ASSERT_ENABLED
837 #define GEOS_ASSERT_MSG( COND, ... ) \
838 GEOS_ERROR_IF_CAUSE( !( COND ), "Expected: " STRINGIZE( COND ), __VA_ARGS__ )
849 #define GEOS_ASSERT_OP_MSG( lhs, OP, rhs, ... ) \
851 GEOS_ERROR_LHS_RHS_DECLS( lhs, rhs ); \
852 GEOS_ERROR_IF_CAUSE( !( lhsResult OP rhsResult ), \
853 "Expected: " #lhs " " #OP " " #rhs "\n* " #lhs " = " << lhsResult << "\n* " #rhs " = " << rhsResult << "\n", \
859 #define GEOS_ASSERT_MSG( ... ) ((void) 0)
860 #define GEOS_ASSERT_OP_MSG( ... ) ((void) 0)
868 #define GEOS_ASSERT( COND ) GEOS_ASSERT_MSG( COND, "" )
878 #define GEOS_ASSERT_EQ_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, ==, rhs, __VA_ARGS__ )
885 #define GEOS_ASSERT_EQ( lhs, rhs ) GEOS_ASSERT_EQ_MSG( lhs, rhs, "" )
895 #define GEOS_ASSERT_NE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, !=, rhs, __VA_ARGS__ )
902 #define GEOS_ASSERT_NE( lhs, rhs ) GEOS_ASSERT_NE_MSG( lhs, rhs, "" )
912 #define GEOS_ASSERT_GT_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, >, rhs, __VA_ARGS__ )
919 #define GEOS_ASSERT_GT( lhs, rhs ) GEOS_ASSERT_GT_MSG( lhs, rhs, "" )
929 #define GEOS_ASSERT_GE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, >=, rhs, __VA_ARGS__ )
936 #define GEOS_ASSERT_GE( lhs, rhs ) GEOS_ASSERT_GE_MSG( lhs, rhs, "" )
946 #define GEOS_ASSERT_LT_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, <, rhs, __VA_ARGS__ )
953 #define GEOS_ASSERT_LT( lhs, rhs ) GEOS_ASSERT_LT_MSG( lhs, rhs, "" )
963 #define GEOS_ASSERT_LE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, <=, rhs, __VA_ARGS__ )
970 #define GEOS_ASSERT_LE( lhs, rhs ) GEOS_ASSERT_LE_MSG( lhs, rhs, "" )
985 extern std::ostream * g_rankStream;
989 #if defined(GEOS_USE_MPI)
995 void InitializeLogger( MPI_Comm comm,
const std::string & rank_output_dir=
"" );
void FinalizeLogger()
Finalize the logger and close the rank streams.
void InitializeLogger(const std::string &rank_output_dir="")
Initialize the logger in a serial build.
std::string string
String type.