Piotr Caban : msvcrt: Make _filbuf thread safe.
Alexandre Julliard
julliard at winehq.org
Fri May 20 12:44:33 CDT 2011
Module: wine
Branch: master
Commit: f773ad838817fcc2da42c4c86e30958e7ed02053
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f773ad838817fcc2da42c4c86e30958e7ed02053
Author: Piotr Caban <piotr at codeweavers.com>
Date: Fri May 20 13:21:50 2011 +0200
msvcrt: Make _filbuf thread safe.
---
dlls/msvcrt/file.c | 59 ++++++++++++++++++++++++++++++---------------------
1 files changed, 35 insertions(+), 24 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index c8d488c..baaabf0 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -2605,36 +2605,47 @@ int CDECL MSVCRT_ferror(MSVCRT_FILE* file)
*/
int CDECL MSVCRT__filbuf(MSVCRT_FILE* file)
{
- /* Allocate buffer if needed */
- if(file->_bufsiz == 0 && !(file->_flag & MSVCRT__IONBF) ) {
- msvcrt_alloc_buffer(file);
- }
- if(!(file->_flag & MSVCRT__IOREAD)) {
- if(file->_flag & MSVCRT__IORW) {
- file->_flag |= MSVCRT__IOREAD;
- } else {
- return MSVCRT_EOF;
- }
- }
- if(file->_flag & MSVCRT__IONBF) {
- unsigned char c;
+ unsigned char c;
+ MSVCRT__lock_file(file);
+
+ /* Allocate buffer if needed */
+ if(file->_bufsiz == 0 && !(file->_flag & MSVCRT__IONBF))
+ msvcrt_alloc_buffer(file);
+
+ if(!(file->_flag & MSVCRT__IOREAD)) {
+ if(file->_flag & MSVCRT__IORW)
+ file->_flag |= MSVCRT__IOREAD;
+ else {
+ MSVCRT__unlock_file(file);
+ return MSVCRT_EOF;
+ }
+ }
+
+ if(file->_flag & MSVCRT__IONBF) {
int r;
- if ((r = read_i(file->_file,&c,1)) != 1) {
+ if ((r = read_i(file->_file,&c,1)) != 1) {
file->_flag |= (r == 0) ? MSVCRT__IOEOF : MSVCRT__IOERR;
+ MSVCRT__unlock_file(file);
return MSVCRT_EOF;
- }
- return c;
- } else {
- file->_cnt = read_i(file->_file, file->_base, file->_bufsiz);
- if(file->_cnt<=0) {
+ }
+
+ 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->_cnt = 0;
+ MSVCRT__unlock_file(file);
return MSVCRT_EOF;
- }
- file->_cnt--;
- file->_ptr = file->_base+1;
- return *(unsigned char *)file->_base;
- }
+ }
+
+ file->_cnt--;
+ file->_ptr = file->_base+1;
+ c = *(unsigned char *)file->_base;
+ MSVCRT__unlock_file(file);
+ return c;
+ }
}
/*********************************************************************
More information about the wine-cvs
mailing list