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