kmp_io.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #include <stdio.h>
00048 #include <stdlib.h>
00049 #include <stddef.h>
00050 #include <stdarg.h>
00051 #include <string.h>
00052 #ifndef __ABSOFT_WIN
00053 # include <sys/types.h>
00054 #endif
00055
00056 #include "kmp_os.h"
00057 #include "kmp_lock.h"
00058 #include "kmp_str.h"
00059 #include "kmp_io.h"
00060 #include "kmp.h"
00061
00062 #if KMP_OS_WINDOWS
00063 # pragma warning( push )
00064 # pragma warning( disable: 271 310 )
00065 # include <windows.h>
00066 # pragma warning( pop )
00067 #endif
00068
00069
00070
00071
00072 kmp_bootstrap_lock_t __kmp_stdio_lock = KMP_BOOTSTRAP_LOCK_INITIALIZER( __kmp_stdio_lock );
00073 kmp_bootstrap_lock_t __kmp_console_lock = KMP_BOOTSTRAP_LOCK_INITIALIZER( __kmp_console_lock );
00074
00075 #if KMP_OS_WINDOWS
00076
00077 # ifdef KMP_DEBUG
00078
00079 static HANDLE __kmp_stdout = NULL;
00080 # endif
00081 static HANDLE __kmp_stderr = NULL;
00082 static int __kmp_console_exists = FALSE;
00083 static kmp_str_buf_t __kmp_console_buf;
00084
00085 static int
00086 is_console( void )
00087 {
00088 char buffer[ 128 ];
00089 DWORD rc = 0;
00090 DWORD err = 0;
00091
00092 SetLastError( 0 );
00093
00094
00095 rc = GetConsoleTitle( buffer, sizeof( buffer ) );
00096 if ( rc == 0 ) {
00097
00098 err = GetLastError();
00099
00100
00101 };
00102 return rc > 0 || err == 0;
00103 }
00104
00105 void
00106 __kmp_close_console( void )
00107 {
00108
00109
00110 if( __kmp_console_exists ) {
00111 #ifdef KMP_DEBUG
00112
00113 __kmp_stdout = NULL;
00114 #endif
00115 __kmp_stderr = NULL;
00116 __kmp_str_buf_free( &__kmp_console_buf );
00117 __kmp_console_exists = FALSE;
00118 }
00119 }
00120
00121
00122
00123 static void
00124 __kmp_redirect_output( void )
00125 {
00126 __kmp_acquire_bootstrap_lock( &__kmp_console_lock );
00127
00128 if( ! __kmp_console_exists ) {
00129 #ifdef KMP_DEBUG
00130
00131 HANDLE ho;
00132 #endif
00133 HANDLE he;
00134
00135 __kmp_str_buf_init( &__kmp_console_buf );
00136
00137 AllocConsole();
00138
00139
00140
00141
00142
00143 #ifdef KMP_DEBUG
00144 ho = GetStdHandle( STD_OUTPUT_HANDLE );
00145 if ( ho == INVALID_HANDLE_VALUE || ho == NULL ) {
00146
00147 DWORD err = GetLastError();
00148
00149 __kmp_stdout = NULL;
00150
00151 } else {
00152
00153 __kmp_stdout = ho;
00154
00155 }
00156 #endif
00157 he = GetStdHandle( STD_ERROR_HANDLE );
00158 if ( he == INVALID_HANDLE_VALUE || he == NULL ) {
00159
00160 DWORD err = GetLastError();
00161
00162 __kmp_stderr = NULL;
00163
00164 } else {
00165
00166 __kmp_stderr = he;
00167 }
00168 __kmp_console_exists = TRUE;
00169 }
00170 __kmp_release_bootstrap_lock( &__kmp_console_lock );
00171 }
00172
00173 #else
00174 #define __kmp_stderr (stderr)
00175 #endif
00176
00177 void
00178 __kmp_vprintf( enum kmp_io __kmp_io, char const * format, va_list ap )
00179 {
00180 #if KMP_OS_WINDOWS
00181 if( !__kmp_console_exists ) {
00182 __kmp_redirect_output();
00183 }
00184 if( ! __kmp_stderr && __kmp_io == kmp_err ) {
00185 return;
00186 }
00187 #ifdef KMP_DEBUG
00188 if( ! __kmp_stdout && __kmp_io == kmp_out ) {
00189 return;
00190 }
00191 #endif
00192 #endif
00193
00194 if ( __kmp_debug_buf && __kmp_debug_buffer != NULL ) {
00195
00196 int dc = ( __kmp_debug_buf_atomic ?
00197 KMP_TEST_THEN_INC32( & __kmp_debug_count) : __kmp_debug_count++ )
00198 % __kmp_debug_buf_lines;
00199 char *db = & __kmp_debug_buffer[ dc * __kmp_debug_buf_chars ];
00200 int chars = 0;
00201
00202 #ifdef KMP_DEBUG_PIDS
00203 chars = sprintf( db, "pid=%d: ", getpid() );
00204 #endif
00205 chars += vsprintf( db, format, ap );
00206
00207 if ( chars + 1 > __kmp_debug_buf_chars ) {
00208 if ( chars + 1 > __kmp_debug_buf_warn_chars ) {
00209 #if KMP_OS_WINDOWS
00210 DWORD count;
00211 __kmp_str_buf_print( &__kmp_console_buf,
00212 "OMP warning: Debugging buffer overflow; increase KMP_DEBUG_BUF_CHARS to %d\n",
00213 chars + 1 );
00214 WriteFile( __kmp_stderr, __kmp_console_buf.str, __kmp_console_buf.used, &count, NULL );
00215 __kmp_str_buf_clear( &__kmp_console_buf );
00216 #else
00217 fprintf( __kmp_stderr,
00218 "OMP warning: Debugging buffer overflow; increase KMP_DEBUG_BUF_CHARS to %d\n",
00219 chars + 1 );
00220 fflush( __kmp_stderr );
00221 #endif
00222 __kmp_debug_buf_warn_chars = chars + 1;
00223 }
00224
00225 db[ __kmp_debug_buf_chars - 2 ] = '\n';
00226 db[ __kmp_debug_buf_chars - 1 ] = '\0';
00227 }
00228 } else {
00229 #if KMP_OS_WINDOWS
00230 DWORD count;
00231 #ifdef KMP_DEBUG_PIDS
00232 __kmp_str_buf_print( &__kmp_console_buf, "pid=%d: ", getpid() );
00233 #endif
00234 __kmp_str_buf_vprint( &__kmp_console_buf, format, ap );
00235 WriteFile(
00236 __kmp_stderr,
00237 __kmp_console_buf.str,
00238 __kmp_console_buf.used,
00239 &count,
00240 NULL
00241 );
00242 __kmp_str_buf_clear( &__kmp_console_buf );
00243 #else
00244 #ifdef KMP_DEBUG_PIDS
00245 fprintf( __kmp_stderr, "pid=%d: ", getpid() );
00246 #endif
00247 vfprintf( __kmp_stderr, format, ap );
00248 fflush( __kmp_stderr );
00249 #endif
00250 }
00251 }
00252
00253 void
00254 __kmp_printf( char const * format, ... )
00255 {
00256 va_list ap;
00257 va_start( ap, format );
00258
00259 __kmp_acquire_bootstrap_lock( & __kmp_stdio_lock );
00260 __kmp_vprintf( kmp_err, format, ap );
00261 __kmp_release_bootstrap_lock( & __kmp_stdio_lock );
00262
00263 va_end( ap );
00264 }
00265
00266 void
00267 __kmp_printf_no_lock( char const * format, ... )
00268 {
00269 va_list ap;
00270 va_start( ap, format );
00271
00272 __kmp_vprintf( kmp_err, format, ap );
00273
00274 va_end( ap );
00275 }
00276
00277
00278