msvcrt: Make FILE position related functions thread safe.

This commit is contained in:
Piotr Caban 2011-05-20 13:22:39 +02:00 committed by Alexandre Julliard
parent ae15a4b6bc
commit f2d425b7fc
1 changed files with 31 additions and 4 deletions

View File

@ -1118,6 +1118,9 @@ int CDECL MSVCRT__locking(int fd, int mode, LONG nbytes)
*/ */
int CDECL MSVCRT__fseeki64(MSVCRT_FILE* file, __int64 offset, int whence) int CDECL MSVCRT__fseeki64(MSVCRT_FILE* file, __int64 offset, int whence)
{ {
int ret;
MSVCRT__lock_file(file);
/* Flush output if needed */ /* Flush output if needed */
if(file->_flag & MSVCRT__IOWRT) if(file->_flag & MSVCRT__IOWRT)
msvcrt_flush_buffer(file); msvcrt_flush_buffer(file);
@ -1145,7 +1148,10 @@ int CDECL MSVCRT__fseeki64(MSVCRT_FILE* file, __int64 offset, int whence)
} }
/* Clear end of file flag */ /* Clear end of file flag */
file->_flag &= ~MSVCRT__IOEOF; file->_flag &= ~MSVCRT__IOEOF;
return (MSVCRT__lseeki64(file->_file,offset,whence) == -1)?-1:0; ret = (MSVCRT__lseeki64(file->_file,offset,whence) == -1)?-1:0;
MSVCRT__unlock_file(file);
return ret;
} }
/********************************************************************* /*********************************************************************
@ -1210,8 +1216,11 @@ void CDECL MSVCRT_clearerr(MSVCRT_FILE* file)
void CDECL MSVCRT_rewind(MSVCRT_FILE* file) void CDECL MSVCRT_rewind(MSVCRT_FILE* file)
{ {
TRACE(":file (%p) fd (%d)\n",file,file->_file); TRACE(":file (%p) fd (%d)\n",file,file->_file);
MSVCRT__lock_file(file);
MSVCRT_fseek(file, 0L, SEEK_SET); MSVCRT_fseek(file, 0L, SEEK_SET);
MSVCRT_clearerr(file); MSVCRT_clearerr(file);
MSVCRT__unlock_file(file);
} }
static int msvcrt_get_flags(const MSVCRT_wchar_t* mode, int *open_flags, int* stream_flags) static int msvcrt_get_flags(const MSVCRT_wchar_t* mode, int *open_flags, int* stream_flags)
@ -3228,6 +3237,9 @@ MSVCRT_FILE* CDECL MSVCRT_freopen(const char *path, const char *mode, MSVCRT_FIL
*/ */
int CDECL MSVCRT_fsetpos(MSVCRT_FILE* file, MSVCRT_fpos_t *pos) int CDECL MSVCRT_fsetpos(MSVCRT_FILE* file, MSVCRT_fpos_t *pos)
{ {
int ret;
MSVCRT__lock_file(file);
/* Note that all this has been lifted 'as is' from fseek */ /* Note that all this has been lifted 'as is' from fseek */
if(file->_flag & MSVCRT__IOWRT) if(file->_flag & MSVCRT__IOWRT)
msvcrt_flush_buffer(file); msvcrt_flush_buffer(file);
@ -3241,7 +3253,9 @@ int CDECL MSVCRT_fsetpos(MSVCRT_FILE* file, MSVCRT_fpos_t *pos)
file->_flag &= ~(MSVCRT__IOREAD|MSVCRT__IOWRT); file->_flag &= ~(MSVCRT__IOREAD|MSVCRT__IOWRT);
} }
return (MSVCRT__lseeki64(file->_file,*pos,SEEK_SET) == -1) ? -1 : 0; ret = (MSVCRT__lseeki64(file->_file,*pos,SEEK_SET) == -1) ? -1 : 0;
MSVCRT__unlock_file(file);
return ret;
} }
/********************************************************************* /*********************************************************************
@ -3252,8 +3266,13 @@ __int64 CDECL MSVCRT__ftelli64(MSVCRT_FILE* file)
/* TODO: just call fgetpos and return lower half of result */ /* TODO: just call fgetpos and return lower half of result */
int off=0; int off=0;
__int64 pos; __int64 pos;
MSVCRT__lock_file(file);
pos = _telli64(file->_file); pos = _telli64(file->_file);
if(pos == -1) return -1; if(pos == -1) {
MSVCRT__unlock_file(file);
return -1;
}
if(file->_bufsiz) { if(file->_bufsiz) {
if( file->_flag & MSVCRT__IOWRT ) { if( file->_flag & MSVCRT__IOWRT ) {
off = file->_ptr - file->_base; off = file->_ptr - file->_base;
@ -3272,6 +3291,8 @@ __int64 CDECL MSVCRT__ftelli64(MSVCRT_FILE* file)
} }
} }
} }
MSVCRT__unlock_file(file);
return off + pos; return off + pos;
} }
@ -3289,8 +3310,13 @@ LONG CDECL MSVCRT_ftell(MSVCRT_FILE* file)
int CDECL MSVCRT_fgetpos(MSVCRT_FILE* file, MSVCRT_fpos_t *pos) int CDECL MSVCRT_fgetpos(MSVCRT_FILE* file, MSVCRT_fpos_t *pos)
{ {
int off=0; int off=0;
MSVCRT__lock_file(file);
*pos = MSVCRT__lseeki64(file->_file,0,SEEK_CUR); *pos = MSVCRT__lseeki64(file->_file,0,SEEK_CUR);
if(*pos == -1) return -1; if(*pos == -1) {
MSVCRT__unlock_file(file);
return -1;
}
if(file->_bufsiz) { if(file->_bufsiz) {
if( file->_flag & MSVCRT__IOWRT ) { if( file->_flag & MSVCRT__IOWRT ) {
off = file->_ptr - file->_base; off = file->_ptr - file->_base;
@ -3310,6 +3336,7 @@ int CDECL MSVCRT_fgetpos(MSVCRT_FILE* file, MSVCRT_fpos_t *pos)
} }
} }
*pos += off; *pos += off;
MSVCRT__unlock_file(file);
return 0; return 0;
} }