// NOTE: Function returns allocated memory, caller must free it! static char const * __kmp_pragma( int ct, ident_t const * ident ) { char const * cons = NULL; // Construct name. char * file = NULL; // File name. char * func = NULL; // Function (routine) name. char * line = NULL; // Line number. kmp_str_buf_t buffer; kmp_msg_t prgm; __kmp_str_buf_init( & buffer ); if ( 0 < ct && ct < cons_text_c_num ) { cons = cons_text_c[ ct ]; } else { KMP_DEBUG_ASSERT( 0 ); }; if ( ident != NULL && ident->psource != NULL ) { char * tail = NULL; __kmp_str_buf_print( & buffer, "%s", ident->psource ); // Copy source to buffer. // Split string in buffer to file, func, and line. tail = buffer.str; __kmp_str_split( tail, ';', NULL, & tail ); __kmp_str_split( tail, ';', & file, & tail ); __kmp_str_split( tail, ';', & func, & tail ); __kmp_str_split( tail, ';', & line, & tail ); }; // if prgm = __kmp_msg_format( kmp_i18n_fmt_Pragma, cons, file, func, line ); __kmp_str_buf_free( & buffer ); return prgm.str; } // __kmp_pragma
void __kmp_error_construct( kmp_i18n_id_t id, // Message identifier. enum cons_type ct, // Construct type. ident_t const * ident // Construct ident. ) { char const * construct = __kmp_pragma( ct, ident ); __kmp_msg( kmp_ms_fatal, __kmp_msg_format( id, construct ), __kmp_msg_null ); KMP_INTERNAL_FREE( (void *) construct ); }
void __kmp_error_construct2( kmp_i18n_id_t id, // Message identifier. enum cons_type ct, // First construct type. ident_t const * ident, // First construct ident. struct cons_data const * cons // Second construct. ) { char const * construct1 = __kmp_pragma( ct, ident ); char const * construct2 = __kmp_pragma( cons->type, cons->ident ); __kmp_msg( kmp_ms_fatal, __kmp_msg_format( id, construct1, construct2 ), __kmp_msg_null ); KMP_INTERNAL_FREE( (void *) construct1 ); KMP_INTERNAL_FREE( (void *) construct2 ); }
void __kmp_msg( kmp_msg_severity_t severity, kmp_msg_t message, ... ) { va_list args; kmp_i18n_id_t format; // format identifier kmp_msg_t fmsg; // formatted message kmp_str_buf_t buffer; if ( severity != kmp_ms_fatal && __kmp_generate_warnings == kmp_warnings_off ) return; // no reason to form a string in order to not print it __kmp_str_buf_init( & buffer ); // Format the primary message. switch ( severity ) { case kmp_ms_inform : { format = kmp_i18n_fmt_Info; } break; case kmp_ms_warning : { format = kmp_i18n_fmt_Warning; } break; case kmp_ms_fatal : { format = kmp_i18n_fmt_Fatal; } break; default : { KMP_DEBUG_ASSERT( 0 ); }; }; // switch fmsg = __kmp_msg_format( format, message.num, message.str ); KMP_INTERNAL_FREE( (void *) message.str ); __kmp_str_buf_cat( & buffer, fmsg.str, fmsg.len ); KMP_INTERNAL_FREE( (void *) fmsg.str ); // Format other messages. va_start( args, message ); for ( ; ; ) { message = va_arg( args, kmp_msg_t ); if ( message.type == kmp_mt_dummy && message.str == NULL ) { break; }; // if if ( message.type == kmp_mt_dummy && message.str == __kmp_msg_empty.str ) { continue; }; // if switch ( message.type ) { case kmp_mt_hint : { format = kmp_i18n_fmt_Hint; } break; case kmp_mt_syserr : { format = kmp_i18n_fmt_SysErr; } break; default : { KMP_DEBUG_ASSERT( 0 ); }; }; // switch fmsg = __kmp_msg_format( format, message.num, message.str ); KMP_INTERNAL_FREE( (void *) message.str ); __kmp_str_buf_cat( & buffer, fmsg.str, fmsg.len ); KMP_INTERNAL_FREE( (void *) fmsg.str ); }; // forever va_end( args ); // Print formatted messages. // This lock prevents multiple fatal errors on the same problem. // __kmp_acquire_bootstrap_lock( & lock ); // GEH - This lock causing tests to hang on OS X*. __kmp_printf( "%s", buffer.str ); __kmp_str_buf_free( & buffer ); if ( severity == kmp_ms_fatal ) { #if KMP_OS_WINDOWS __kmp_thread_sleep( 500 ); /* Delay to give message a chance to appear before reaping */ #endif __kmp_abort_process(); }; // if // __kmp_release_bootstrap_lock( & lock ); // GEH - this lock causing tests to hang on OS X*. } // __kmp_msg