add recursion guard for overriding in windows

This commit is contained in:
daan 2019-07-23 17:57:27 -07:00
parent 0a81d26c83
commit 095a87be2e

View File

@ -111,25 +111,34 @@ void mi_option_enable_default(mi_option_t option, bool enable) {
#define MAX_ERROR_COUNT (10) #define MAX_ERROR_COUNT (10)
static uintptr_t error_count = 0; // when MAX_ERROR_COUNT stop emitting errors and warnings static uintptr_t error_count = 0; // when MAX_ERROR_COUNT stop emitting errors and warnings
// When overriding malloc, we may recurse into mi_vfprintf if an allocation
// inside the C runtime causes another message.
static mi_decl_thread bool recurse = false;
// Define our own limited `fprintf` that avoids memory allocation. // Define our own limited `fprintf` that avoids memory allocation.
// We do this using `snprintf` with a limited buffer. // We do this using `snprintf` with a limited buffer.
static void mi_vfprintf( FILE* out, const char* prefix, const char* fmt, va_list args ) { static void mi_vfprintf( FILE* out, const char* prefix, const char* fmt, va_list args ) {
char buf[256]; char buf[256];
if (fmt==NULL) return; if (fmt==NULL) return;
if (_mi_preloading() || recurse) return;
recurse = true;
if (out==NULL) out = stdout; if (out==NULL) out = stdout;
if (_mi_preloading()) return;
vsnprintf(buf,sizeof(buf)-1,fmt,args); vsnprintf(buf,sizeof(buf)-1,fmt,args);
#ifdef _WIN32 #ifdef _WIN32
// on windows with redirection, the C runtime uses us and we cannot call `fputs` // on windows with redirection, the C runtime cannot handle locale dependent output
// while called from the C runtime itself, so use a non-locking option // after the main thread closes so use direct console output.
if (out==stderr) { if (out==stderr) {
if (prefix != NULL) _cputs(prefix); if (prefix != NULL) _cputs(prefix);
_cputs(buf); _cputs(buf);
return;
} }
else
#endif #endif
if (prefix != NULL) fputs(prefix,out); {
fputs(buf,out); if (prefix != NULL) fputs(prefix,out);
fputs(buf,out);
}
recurse = false;
return;
} }
void _mi_fprintf( FILE* out, const char* fmt, ... ) { void _mi_fprintf( FILE* out, const char* fmt, ... ) {