From 9fda14a9d62d5b30a4611eb45d1b8bd6c8db147e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Matellanes?= Date: Tue, 7 Oct 2014 13:35:29 +0200 Subject: [PATCH] msvcrt: Added _fclose_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 | 17 ++++++++++++++--- dlls/msvcrt/msvcrt.h | 1 + include/msvcrt/stdio.h | 1 + 7 files changed, 20 insertions(+), 7 deletions(-) diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 84ddcc93d2b..2796576dc39 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -794,7 +794,7 @@ @ cdecl _execvpe(str ptr ptr) @ cdecl _exit(long) MSVCRT__exit @ cdecl _expand(ptr long) -@ stub _fclose_nolock +@ cdecl _fclose_nolock(ptr) MSVCRT__fclose_nolock @ cdecl _fcloseall() MSVCRT__fcloseall @ cdecl _fcvt(double long ptr ptr) MSVCRT__fcvt @ cdecl _fcvt_s(ptr long double long ptr ptr) MSVCRT__fcvt_s diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 36c413777aa..ae6c35637b3 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1142,7 +1142,7 @@ @ cdecl _execvpe(str ptr ptr) @ cdecl _exit(long) MSVCRT__exit @ cdecl _expand(ptr long) -@ stub _fclose_nolock +@ cdecl _fclose_nolock(ptr) MSVCRT__fclose_nolock @ cdecl _fcloseall() MSVCRT__fcloseall @ cdecl _fcvt(double long ptr ptr) MSVCRT__fcvt @ cdecl _fcvt_s(ptr long double long ptr ptr) MSVCRT__fcvt_s diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 1745f64b1d3..fc384531148 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -461,7 +461,7 @@ @ cdecl _execvpe(str ptr ptr) @ cdecl _exit(long) MSVCRT__exit @ cdecl _expand(ptr long) -@ stub _fclose_nolock +@ cdecl _fclose_nolock(ptr) MSVCRT__fclose_nolock @ cdecl _fcloseall() MSVCRT__fcloseall @ cdecl _fcvt(double long ptr ptr) MSVCRT__fcvt @ cdecl _fcvt_s(ptr long double long ptr ptr) MSVCRT__fcvt_s diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index ba3757aacbc..4267c2c7b31 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -443,7 +443,7 @@ @ cdecl _execvpe(str ptr ptr) @ cdecl _exit(long) MSVCRT__exit @ cdecl _expand(ptr long) -@ stub _fclose_nolock +@ cdecl _fclose_nolock(ptr) MSVCRT__fclose_nolock @ cdecl _fcloseall() MSVCRT__fcloseall @ cdecl _fcvt(double long ptr ptr) MSVCRT__fcvt @ cdecl _fcvt_s(ptr long double long ptr ptr) MSVCRT__fcvt_s diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 7ce8b5912ea..c57861aff45 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -3373,9 +3373,22 @@ int CDECL MSVCRT__putw(int val, MSVCRT_FILE* file) */ int CDECL MSVCRT_fclose(MSVCRT_FILE* file) { - int r, flag; + int ret; MSVCRT__lock_file(file); + ret = MSVCRT__fclose_nolock(file); + MSVCRT__unlock_file(file); + + return ret; +} + +/********************************************************************* + * _fclose_nolock (MSVCRT.@) + */ +int CDECL MSVCRT__fclose_nolock(MSVCRT_FILE* file) +{ + int r, flag; + flag = file->_flag; MSVCRT_free(file->_tmpfname); file->_tmpfname = NULL; @@ -3386,9 +3399,7 @@ int CDECL MSVCRT_fclose(MSVCRT_FILE* file) MSVCRT_free(file->_base); r=MSVCRT__close(file->_file); - file->_flag = 0; - MSVCRT__unlock_file(file); return ((r == -1) || (flag & MSVCRT__IOERR) ? MSVCRT_EOF : 0); } diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 54cd11af7f2..200e35c0ee7 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -926,6 +926,7 @@ MSVCRT_ulong* __cdecl MSVCRT___doserrno(void); int* __cdecl MSVCRT__errno(void); char* __cdecl MSVCRT_getenv(const char*); int __cdecl MSVCRT_fclose(MSVCRT_FILE*); +int __cdecl MSVCRT__fclose_nolock(MSVCRT_FILE*); void __cdecl MSVCRT_terminate(void); MSVCRT_FILE* __cdecl MSVCRT__iob_func(void); MSVCRT_clock_t __cdecl MSVCRT_clock(void); diff --git a/include/msvcrt/stdio.h b/include/msvcrt/stdio.h index 737003d99e1..184dd2b9f4b 100644 --- a/include/msvcrt/stdio.h +++ b/include/msvcrt/stdio.h @@ -129,6 +129,7 @@ int __cdecl _vsprintf_p_l(char*,size_t,const char*,_locale_t,__ms_va_list); 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*);