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