Piotr Caban : msvcrt: Make FILE reading functions thread safe.
Alexandre Julliard
julliard at winehq.org
Fri May 20 12:44:33 CDT 2011
Module: wine
Branch: master
Commit: 11c6c5324f47c4cd7adc65748a0740032f093562
URL: http://source.winehq.org/git/wine.git/?a=commit;h=11c6c5324f47c4cd7adc65748a0740032f093562
Author: Piotr Caban <piotr at codeweavers.com>
Date: Fri May 20 13:22:48 2011 +0200
msvcrt: Make FILE reading functions thread safe.
---
dlls/msvcrt/file.c | 40 +++++++++++++++++++++++++++++++++++++---
1 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index f11c23d..27b9ef5 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -2686,12 +2686,16 @@ int CDECL MSVCRT_fgetc(MSVCRT_FILE* file)
{
unsigned char *i;
unsigned int j;
+
+ MSVCRT__lock_file(file);
if (file->_cnt>0) {
file->_cnt--;
i = (unsigned char *)file->_ptr++;
j = *i;
} else
j = MSVCRT__filbuf(file);
+
+ MSVCRT__unlock_file(file);
return j;
}
@@ -2714,6 +2718,8 @@ char * CDECL MSVCRT_fgets(char *s, int size, MSVCRT_FILE* file)
TRACE(":file(%p) fd (%d) str (%p) len (%d)\n",
file,file->_file,s,size);
+ MSVCRT__lock_file(file);
+
while ((size >1) && (cc = MSVCRT_fgetc(file)) != MSVCRT_EOF && cc != '\n')
{
*s++ = (char)cc;
@@ -2722,12 +2728,14 @@ char * CDECL MSVCRT_fgets(char *s, int size, MSVCRT_FILE* file)
if ((cc == MSVCRT_EOF) && (s == buf_start)) /* If nothing read, return 0*/
{
TRACE(":nothing read\n");
+ MSVCRT__unlock_file(file);
return NULL;
}
if ((cc != MSVCRT_EOF) && (size > 1))
*s++ = cc;
*s = '\0';
TRACE(":got %s\n", debugstr_a(buf_start));
+ MSVCRT__unlock_file(file);
return buf_start;
}
@@ -2741,6 +2749,7 @@ MSVCRT_wint_t CDECL MSVCRT_fgetwc(MSVCRT_FILE* file)
{
int c;
+ MSVCRT__lock_file(file);
if (!(msvcrt_get_ioinfo(file->_file)->wxflag & WX_TEXT))
{
MSVCRT_wchar_t wc;
@@ -2763,11 +2772,15 @@ MSVCRT_wint_t CDECL MSVCRT_fgetwc(MSVCRT_FILE* file)
{
file->_flag |= (file->_cnt == 0) ? MSVCRT__IOEOF : MSVCRT__IOERR;
file->_cnt = 0;
+
+ MSVCRT__unlock_file(file);
return MSVCRT_WEOF;
}
wcp[i] = j;
}
}
+
+ MSVCRT__unlock_file(file);
return wc;
}
@@ -2776,6 +2789,8 @@ MSVCRT_wint_t CDECL MSVCRT_fgetwc(MSVCRT_FILE* file)
{
FIXME("Treat Multibyte characters\n");
}
+
+ MSVCRT__unlock_file(file);
if (c == MSVCRT_EOF)
return MSVCRT_WEOF;
else
@@ -2791,14 +2806,19 @@ int CDECL MSVCRT__getw(MSVCRT_FILE* file)
int i, k;
unsigned int j;
ch = (char *)&i;
+
+ MSVCRT__lock_file(file);
for (j=0; j<sizeof(int); j++) {
k = MSVCRT_fgetc(file);
if (k == MSVCRT_EOF) {
file->_flag |= MSVCRT__IOEOF;
+ MSVCRT__unlock_file(file);
return EOF;
}
ch[j] = k;
}
+
+ MSVCRT__unlock_file(file);
return i;
}
@@ -2837,6 +2857,8 @@ MSVCRT_wchar_t * CDECL MSVCRT_fgetws(MSVCRT_wchar_t *s, int size, MSVCRT_FILE* f
TRACE(":file(%p) fd (%d) str (%p) len (%d)\n",
file,file->_file,s,size);
+ MSVCRT__lock_file(file);
+
while ((size >1) && (cc = MSVCRT_fgetwc(file)) != MSVCRT_WEOF && cc != '\n')
{
*s++ = (char)cc;
@@ -2845,12 +2867,14 @@ MSVCRT_wchar_t * CDECL MSVCRT_fgetws(MSVCRT_wchar_t *s, int size, MSVCRT_FILE* f
if ((cc == MSVCRT_WEOF) && (s == buf_start)) /* If nothing read, return 0*/
{
TRACE(":nothing read\n");
+ MSVCRT__unlock_file(file);
return NULL;
}
if ((cc != MSVCRT_WEOF) && (size > 1))
*s++ = cc;
*s = 0;
TRACE(":got %s\n", debugstr_w(buf_start));
+ MSVCRT__unlock_file(file);
return buf_start;
}
@@ -3104,13 +3128,16 @@ int CDECL _fputchar(int c)
* fread (MSVCRT.@)
*/
MSVCRT_size_t CDECL MSVCRT_fread(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nmemb, MSVCRT_FILE* file)
-{ MSVCRT_size_t rcnt=size * nmemb;
+{
+ MSVCRT_size_t rcnt=size * nmemb;
MSVCRT_size_t read=0;
int pread=0;
if(!rcnt)
return 0;
+ MSVCRT__lock_file(file);
+
/* first buffered data */
if(file->_cnt>0) {
int pcnt= (rcnt>file->_cnt)? file->_cnt:rcnt;
@@ -3123,8 +3150,10 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nm
} else if(!(file->_flag & MSVCRT__IOREAD )) {
if(file->_flag & MSVCRT__IORW) {
file->_flag |= MSVCRT__IOREAD;
- } else
- return 0;
+ } else {
+ MSVCRT__unlock_file(file);
+ return 0;
+ }
}
while(rcnt>0)
{
@@ -3169,6 +3198,7 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nm
if (i < 1) break;
}
read+=pread;
+ MSVCRT__unlock_file(file);
return read / size;
}
@@ -3396,6 +3426,7 @@ char * CDECL MSVCRT_gets(char *buf)
int cc;
char * buf_start = buf;
+ MSVCRT__lock_file(MSVCRT_stdin);
for(cc = MSVCRT_fgetc(MSVCRT_stdin); cc != MSVCRT_EOF && cc != '\n';
cc = MSVCRT_fgetc(MSVCRT_stdin))
if(cc != '\r') *buf++ = (char)cc;
@@ -3403,6 +3434,7 @@ char * CDECL MSVCRT_gets(char *buf)
*buf = '\0';
TRACE("got '%s'\n", buf_start);
+ MSVCRT__unlock_file(MSVCRT_stdin);
return buf_start;
}
@@ -3414,6 +3446,7 @@ MSVCRT_wchar_t* CDECL MSVCRT__getws(MSVCRT_wchar_t* buf)
MSVCRT_wint_t cc;
MSVCRT_wchar_t* ws = buf;
+ MSVCRT__lock_file(MSVCRT_stdin);
for (cc = MSVCRT_fgetwc(MSVCRT_stdin); cc != MSVCRT_WEOF && cc != '\n';
cc = MSVCRT_fgetwc(MSVCRT_stdin))
{
@@ -3423,6 +3456,7 @@ MSVCRT_wchar_t* CDECL MSVCRT__getws(MSVCRT_wchar_t* buf)
*buf = '\0';
TRACE("got %s\n", debugstr_w(ws));
+ MSVCRT__unlock_file(MSVCRT_stdin);
return ws;
}
More information about the wine-cvs
mailing list