msvcrt: Make _filbuf thread safe.

This commit is contained in:
Piotr Caban 2011-05-20 13:21:50 +02:00 committed by Alexandre Julliard
parent 1b26496270
commit f773ad8388
1 changed files with 37 additions and 26 deletions

View File

@ -2605,36 +2605,47 @@ int CDECL MSVCRT_ferror(MSVCRT_FILE* file)
*/ */
int CDECL MSVCRT__filbuf(MSVCRT_FILE* file) int CDECL MSVCRT__filbuf(MSVCRT_FILE* file)
{ {
/* Allocate buffer if needed */ unsigned char c;
if(file->_bufsiz == 0 && !(file->_flag & MSVCRT__IONBF) ) { MSVCRT__lock_file(file);
msvcrt_alloc_buffer(file);
} /* Allocate buffer if needed */
if(!(file->_flag & MSVCRT__IOREAD)) { if(file->_bufsiz == 0 && !(file->_flag & MSVCRT__IONBF))
if(file->_flag & MSVCRT__IORW) { msvcrt_alloc_buffer(file);
file->_flag |= MSVCRT__IOREAD;
} else { if(!(file->_flag & MSVCRT__IOREAD)) {
return MSVCRT_EOF; if(file->_flag & MSVCRT__IORW)
} file->_flag |= MSVCRT__IOREAD;
} else {
if(file->_flag & MSVCRT__IONBF) { MSVCRT__unlock_file(file);
unsigned char c;
int r;
if ((r = read_i(file->_file,&c,1)) != 1) {
file->_flag |= (r == 0) ? MSVCRT__IOEOF : MSVCRT__IOERR;
return MSVCRT_EOF; return MSVCRT_EOF;
} }
return c; }
} else {
file->_cnt = read_i(file->_file, file->_base, file->_bufsiz); if(file->_flag & MSVCRT__IONBF) {
if(file->_cnt<=0) { int r;
if ((r = read_i(file->_file,&c,1)) != 1) {
file->_flag |= (r == 0) ? MSVCRT__IOEOF : MSVCRT__IOERR;
MSVCRT__unlock_file(file);
return MSVCRT_EOF;
}
MSVCRT__unlock_file(file);
return c;
} else {
file->_cnt = read_i(file->_file, file->_base, file->_bufsiz);
if(file->_cnt<=0) {
file->_flag |= (file->_cnt == 0) ? MSVCRT__IOEOF : MSVCRT__IOERR; file->_flag |= (file->_cnt == 0) ? MSVCRT__IOEOF : MSVCRT__IOERR;
file->_cnt = 0; file->_cnt = 0;
MSVCRT__unlock_file(file);
return MSVCRT_EOF; return MSVCRT_EOF;
} }
file->_cnt--;
file->_ptr = file->_base+1; file->_cnt--;
return *(unsigned char *)file->_base; file->_ptr = file->_base+1;
} c = *(unsigned char *)file->_base;
MSVCRT__unlock_file(file);
return c;
}
} }
/********************************************************************* /*********************************************************************