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