Index: openmp/trunk/runtime/src/kmp_environment.c =================================================================== --- openmp/trunk/runtime/src/kmp_environment.c +++ openmp/trunk/runtime/src/kmp_environment.c @@ -566,11 +566,10 @@ ) { KMP_INTERNAL_FREE( (void *) block->vars ); - KMP_INTERNAL_FREE( (void *) block->bulk ); + __kmp_str_free(&(block->bulk)); block->count = 0; block->vars = NULL; - block->bulk = NULL; } // __kmp_env_blk_free Index: openmp/trunk/runtime/src/kmp_i18n.c =================================================================== --- openmp/trunk/runtime/src/kmp_i18n.c +++ openmp/trunk/runtime/src/kmp_i18n.c @@ -109,13 +109,13 @@ KMP_DEBUG_ASSERT( cat == KMP_I18N_NULLCAT ); english = - lang == NULL || // In all these cases English language is used. - strcmp( lang, "" ) == 0 || + lang == NULL || // In all these cases English language is used. + strcmp( lang, "" ) == 0 || strcmp( lang, " " ) == 0 || - // Workaround for Fortran RTL bug DPD200137873 "Fortran runtime resets LANG env var - // to space if it is not set". - strcmp( lang, "C" ) == 0 || - strcmp( lang, "POSIX" ) == 0; + // Workaround for Fortran RTL bug DPD200137873 "Fortran runtime resets LANG env var + // to space if it is not set". + strcmp( lang, "C" ) == 0 || + strcmp( lang, "POSIX" ) == 0; if ( ! english ) { // English language is not yet detected, let us continue. // Format of LANG is: [language[_territory][.codeset][@modifier]] @@ -132,8 +132,8 @@ // Do not try to open English catalog because internal messages are // exact copy of messages in English catalog. if ( english ) { - status = KMP_I18N_ABSENT; // mark catalog as absent so it will not be re-opened. - return; + status = KMP_I18N_ABSENT; // mark catalog as absent so it will not be re-opened. + return; } cat = catopen( name, 0 ); @@ -141,36 +141,41 @@ status = ( cat == KMP_I18N_NULLCAT ? KMP_I18N_ABSENT : KMP_I18N_OPENED ); if ( status == KMP_I18N_ABSENT ) { - if (__kmp_generate_warnings > kmp_warnings_low) { // AC: only issue warning in case explicitly asked to - int error = errno; // Save errno immediately. - char * nlspath = __kmp_env_get( "NLSPATH" ); - char * lang = __kmp_env_get( "LANG" ); - - // Infinite recursion will not occur -- status is KMP_I18N_ABSENT now, so - // __kmp_i18n_catgets() will not try to open catalog, but will return default message. - __kmp_msg( - kmp_ms_warning, - KMP_MSG( CantOpenMessageCatalog, name ), - KMP_ERR( error ), - KMP_HNT( CheckEnvVar, "NLSPATH", nlspath ), - KMP_HNT( CheckEnvVar, "LANG", lang ), - __kmp_msg_null - ); - KMP_INFORM( WillUseDefaultMessages ); - KMP_INTERNAL_FREE( nlspath ); - KMP_INTERNAL_FREE( lang ); - } + if (__kmp_generate_warnings > kmp_warnings_low) { // AC: only issue warning in case explicitly asked to + int error = errno; // Save errno immediately. + char * nlspath = __kmp_env_get( "NLSPATH" ); + char * lang = __kmp_env_get( "LANG" ); + + // Infinite recursion will not occur -- status is KMP_I18N_ABSENT now, so + // __kmp_i18n_catgets() will not try to open catalog, but will return default message. + kmp_msg_t err_code = KMP_ERR( error ); + __kmp_msg( + kmp_ms_warning, + KMP_MSG( CantOpenMessageCatalog, name ), + err_code, + KMP_HNT( CheckEnvVar, "NLSPATH", nlspath ), + KMP_HNT( CheckEnvVar, "LANG", lang ), + __kmp_msg_null + ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } + + KMP_INFORM( WillUseDefaultMessages ); + KMP_INTERNAL_FREE( nlspath ); + KMP_INTERNAL_FREE( lang ); + } } else { // status == KMP_I18N_OPENED int section = get_section( kmp_i18n_prp_Version ); int number = get_number( kmp_i18n_prp_Version ); char const * expected = __kmp_i18n_default_table.sect[ section ].str[ number ]; - // Expected version of the catalog. + // Expected version of the catalog. kmp_str_buf_t version; // Actual version of the catalog. __kmp_str_buf_init( & version ); __kmp_str_buf_print( & version, "%s", catgets( cat, section, number, NULL ) ); - // String returned by catgets is invalid after closing the catalog, so copy it. + // String returned by catgets is invalid after closing the catalog, so copy it. if ( strcmp( version.str, expected ) != 0 ) { __kmp_i18n_catclose(); // Close bad catalog. status = KMP_I18N_ABSENT; // And mark it as absent. @@ -317,7 +322,7 @@ table->size = 0; KMP_INTERNAL_FREE( (void *) table->sect ); table->sect = NULL; -} // kmp_i8n_table_free +} // kmp_i18n_table_free void @@ -325,7 +330,7 @@ ) { LCID locale_id = GetThreadLocale(); - WORD lang_id = LANGIDFROMLCID( locale_id ); + WORD lang_id = LANGIDFROMLCID( locale_id ); WORD primary_lang_id = PRIMARYLANGID( lang_id ); kmp_str_buf_t path; @@ -337,8 +342,8 @@ // Do not try to open English catalog because internal messages are // exact copy of messages in English catalog. if ( primary_lang_id == LANG_ENGLISH ) { - status = KMP_I18N_ABSENT; // mark catalog as absent so it will not be re-opened. - goto end; + status = KMP_I18N_ABSENT; // mark catalog as absent so it will not be re-opened. + goto end; }; // if // Construct resource DLL name. @@ -395,30 +400,35 @@ if ( status == KMP_I18N_ABSENT ) { if (__kmp_generate_warnings > kmp_warnings_low) { // AC: only issue warning in case explicitly asked to - DWORD error = GetLastError(); - // Infinite recursion will not occur -- status is KMP_I18N_ABSENT now, so - // __kmp_i18n_catgets() will not try to open catalog but will return default message. + DWORD error = GetLastError(); + // Infinite recursion will not occur -- status is KMP_I18N_ABSENT now, so + // __kmp_i18n_catgets() will not try to open catalog but will return default message. /* - If message catalog for another architecture found (e.g. OpenMP RTL - for IA-32 architecture opens libompui.dll for Intel(R) 64) - Windows* OS returns error 193 (ERROR_BAD_EXE_FORMAT). However, - FormatMessage fails to return a message for this error, so user - will see: - - OMP: Warning #2: Cannot open message catalog "1041\libompui.dll": - OMP: System error #193: (No system error message available) - OMP: Info #3: Default messages will be used. + If message catalog for another architecture found (e.g. OpenMP RTL + for IA-32 architecture opens libompui.dll for Intel(R) 64) + Windows* OS returns error 193 (ERROR_BAD_EXE_FORMAT). However, + FormatMessage fails to return a message for this error, so user + will see: + + OMP: Warning #2: Cannot open message catalog "1041\libompui.dll": + OMP: System error #193: (No system error message available) + OMP: Info #3: Default messages will be used. - Issue a hint in this case to let cause of trouble more understandable. + Issue a hint in this case to let cause of trouble more understandable. */ - __kmp_msg( - kmp_ms_warning, - KMP_MSG( CantOpenMessageCatalog, path.str ), - KMP_SYSERRCODE( error ), + __kmp_msg_t err_code = KMP_SYSERRCODE(error); + __kmp_msg( + kmp_ms_warning, + KMP_MSG( CantOpenMessageCatalog, path.str ), + err_code, ( error == ERROR_BAD_EXE_FORMAT ? KMP_HNT( BadExeFormat, path.str, KMP_ARCH_STR ) : __kmp_msg_null ), - __kmp_msg_null - ); - KMP_INFORM( WillUseDefaultMessages ); + __kmp_msg_null + ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } + + KMP_INFORM( WillUseDefaultMessages ); } } else { // status == KMP_I18N_OPENED @@ -824,7 +834,6 @@ // XSI version of strerror_r. int size = 2048; - // TODO: Add checking result of malloc(). char * buffer = (char *) KMP_INTERNAL_MALLOC( size ); int rc; if (buffer == NULL) { @@ -932,9 +941,9 @@ }; }; // switch fmsg = __kmp_msg_format( format, message.num, message.str ); - KMP_INTERNAL_FREE( (void *) message.str ); + __kmp_str_free(&message.str); __kmp_str_buf_cat( & buffer, fmsg.str, fmsg.len ); - KMP_INTERNAL_FREE( (void *) fmsg.str ); + __kmp_str_free(&fmsg.str); // Format other messages. va_start( args, message ); @@ -958,9 +967,9 @@ }; }; // switch fmsg = __kmp_msg_format( format, message.num, message.str ); - KMP_INTERNAL_FREE( (void *) message.str ); + __kmp_str_free(&message.str); __kmp_str_buf_cat( & buffer, fmsg.str, fmsg.len ); - KMP_INTERNAL_FREE( (void *) fmsg.str ); + __kmp_str_free(&fmsg.str); }; // forever va_end( args ); Index: openmp/trunk/runtime/src/kmp_itt.c =================================================================== --- openmp/trunk/runtime/src/kmp_itt.c +++ openmp/trunk/runtime/src/kmp_itt.c @@ -103,13 +103,21 @@ switch ( err ) { case __itt_error_no_module : { char const * library = va_arg( args, char const * ); - #if KMP_OS_WINDOWS - int sys_err = va_arg( args, int ); - __kmp_msg( kmp_ms_warning, KMP_MSG( IttLoadLibFailed, library ), KMP_SYSERRCODE( sys_err ), __kmp_msg_null ); - #else - char const * sys_err = va_arg( args, char const * ); - __kmp_msg( kmp_ms_warning, KMP_MSG( IttLoadLibFailed, library ), KMP_SYSERRMESG( sys_err ), __kmp_msg_null ); - #endif +#if KMP_OS_WINDOWS + int sys_err = va_arg( args, int ); + kmp_msg_t err_code = KMP_SYSERRCODE( sys_err ); + __kmp_msg( kmp_ms_warning, KMP_MSG( IttLoadLibFailed, library ), err_code, __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } +#else + char const * sys_err = va_arg( args, char const * ); + kmp_msg_t err_code = KMP_SYSERRMESG( sys_err ); + __kmp_msg( kmp_ms_warning, KMP_MSG( IttLoadLibFailed, library ), err_code, __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } +#endif } break; case __itt_error_no_symbol : { char const * library = va_arg( args, char const * ); @@ -130,12 +138,20 @@ case __itt_error_cant_read_env : { char const * var = va_arg( args, char const * ); int sys_err = va_arg( args, int ); - __kmp_msg( kmp_ms_warning, KMP_MSG( CantGetEnvVar, var ), KMP_ERR( sys_err ), __kmp_msg_null ); + kmp_msg_t err_code = KMP_ERR( sys_err ); + __kmp_msg( kmp_ms_warning, KMP_MSG( CantGetEnvVar, var ), err_code, __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } } break; case __itt_error_system : { char const * func = va_arg( args, char const * ); int sys_err = va_arg( args, int ); - __kmp_msg( kmp_ms_warning, KMP_MSG( IttFunctionError, func ), KMP_SYSERRCODE( sys_err ), __kmp_msg_null ); + kmp_msg_t err_code = KMP_SYSERRCODE( sys_err ); + __kmp_msg( kmp_ms_warning, KMP_MSG( IttFunctionError, func ), err_code, __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } } break; default : { KMP_WARNING( IttUnknownError, err ); Index: openmp/trunk/runtime/src/kmp_settings.c =================================================================== --- openmp/trunk/runtime/src/kmp_settings.c +++ openmp/trunk/runtime/src/kmp_settings.c @@ -360,7 +360,7 @@ char const * value, char const * * out ) { - KMP_INTERNAL_FREE( (void *) * out ); + __kmp_str_free(out); * out = __kmp_str_format( "%s", value ); } // __kmp_stg_parse_str #endif @@ -418,12 +418,12 @@ char buffer[256]; char *t; int hasSuffix; - KMP_INTERNAL_FREE( (void *) * out ); + __kmp_str_free(out); t = (char *) strrchr(value, '.'); hasSuffix = t && __kmp_str_eqf( t, suffix ); t = __kmp_str_format( "%s%s", value, hasSuffix ? "" : suffix ); __kmp_expand_file_name( buffer, sizeof(buffer), t); - KMP_INTERNAL_FREE(t); + __kmp_str_free(&t); * out = __kmp_str_format( "%s", buffer ); } // __kmp_stg_parse_file #endif @@ -2235,7 +2235,7 @@ #undef set_respect #undef set_granularity - KMP_INTERNAL_FREE( buffer ); + __kmp_str_free((const char **) &buffer); if ( proclist ) { if ( ! type ) { Index: openmp/trunk/runtime/src/kmp_str.c =================================================================== --- openmp/trunk/runtime/src/kmp_str.c +++ openmp/trunk/runtime/src/kmp_str.c @@ -420,8 +420,7 @@ kmp_str_loc_t * loc ) { __kmp_str_fname_free( & loc->fname ); - KMP_INTERNAL_FREE( loc->_bulk ); - loc->_bulk = NULL; + __kmp_str_free((const char **) &(loc->_bulk)); loc->file = NULL; loc->func = NULL; } // kmp_str_loc_free @@ -478,8 +477,6 @@ So standard malloc() is the only available option. */ -// TODO: Find and replace all regular free() with __kmp_str_free(). - char * __kmp_str_format( // Allocated string. char const * format, // Format string. Index: openmp/trunk/runtime/src/z_Linux_util.c =================================================================== --- openmp/trunk/runtime/src/z_Linux_util.c +++ openmp/trunk/runtime/src/z_Linux_util.c @@ -165,12 +165,16 @@ && (__kmp_affinity_type != affinity_default) && (__kmp_affinity_type != affinity_disabled))) { int error = errno; + kmp_msg_t err_code = KMP_ERR( error ); __kmp_msg( kmp_ms_warning, KMP_MSG( GetAffSysCallNotSupported, env_var ), - KMP_ERR( error ), + err_code, __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } } KMP_AFFINITY_DISABLE(); KMP_INTERNAL_FREE(buf); @@ -193,12 +197,16 @@ && (__kmp_affinity_type != affinity_default) && (__kmp_affinity_type != affinity_disabled))) { int error = errno; + kmp_msg_t err_code = KMP_ERR( error ); __kmp_msg( kmp_ms_warning, KMP_MSG( SetAffSysCallNotSupported, env_var ), - KMP_ERR( error ), + err_code, __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } } KMP_AFFINITY_DISABLE(); KMP_INTERNAL_FREE(buf); @@ -241,12 +249,16 @@ && (__kmp_affinity_type != affinity_default) && (__kmp_affinity_type != affinity_disabled))) { int error = errno; + kmp_msg_t err_code = KMP_ERR( error ); __kmp_msg( kmp_ms_warning, KMP_MSG( GetAffSysCallNotSupported, env_var ), - KMP_ERR( error ), + err_code, __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } } KMP_AFFINITY_DISABLE(); KMP_INTERNAL_FREE(buf); @@ -272,12 +284,16 @@ && (__kmp_affinity_type != affinity_default) && (__kmp_affinity_type != affinity_disabled))) { int error = errno; + kmp_msg_t err_code = KMP_ERR( error ); __kmp_msg( kmp_ms_warning, KMP_MSG( SetAffSysCallNotSupported, env_var ), - KMP_ERR( error ), + err_code, __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } } KMP_AFFINITY_DISABLE(); KMP_INTERNAL_FREE(buf); @@ -710,13 +726,17 @@ rc = sched_setscheduler( 0, sched, & param ); if ( rc != 0 ) { int error = errno; - __kmp_msg( - kmp_ms_warning, - KMP_MSG( CantChangeMonitorPriority ), - KMP_ERR( error ), - KMP_MSG( MonitorWillStarve ), - __kmp_msg_null - ); + kmp_msg_t err_code = KMP_ERR( error ); + __kmp_msg( + kmp_ms_warning, + KMP_MSG( CantChangeMonitorPriority ), + err_code, + KMP_MSG( MonitorWillStarve ), + __kmp_msg_null + ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } }; // if } else { // We cannot abort here, because number of CPUs may be enough for all the threads, @@ -959,7 +979,11 @@ #ifdef KMP_THREAD_ATTR status = pthread_attr_destroy( & thread_attr ); if ( status ) { - __kmp_msg(kmp_ms_warning, KMP_MSG( CantDestroyThreadAttrs ), KMP_ERR( status ), __kmp_msg_null); + kmp_msg_t err_code = KMP_ERR( status ); + __kmp_msg(kmp_ms_warning, KMP_MSG( CantDestroyThreadAttrs ), err_code, __kmp_msg_null); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } }; // if #endif /* KMP_THREAD_ATTR */ @@ -1055,13 +1079,17 @@ __kmp_monitor_stksize *= 2; goto retry; } + kmp_msg_t err_code = KMP_ERR( status ); __kmp_msg( kmp_ms_warning, // should this be fatal? BB KMP_MSG( CantSetMonitorStackSize, (long int) __kmp_monitor_stksize ), - KMP_ERR( status ), + err_code, KMP_HNT( ChangeMonitorStackSize ), __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } }; // if #endif /* _POSIX_THREAD_ATTR_STACKSIZE */ @@ -1117,12 +1145,16 @@ #ifdef KMP_THREAD_ATTR status = pthread_attr_destroy( & thread_attr ); if ( status != 0 ) { - __kmp_msg( // + kmp_msg_t err_code = KMP_ERR( status ); + __kmp_msg( kmp_ms_warning, KMP_MSG( CantDestroyThreadAttrs ), - KMP_ERR( status ), + err_code, __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } }; // if #endif Index: openmp/trunk/runtime/src/z_Windows_NT_util.c =================================================================== --- openmp/trunk/runtime/src/z_Windows_NT_util.c +++ openmp/trunk/runtime/src/z_Windows_NT_util.c @@ -560,12 +560,16 @@ if (__kmp_SetThreadGroupAffinity(GetCurrentThread(), &ga, NULL) == 0) { DWORD error = GetLastError(); if (__kmp_affinity_verbose) { // AC: continue silently if not verbose + kmp_msg_t err_code = KMP_ERR( error ); __kmp_msg( kmp_ms_warning, KMP_MSG( CantSetThreadAffMask ), - KMP_ERR( error ), + err_code, __kmp_msg_null ); + if (__kmp_generate_warnings == kmp_warnings_off) { + __kmp_str_free(&err_code.str); + } } } } else {