[3/3] msvcrt: Added _fflush_nolock() implementation
Piotr Caban
piotr.caban at gmail.com
Wed Oct 15 05:10:02 CDT 2014
Hi,
On 10/14/14 20:52, Iván Matellanes wrote:
> I was wondering how I could check the native behaviour in this case. Would you give me a hint?
I've attached the test. It shows that _fflush_nolock(NULL) locks flushed
files.
Cheers,
Piotr
-------------- next part --------------
>From 1818caff793dd54ee43618be176fca530f2654a4 Mon Sep 17 00:00:00 2001
From: Piotr Caban <piotr at codeweavers.com>
Date: Wed, 15 Oct 2014 12:07:02 +0200
Subject: [PATCH] msvcr90: Add _fflush_nolock test
To: wine-patches <wine-patches at winehq.org>
---
dlls/msvcr90/tests/msvcr90.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/dlls/msvcr90/tests/msvcr90.c b/dlls/msvcr90/tests/msvcr90.c
index 0a81edc..e6d0e6d 100644
--- a/dlls/msvcr90/tests/msvcr90.c
+++ b/dlls/msvcr90/tests/msvcr90.c
@@ -121,6 +121,7 @@ static int (__cdecl *p_flsbuf)(int, FILE*);
static unsigned long (__cdecl *p_byteswap_ulong)(unsigned long);
static void** (__cdecl *p__pxcptinfoptrs)(void);
static void* (__cdecl *p__AdjustPointer)(void*, const void*);
+static int (__cdecl *p_fflush_nolock)(FILE*);
/* make sure we use the correct errno */
#undef errno
@@ -379,6 +380,7 @@ static BOOL init(void)
SET(p_byteswap_ulong, "_byteswap_ulong");
SET(p__pxcptinfoptrs, "__pxcptinfoptrs");
SET(p__AdjustPointer, "__AdjustPointer");
+ SET(p_fflush_nolock, "_fflush_nolock");
if (sizeof(void *) == 8)
{
SET(p_type_info_name_internal_method, "?_name_internal_method at type_info@@QEBAPEBDPEAU__type_info_node@@@Z");
@@ -1207,16 +1209,22 @@ struct block_file_arg
FILE *write;
HANDLE init;
HANDLE finish;
+ int deadlock_test;
};
static DWORD WINAPI block_file(void *arg)
{
struct block_file_arg *files = arg;
+ int deadlock_test;
p_lock_file(files->read);
p_lock_file(files->write);
SetEvent(files->init);
+
WaitForSingleObject(files->finish, INFINITE);
+ Sleep(200);
+ deadlock_test = InterlockedIncrement(&files->deadlock_test);
+ ok(deadlock_test == 1, "deadlock_test = %d\n", deadlock_test);
p_unlock_file(files->read);
p_unlock_file(files->write);
return 0;
@@ -1250,6 +1258,7 @@ static void test_nonblocking_file_access(void)
arg.write = filew;
arg.init = CreateEventW(NULL, FALSE, FALSE, NULL);
arg.finish = CreateEventW(NULL, FALSE, FALSE, NULL);
+ arg.deadlock_test = 0;
ok(arg.init != NULL, "CreateEventW failed\n");
ok(arg.finish != NULL, "CreateEventW failed\n");
thread = CreateThread(NULL, 0, block_file, (void*)&arg, 0, NULL);
@@ -1276,7 +1285,16 @@ static void test_nonblocking_file_access(void)
ret = p_flsbuf('a', filew);
ok(ret=='a', "_flsbuf(filew) returned %d\n", ret);
+ ret = p_fflush_nolock(filer);
+ ok(ret==0, "_fflush_nolock(filer) returned %d\n", ret);
+ ret = p_fflush_nolock(filew);
+ ok(ret==0, "_fflush_nolock(filew) returned %d\n", ret);
SetEvent(arg.finish);
+ ret = p_fflush_nolock(NULL);
+ ok(ret==0, "_fflush_nolock(NULL) returned %d\n", ret);
+ ret = InterlockedIncrement(&arg.deadlock_test);
+ ok(ret==2, "InterlockedIncrement returned %d\n", ret);
+
WaitForSingleObject(thread, INFINITE);
CloseHandle(arg.init);
CloseHandle(arg.finish);
--
2.0.4
More information about the wine-devel
mailing list