Module: wine Branch: master Commit: 206ea48f203dc6001828b99db261bf493235f683 URL: http://source.winehq.org/git/wine.git/?a=commit;h=206ea48f203dc6001828b99db2...
Author: Iván Matellanes matellanesivan@gmail.com Date: Thu Oct 9 19:51:55 2014 +0200
msvcrt: Added _fread_nolock() implementation.
---
dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/file.c | 18 ++++++++++++++---- dlls/msvcrt/msvcrt.h | 1 + include/msvcrt/stdio.h | 4 +++- 7 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 2796576..5175884 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -832,7 +832,7 @@ @ cdecl _fputchar(long) MSVCRT__fputchar @ stub _fputwc_nolock @ cdecl _fputwchar(long) MSVCRT__fputwchar -@ stub _fread_nolock +@ cdecl _fread_nolock(ptr long long ptr) MSVCRT__fread_nolock @ stub _fread_nolock_s @ cdecl _free_locale(ptr) MSVCRT__free_locale @ stub _freea diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index ae6c356..8ba85fe 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1180,7 +1180,7 @@ @ cdecl _fputchar(long) MSVCRT__fputchar @ stub _fputwc_nolock @ cdecl _fputwchar(long) MSVCRT__fputwchar -@ stub _fread_nolock +@ cdecl _fread_nolock(ptr long long ptr) MSVCRT__fread_nolock @ stub _fread_nolock_s @ cdecl _free_locale(ptr) MSVCRT__free_locale @ stub _freea diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index fc38453..2d1cb95 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -499,7 +499,7 @@ @ cdecl _fputchar(long) MSVCRT__fputchar @ stub _fputwc_nolock @ cdecl _fputwchar(long) MSVCRT__fputwchar -@ stub _fread_nolock +@ cdecl _fread_nolock(ptr long long ptr) MSVCRT__fread_nolock @ stub _fread_nolock_s @ cdecl _free_locale(ptr) MSVCRT__free_locale @ stub _freea diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 4267c2c..f43f811 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -481,7 +481,7 @@ @ cdecl _fputchar(long) MSVCRT__fputchar @ stub _fputwc_nolock @ cdecl _fputwchar(long) MSVCRT__fputwchar -@ stub _fread_nolock +@ cdecl _fread_nolock(ptr long long ptr) MSVCRT__fread_nolock @ stub _fread_nolock_s @ cdecl _free_locale(ptr) MSVCRT__free_locale @ stub _freea diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index c57861a..51bd7bc 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -3957,6 +3957,20 @@ int CDECL MSVCRT__fputchar(int c) */ MSVCRT_size_t CDECL MSVCRT_fread(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nmemb, MSVCRT_FILE* file) { + int ret; + + MSVCRT__lock_file(file); + ret = MSVCRT__fread_nolock(ptr, size, nmemb, file); + MSVCRT__unlock_file(file); + + return ret; +} + +/********************************************************************* + * _fread_nolock (MSVCRT.@) + */ +MSVCRT_size_t CDECL MSVCRT__fread_nolock(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nmemb, MSVCRT_FILE* file) +{ MSVCRT_size_t rcnt=size * nmemb; MSVCRT_size_t read=0; MSVCRT_size_t pread=0; @@ -3964,8 +3978,6 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nm if(!rcnt) return 0;
- MSVCRT__lock_file(file); - /* first buffered data */ if(file->_cnt>0) { int pcnt= (rcnt>file->_cnt)? file->_cnt:rcnt; @@ -3979,7 +3991,6 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nm if(file->_flag & MSVCRT__IORW) { file->_flag |= MSVCRT__IOREAD; } else { - MSVCRT__unlock_file(file); return 0; } } @@ -4028,7 +4039,6 @@ 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; }
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 200e35c..9065ebe 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -925,6 +925,7 @@ void __cdecl MSVCRT_abort(void); MSVCRT_ulong* __cdecl MSVCRT___doserrno(void); int* __cdecl MSVCRT__errno(void); char* __cdecl MSVCRT_getenv(const char*); +MSVCRT_size_t __cdecl MSVCRT__fread_nolock(void*,MSVCRT_size_t,MSVCRT_size_t,MSVCRT_FILE*); int __cdecl MSVCRT_fclose(MSVCRT_FILE*); int __cdecl MSVCRT__fclose_nolock(MSVCRT_FILE*); void __cdecl MSVCRT_terminate(void); diff --git a/include/msvcrt/stdio.h b/include/msvcrt/stdio.h index 184dd2b..f84a17f 100644 --- a/include/msvcrt/stdio.h +++ b/include/msvcrt/stdio.h @@ -127,9 +127,11 @@ int __cdecl _vsnprintf(char*,size_t,const char*,__ms_va_list); int __cdecl _vsnprintf_s(char*,size_t,size_t,const char*,__ms_va_list); int __cdecl _vsprintf_p_l(char*,size_t,const char*,_locale_t,__ms_va_list);
+size_t __cdecl _fread_nolock(void*,size_t,size_t,FILE*); +int __cdecl _fclose_nolock(FILE*); + void __cdecl clearerr(FILE*); int __cdecl fclose(FILE*); -int __cdecl _fclose_nolock(FILE*); int __cdecl feof(FILE*); int __cdecl ferror(FILE*); int __cdecl fflush(FILE*);