Wrap the cache in a critical section

Git's error messages were being truncated.  Turns out git used two
threads, one writing to the console and one to file.  This caused a
conflict in `IsConsoleHandle` when the cache was updated.  Making it a
critical section solves the issue.
This commit is contained in:
Jason Hood 2018-02-12 21:50:43 +10:00
parent 0366daad05
commit 392337b3b1

12
ANSI.c
View File

@ -3189,6 +3189,8 @@ BOOL IsConsoleHandle( HANDLE h )
{ {
int c; int c;
EnterCriticalSection( &CritSect );
for (c = 0; c < CACHE; ++c) for (c = 0; c < CACHE; ++c)
if (cache[c].h == h) if (cache[c].h == h)
{ {
@ -3198,7 +3200,9 @@ BOOL IsConsoleHandle( HANDLE h )
do cache[c] = cache[c-1]; while (--c > 0); do cache[c] = cache[c-1]; while (--c > 0);
cache[0] = tc; cache[0] = tc;
} }
return (cache[0].mode & ENABLE_PROCESSED_OUTPUT); c = (cache[0].mode & ENABLE_PROCESSED_OUTPUT);
LeaveCriticalSection( &CritSect );
return c;
} }
while (--c > 0) while (--c > 0)
@ -3216,7 +3220,11 @@ BOOL IsConsoleHandle( HANDLE h )
cache[0].mode = ENABLE_PROCESSED_OUTPUT; cache[0].mode = ENABLE_PROCESSED_OUTPUT;
} }
return (cache[0].mode & ENABLE_PROCESSED_OUTPUT); c = (cache[0].mode & ENABLE_PROCESSED_OUTPUT);
LeaveCriticalSection( &CritSect );
return c;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------