20 #include <sys/types.h> 32 #pragma warning(disable : 271 310) 42 kmp_bootstrap_lock_t __kmp_stdio_lock = KMP_BOOTSTRAP_LOCK_INITIALIZER(
44 kmp_bootstrap_lock_t __kmp_console_lock = KMP_BOOTSTRAP_LOCK_INITIALIZER(
49 static HANDLE __kmp_stdout = NULL;
50 static HANDLE __kmp_stderr = NULL;
51 static int __kmp_console_exists = FALSE;
52 static kmp_str_buf_t __kmp_console_buf;
54 static int is_console(
void) {
62 rc = GetConsoleTitle(buffer,
sizeof(buffer));
69 return rc > 0 || err == 0;
72 void __kmp_close_console(
void) {
75 if (__kmp_console_exists) {
78 __kmp_str_buf_free(&__kmp_console_buf);
79 __kmp_console_exists = FALSE;
85 static void __kmp_redirect_output(
void) {
86 __kmp_acquire_bootstrap_lock(&__kmp_console_lock);
88 if (!__kmp_console_exists) {
92 __kmp_str_buf_init(&__kmp_console_buf);
100 ho = GetStdHandle(STD_OUTPUT_HANDLE);
101 if (ho == INVALID_HANDLE_VALUE || ho == NULL) {
103 DWORD err = GetLastError();
111 he = GetStdHandle(STD_ERROR_HANDLE);
112 if (he == INVALID_HANDLE_VALUE || he == NULL) {
114 DWORD err = GetLastError();
122 __kmp_console_exists = TRUE;
124 __kmp_release_bootstrap_lock(&__kmp_console_lock);
128 #define __kmp_stderr (stderr) 129 #define __kmp_stdout (stdout) 132 void __kmp_vprintf(
enum kmp_io out_stream,
char const *format, va_list ap) {
134 if (!__kmp_console_exists) {
135 __kmp_redirect_output();
137 if (!__kmp_stderr && out_stream == kmp_err) {
140 if (!__kmp_stdout && out_stream == kmp_out) {
144 auto stream = ((out_stream == kmp_out) ? __kmp_stdout : __kmp_stderr);
146 if (__kmp_debug_buf && __kmp_debug_buffer != NULL) {
148 int dc = __kmp_debug_count++ % __kmp_debug_buf_lines;
149 char *db = &__kmp_debug_buffer[dc * __kmp_debug_buf_chars];
152 #ifdef KMP_DEBUG_PIDS 153 chars = KMP_SNPRINTF(db, __kmp_debug_buf_chars,
"pid=%d: ",
154 (kmp_int32)getpid());
156 chars += KMP_VSNPRINTF(db, __kmp_debug_buf_chars, format, ap);
158 if (chars + 1 > __kmp_debug_buf_chars) {
159 if (chars + 1 > __kmp_debug_buf_warn_chars) {
162 __kmp_str_buf_print(&__kmp_console_buf,
"OMP warning: Debugging buffer " 163 "overflow; increase " 164 "KMP_DEBUG_BUF_CHARS to %d\n",
166 WriteFile(stream, __kmp_console_buf.str, __kmp_console_buf.used, &count,
168 __kmp_str_buf_clear(&__kmp_console_buf);
170 fprintf(stream,
"OMP warning: Debugging buffer overflow; " 171 "increase KMP_DEBUG_BUF_CHARS to %d\n",
175 __kmp_debug_buf_warn_chars = chars + 1;
178 db[__kmp_debug_buf_chars - 2] =
'\n';
179 db[__kmp_debug_buf_chars - 1] =
'\0';
184 #ifdef KMP_DEBUG_PIDS 185 __kmp_str_buf_print(&__kmp_console_buf,
"pid=%d: ", (kmp_int32)getpid());
187 __kmp_str_buf_vprint(&__kmp_console_buf, format, ap);
188 WriteFile(stream, __kmp_console_buf.str, __kmp_console_buf.used, &count,
190 __kmp_str_buf_clear(&__kmp_console_buf);
192 #ifdef KMP_DEBUG_PIDS 193 fprintf(stream,
"pid=%d: ", (kmp_int32)getpid());
195 vfprintf(stream, format, ap);
201 void __kmp_printf(
char const *format, ...) {
203 va_start(ap, format);
205 __kmp_acquire_bootstrap_lock(&__kmp_stdio_lock);
206 __kmp_vprintf(kmp_err, format, ap);
207 __kmp_release_bootstrap_lock(&__kmp_stdio_lock);
212 void __kmp_printf_no_lock(
char const *format, ...) {
214 va_start(ap, format);
216 __kmp_vprintf(kmp_err, format, ap);
221 void __kmp_fprintf(
enum kmp_io stream,
char const *format, ...) {
223 va_start(ap, format);
225 __kmp_acquire_bootstrap_lock(&__kmp_stdio_lock);
226 __kmp_vprintf(stream, format, ap);
227 __kmp_release_bootstrap_lock(&__kmp_stdio_lock);