Piotr Caban : msvcrt: Make _flsbuf thread safe.

Alexandre Julliard julliard at winehq.org
Fri May 20 12:44:33 CDT 2011


Module: wine
Branch: master
Commit: c989c4980bf25d9cf87e6c2fa42fb264b56fcd38
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c989c4980bf25d9cf87e6c2fa42fb264b56fcd38

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri May 20 13:22:00 2011 +0200

msvcrt: Make _flsbuf thread safe.

---

 dlls/msvcrt/file.c |   46 ++++++++++++++++++++++++++++------------------
 1 files changed, 28 insertions(+), 18 deletions(-)

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




More information about the wine-cvs mailing list