msvcrt: Make _flsbuf thread safe.

This commit is contained in:
Piotr Caban 2011-05-20 13:22:00 +02:00 committed by Alexandre Julliard
parent f773ad8388
commit c989c4980b
1 changed files with 28 additions and 18 deletions

View File

@ -3025,30 +3025,40 @@ int CDECL MSVCRT_fputc(int c, MSVCRT_FILE* file)
*/ */
int CDECL MSVCRT__flsbuf(int c, MSVCRT_FILE* file) int CDECL MSVCRT__flsbuf(int c, MSVCRT_FILE* file)
{ {
/* Flush output buffer */ MSVCRT__lock_file(file);
if(file->_bufsiz == 0 && !(file->_flag & MSVCRT__IONBF)) {
msvcrt_alloc_buffer(file); /* Flush output buffer */
} if(file->_bufsiz == 0 && !(file->_flag & MSVCRT__IONBF)) {
if(!(file->_flag & MSVCRT__IOWRT)) { msvcrt_alloc_buffer(file);
if(file->_flag & MSVCRT__IORW) { }
file->_flag |= MSVCRT__IOWRT; if(!(file->_flag & MSVCRT__IOWRT)) {
} else { if(file->_flag & MSVCRT__IORW) {
return MSVCRT_EOF; file->_flag |= MSVCRT__IOWRT;
} } else {
} MSVCRT__unlock_file(file);
if(file->_bufsiz) { return MSVCRT_EOF;
}
}
if(file->_bufsiz) {
int res=msvcrt_flush_buffer(file); int res=msvcrt_flush_buffer(file);
return res?res : MSVCRT_fputc(c, file); if(!res)
} else { res = MSVCRT_fputc(c, file);
unsigned char cc=c; MSVCRT__unlock_file(file);
return res;
} else {
unsigned char cc=c;
int len; int len;
/* set _cnt to 0 for unbuffered FILEs */ /* set _cnt to 0 for unbuffered FILEs */
file->_cnt = 0; file->_cnt = 0;
len = MSVCRT__write(file->_file, &cc, 1); len = MSVCRT__write(file->_file, &cc, 1);
if (len == 1) return c & 0xff; if (len == 1) {
MSVCRT__unlock_file(file);
return c & 0xff;
}
file->_flag |= MSVCRT__IOERR; file->_flag |= MSVCRT__IOERR;
MSVCRT__unlock_file(file);
return MSVCRT_EOF; return MSVCRT_EOF;
} }
} }
/********************************************************************* /*********************************************************************