Piotr Caban : msvcrt: Make ungetc and ungetwc thread safe.

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


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

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

msvcrt: Make ungetc and ungetwc thread safe.

---

 dlls/msvcrt/file.c |   55 +++++++++++++++++++++++++++++++--------------------
 1 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index ad70bce..444a8d8 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -3768,20 +3768,25 @@ int CDECL MSVCRT_printf_s(const char *format, ...)
  */
 int CDECL MSVCRT_ungetc(int c, MSVCRT_FILE * file)
 {
-	if (c == MSVCRT_EOF)
-		return MSVCRT_EOF;
-	if(file->_bufsiz == 0) {
-		msvcrt_alloc_buffer(file);
-		file->_ptr++;
-	}
-	if(file->_ptr>file->_base) {
-		file->_ptr--;
-		*file->_ptr=c;
-		file->_cnt++;
-		MSVCRT_clearerr(file);
-		return c;
-	}
-	return MSVCRT_EOF;
+    if (c == MSVCRT_EOF)
+        return MSVCRT_EOF;
+
+    MSVCRT__lock_file(file);
+    if(file->_bufsiz == 0) {
+        msvcrt_alloc_buffer(file);
+        file->_ptr++;
+    }
+    if(file->_ptr>file->_base) {
+        file->_ptr--;
+        *file->_ptr=c;
+        file->_cnt++;
+        MSVCRT_clearerr(file);
+        MSVCRT__unlock_file(file);
+        return c;
+    }
+
+    MSVCRT__unlock_file(file);
+    return MSVCRT_EOF;
 }
 
 /*********************************************************************
@@ -3789,14 +3794,20 @@ int CDECL MSVCRT_ungetc(int c, MSVCRT_FILE * file)
  */
 MSVCRT_wint_t CDECL MSVCRT_ungetwc(MSVCRT_wint_t wc, MSVCRT_FILE * file)
 {
-	MSVCRT_wchar_t mwc = wc;
-	char * pp = (char *)&mwc;
-	int i;
-	for(i=sizeof(MSVCRT_wchar_t)-1;i>=0;i--) {
-		if(pp[i] != MSVCRT_ungetc(pp[i],file))
-			return MSVCRT_WEOF;
-	}
-	return mwc;
+    MSVCRT_wchar_t mwc = wc;
+    char * pp = (char *)&mwc;
+    int i;
+
+    MSVCRT__lock_file(file);
+    for(i=sizeof(MSVCRT_wchar_t)-1;i>=0;i--) {
+        if(pp[i] != MSVCRT_ungetc(pp[i],file)) {
+            MSVCRT__unlock_file(file);
+            return MSVCRT_WEOF;
+        }
+    }
+
+    MSVCRT__unlock_file(file);
+    return mwc;
 }
 
 /*********************************************************************




More information about the wine-cvs mailing list