add recursion guard for overriding in windows
This commit is contained in:
parent
0a81d26c83
commit
095a87be2e
@ -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, ... ) {
|
||||||
|
Loading…
Reference in New Issue
Block a user