void __kmp_i18n_catopen( ) { if ( status == KMP_I18N_CLOSED ) { __kmp_acquire_bootstrap_lock( & lock ); if ( status == KMP_I18N_CLOSED ) { __kmp_i18n_do_catopen(); }; // if __kmp_release_bootstrap_lock( & lock ); }; // if } // func __kmp_i18n_catopen
int __kmp_debug_assert( char const * msg, char const * file, int line ) { if ( file == NULL ) { file = KMP_I18N_STR( UnknownFile ); } else { // Remove directories from path, leave only file name. File name is enough, there is no need // in bothering developers and customers with full paths. char const * slash = strrchr( file, '/' ); if ( slash != NULL ) { file = slash + 1; }; // if }; // if #ifdef KMP_DEBUG __kmp_acquire_bootstrap_lock( & __kmp_stdio_lock ); __kmp_debug_printf( "Assertion failure at %s(%d): %s.\n", file, line, msg ); __kmp_release_bootstrap_lock( & __kmp_stdio_lock ); #ifdef USE_ASSERT_BREAK #if KMP_OS_WINDOWS DebugBreak(); #endif #endif // USE_ASSERT_BREAK #ifdef USE_ASSERT_STALL /* __kmp_infinite_loop(); */ for(;;); #endif // USE_ASSERT_STALL #ifdef USE_ASSERT_SEG { int volatile * ZERO = (int*) 0; ++ (*ZERO); } #endif // USE_ASSERT_SEG #endif __kmp_msg( kmp_ms_fatal, KMP_MSG( AssertionFailure, file, line ), KMP_HNT( SubmitBugReport ), __kmp_msg_null ); return 0; } // __kmp_debug_assert
/* Dump debugging buffer to stderr */ void __kmp_dump_debug_buffer( void ) { if ( __kmp_debug_buffer != NULL ) { int i; int dc = __kmp_debug_count; char *db = & __kmp_debug_buffer[ (dc % __kmp_debug_buf_lines) * __kmp_debug_buf_chars ]; char *db_end = & __kmp_debug_buffer[ __kmp_debug_buf_lines * __kmp_debug_buf_chars ]; char *db2; __kmp_acquire_bootstrap_lock( & __kmp_stdio_lock ); __kmp_printf_no_lock( "\nStart dump of debugging buffer (entry=%d):\n", dc % __kmp_debug_buf_lines ); for ( i = 0; i < __kmp_debug_buf_lines; i++ ) { if ( *db != '\0' ) { /* Fix up where no carriage return before string termination char */ for ( db2 = db + 1; db2 < db + __kmp_debug_buf_chars - 1; db2 ++) { if ( *db2 == '\0' ) { if ( *(db2-1) != '\n' ) { *db2 = '\n'; *(db2+1) = '\0'; } break; } } /* Handle case at end by shortening the printed message by one char if necessary */ if ( db2 == db + __kmp_debug_buf_chars - 1 && *db2 == '\0' && *(db2-1) != '\n' ) { *(db2-1) = '\n'; } __kmp_printf_no_lock( "%4d: %.*s", i, __kmp_debug_buf_chars, db ); *db = '\0'; /* only let it print once! */ } db += __kmp_debug_buf_chars; if ( db >= db_end ) db = __kmp_debug_buffer; } __kmp_printf_no_lock( "End dump of debugging buffer (entry=%d).\n\n", ( dc+i-1 ) % __kmp_debug_buf_lines ); __kmp_release_bootstrap_lock( & __kmp_stdio_lock ); } }
/*! @ingroup THREADPRIVATE @param loc source location information @param global_tid global thread number @param data pointer to data to privatize @param size size of data to privatize @param cache pointer to cache @return pointer to private storage Allocate private storage for threadprivate data. */ void * __kmpc_threadprivate_cached( ident_t * loc, kmp_int32 global_tid, // gtid. void * data, // Pointer to original global variable. size_t size, // Size of original global variable. void *** cache ) { KC_TRACE( 10, ("__kmpc_threadprivate_cached: T#%d called with cache: %p, address: %p, size: %" KMP_SIZE_T_SPEC "\n", global_tid, *cache, data, size ) ); if ( TCR_PTR(*cache) == 0) { __kmp_acquire_lock( & __kmp_global_lock, global_tid ); if ( TCR_PTR(*cache) == 0) { __kmp_acquire_bootstrap_lock(&__kmp_tp_cached_lock); __kmp_tp_cached = 1; __kmp_release_bootstrap_lock(&__kmp_tp_cached_lock); void ** my_cache; KMP_ITT_IGNORE( my_cache = (void**) __kmp_allocate(sizeof( void * ) * __kmp_tp_capacity + sizeof ( kmp_cached_addr_t )); );