Piotr Caban : msvcrt: Use fd critical section in _commit.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Nov 11 11:04:46 CST 2014
Module: wine
Branch: master
Commit: 4508e665c075169eeea82641290afd6a3114ef05
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4508e665c075169eeea82641290afd6a3114ef05
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Nov 11 15:58:13 2014 +0100
msvcrt: Use fd critical section in _commit.
---
dlls/msvcrt/file.c | 46 +++++++++++++++++++++++++++++++++++-----------
1 file changed, 35 insertions(+), 11 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index e172231..60dbd92 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -257,6 +257,20 @@ static inline ioinfo* get_ioinfo_nolock(int fd)
return ret + (fd%MSVCRT_FD_BLOCK_SIZE);
}
+static inline ioinfo* get_ioinfo(int fd)
+{
+ ioinfo *ret = get_ioinfo_nolock(fd);
+ if(ret->exflag & EF_CRIT_INIT)
+ EnterCriticalSection(&ret->crit);
+ return ret;
+}
+
+static inline void release_ioinfo(ioinfo *info)
+{
+ if(info->exflag & EF_CRIT_INIT)
+ LeaveCriticalSection(&info->crit);
+}
+
static inline MSVCRT_FILE* msvcrt_get_file(int i)
{
file_crit *ret;
@@ -858,27 +872,37 @@ int CDECL MSVCRT__wunlink(const MSVCRT_wchar_t *path)
*/
int CDECL MSVCRT__commit(int fd)
{
- HANDLE hand = msvcrt_fdtoh(fd);
+ ioinfo *info = get_ioinfo(fd);
+ int ret;
- TRACE(":fd (%d) handle (%p)\n",fd,hand);
- if (hand == INVALID_HANDLE_VALUE)
- return -1;
+ TRACE(":fd (%d) handle (%p)\n", fd, info->handle);
- if (!FlushFileBuffers(hand))
+ if (info->handle == INVALID_HANDLE_VALUE)
+ ret = -1;
+ else if (!FlushFileBuffers(info->handle))
{
if (GetLastError() == ERROR_INVALID_HANDLE)
{
/* FlushFileBuffers fails for console handles
* so we ignore this error.
*/
- return 0;
+ ret = 0;
+ }
+ else
+ {
+ TRACE(":failed-last error (%d)\n",GetLastError());
+ msvcrt_set_errno(GetLastError());
+ ret = -1;
}
- TRACE(":failed-last error (%d)\n",GetLastError());
- msvcrt_set_errno(GetLastError());
- return -1;
}
- TRACE(":ok\n");
- return 0;
+ else
+ {
+ TRACE(":ok\n");
+ ret = 0;
+ }
+
+ release_ioinfo(info);
+ return ret;
}
/* flush_all_buffers calls MSVCRT_fflush which calls flush_all_buffers */
More information about the wine-cvs
mailing list