kernel32: Add a test to check event and mutex states during process termination.
Dmitry Timoshkov
dmitry at baikal.ru
Tue Apr 16 05:01:10 CDT 2013
---
dlls/kernel32/tests/loader.c | 40 +++++++++++++++++++++++++++++++++-------
1 file changed, 33 insertions(+), 7 deletions(-)
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index ddf6fb3..876b4eb 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -1040,7 +1040,7 @@ nt4_is_broken:
}
#define MAX_COUNT 10
-static HANDLE attached_thread[MAX_COUNT], stop_event;
+static HANDLE attached_thread[MAX_COUNT], stop_event, event, mutex;
static DWORD attached_thread_count;
static int test_dll_phase;
@@ -1060,7 +1060,14 @@ static DWORD WINAPI thread_proc(void *param)
static BOOL WINAPI dll_entry_point(HINSTANCE hinst, DWORD reason, LPVOID param)
{
- BOOL ret;
+ DWORD ret;
+
+ ret = WaitForSingleObject(event, 0);
+ ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %#x\n", ret);
+
+ ret = WaitForSingleObject(mutex, 0);
+ ok(ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %#x\n", ret);
+ if (ret == WAIT_OBJECT_0) ReleaseMutex(mutex);
switch (reason)
{
@@ -1150,12 +1157,20 @@ static void child_process(const char *dll_name, DWORD target_offset)
{
void *target;
DWORD ret, dummy, i, code, expected_code;
- HANDLE file, thread, event;
+ HANDLE file, thread;
HMODULE hmod;
NTSTATUS status;
trace("phase %d: writing %p at %#x\n", test_dll_phase, dll_entry_point, target_offset);
+ SetLastError(0xdeadbeef);
+ mutex = CreateMutex(NULL, FALSE, NULL);
+ ok(mutex != 0, "CreateMutex error %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ event = CreateEvent(NULL, 0, 0, NULL);
+ ok(event != 0, "CreateEvent error %d\n", GetLastError());
+
file = CreateFile(dll_name, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
if (file == INVALID_HANDLE_VALUE)
{
@@ -1174,9 +1189,6 @@ static void child_process(const char *dll_name, DWORD target_offset)
ok(hmod != 0, "LoadLibrary error %d\n", GetLastError());
SetLastError(0xdeadbeef);
- event = CreateEvent(NULL, 0, 0, NULL);
- ok(event != 0, "CreateEvent error %d\n", GetLastError());
- SetLastError(0xdeadbeef);
stop_event = CreateEvent(NULL, 0, 0, NULL);
ok(stop_event != 0, "CreateEvent error %d\n", GetLastError());
@@ -1194,7 +1206,6 @@ static void child_process(const char *dll_name, DWORD target_offset)
WaitForSingleObject(event, 3000);
CloseHandle(thread);
- CloseHandle(event);
Sleep(100);
ok(attached_thread_count != 0, "attached thread count should not be 0\n");
@@ -1208,6 +1219,13 @@ static void child_process(const char *dll_name, DWORD target_offset)
Sleep(100);
+ ret = WaitForSingleObject(event, 0);
+ ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %#x\n", ret);
+
+ ret = WaitForSingleObject(mutex, 0);
+ ok(ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %#x\n", ret);
+ if (ret == WAIT_OBJECT_0) ReleaseMutex(mutex);
+
ret = pRtlDllShutdownInProgress();
ok(!ret, "RtlDllShutdownInProgress returned %d\n", ret);
@@ -1247,6 +1265,7 @@ static void child_process(const char *dll_name, DWORD target_offset)
case 3:
trace("signalling thread exit\n");
SetEvent(stop_event);
+ Sleep(100);
CloseHandle(stop_event);
break;
@@ -1280,6 +1299,13 @@ static void child_process(const char *dll_name, DWORD target_offset)
ok(code == expected_code, "expected thread exit code %u, got %u\n", expected_code, code);
}
+ ret = WaitForSingleObject(event, 0);
+ ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %#x\n", ret);
+
+ ret = WaitForSingleObject(mutex, 0);
+ ok(ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %#x\n", ret);
+ if (ret == WAIT_OBJECT_0) ReleaseMutex(mutex);
+
*child_failures = winetest_get_failures();
trace("call ExitProcess()\n");
--
1.8.2.1
More information about the wine-patches
mailing list