Jörg Höhle : kernel32/tests: WaitForMultipleObjects returns lowest signaled handle first.

Alexandre Julliard julliard at winehq.org
Mon Aug 22 13:29:05 CDT 2011


Module: wine
Branch: master
Commit: a52e160c68bf170074e6f7810646d3ad0b962ee6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a52e160c68bf170074e6f7810646d3ad0b962ee6

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Sat Jul 23 22:02:19 2011 +0200

kernel32/tests: WaitForMultipleObjects returns lowest signaled handle first.

---

 dlls/kernel32/tests/sync.c   |   48 ++++++++++++++++++++++++++++-------------
 dlls/kernel32/tests/thread.c |    3 +-
 2 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c
index 94b2963..72f33ae 100644
--- a/dlls/kernel32/tests/sync.c
+++ b/dlls/kernel32/tests/sync.c
@@ -41,8 +41,7 @@ static void test_signalandwait(void)
     DWORD (WINAPI *pSignalObjectAndWait)(HANDLE, HANDLE, DWORD, BOOL);
     HMODULE kernel32;
     DWORD r;
-    int i;
-    HANDLE event[2], maxevents[MAXIMUM_WAIT_OBJECTS], semaphore[2], file;
+    HANDLE event[2], semaphore[2], file;
 
     kernel32 = GetModuleHandle("kernel32");
     pSignalObjectAndWait = (void*) GetProcAddress(kernel32, "SignalObjectAndWait");
@@ -94,19 +93,6 @@ static void test_signalandwait(void)
     CloseHandle(event[0]);
     CloseHandle(event[1]);
 
-    /* create the maximum number of events and make sure 
-     * we can wait on that many */
-    for (i=0; i<MAXIMUM_WAIT_OBJECTS; i++)
-    {
-        maxevents[i] = CreateEvent(NULL, 1, 1, NULL);
-        ok( maxevents[i] != 0, "should create enough events\n");
-    }
-    r = WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, 0, 0);
-    ok( r != WAIT_FAILED && r != WAIT_TIMEOUT, "should succeed\n");
-
-    for (i=0; i<MAXIMUM_WAIT_OBJECTS; i++)
-        if (maxevents[i]) CloseHandle(maxevents[i]);
-
     /* semaphores */
     semaphore[0] = CreateSemaphore( NULL, 0, 1, NULL );
     semaphore[1] = CreateSemaphore( NULL, 1, 1, NULL );
@@ -1027,6 +1013,37 @@ static void test_WaitForSingleObject(void)
     CloseHandle(nonsignaled);
 }
 
+static void test_WaitForMultipleObjects(void)
+{
+    DWORD r;
+    int i;
+    HANDLE maxevents[MAXIMUM_WAIT_OBJECTS];
+
+    /* create the maximum number of events and make sure
+     * we can wait on that many */
+    for (i=0; i<MAXIMUM_WAIT_OBJECTS; i++)
+    {
+        maxevents[i] = CreateEvent(NULL, i==0, TRUE, NULL);
+        ok( maxevents[i] != 0, "should create enough events\n");
+    }
+
+    /* a manual-reset event remains signaled, an auto-reset event is cleared */
+    r = WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, 0, 0);
+    ok( r == WAIT_OBJECT_0, "should signal lowest handle first, got %d\n", r);
+    r = WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, 0, 0);
+    ok( r == WAIT_OBJECT_0, "should signal handle #0 first, got %d\n", r);
+    ok(ResetEvent(maxevents[0]), "ResetEvent\n");
+    for (i=1; i<MAXIMUM_WAIT_OBJECTS; i++)
+    {
+        /* the lowest index is checked first and remaining events are untouched */
+        r = WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, 0, 0);
+        ok( r == WAIT_OBJECT_0+i, "should signal handle #%d first, got %d\n", i, r);
+    }
+
+    for (i=0; i<MAXIMUM_WAIT_OBJECTS; i++)
+        if (maxevents[i]) CloseHandle(maxevents[i]);
+}
+
 START_TEST(sync)
 {
     HMODULE hdll = GetModuleHandle("kernel32");
@@ -1047,4 +1064,5 @@ START_TEST(sync)
     test_iocp_callback();
     test_timer_queue();
     test_WaitForSingleObject();
+    test_WaitForMultipleObjects();
 }
diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c
index 03983f5..19726af 100644
--- a/dlls/kernel32/tests/thread.c
+++ b/dlls/kernel32/tests/thread.c
@@ -288,6 +288,7 @@ static VOID test_CreateRemoteThread(void)
         skip("child process wasn't mapped at same address, so can't do CreateRemoteThread tests.\n");
         return;
     }
+    ok(ret == WAIT_OBJECT_0 || broken(ret == WAIT_OBJECT_0+1 /* nt4,w2k */), "WaitForAllObjects 2 events %d\n", ret);
 
     hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
     ok(hEvent != NULL, "Can't create event, err=%u\n", GetLastError());
@@ -1248,7 +1249,7 @@ static void test_TLS(void)
   }
 
   ret = WaitForMultipleObjects(2, threads, TRUE, 60000);
-  ok(ret == WAIT_OBJECT_0 || ret == WAIT_OBJECT_0+1 /* nt4 */, "WaitForMultipleObjects failed %u\n",ret);
+  ok(ret == WAIT_OBJECT_0 || broken(ret == WAIT_OBJECT_0+1 /* nt4,w2k */), "WaitForAllObjects 2 threads %d\n",ret);
 
   for (i = 0; i < 2; ++i)
     CloseHandle(threads[i]);




More information about the wine-cvs mailing list