Paul Gofman : ntoskrnl.exe/tests: Add more timer tests.
Alexandre Julliard
julliard at winehq.org
Thu May 28 17:11:11 CDT 2020
Module: wine
Branch: master
Commit: 6870f137042b8aac71a1500a6ce81ee8d82dcae0
URL: https://source.winehq.org/git/wine.git/?a=commit;h=6870f137042b8aac71a1500a6ce81ee8d82dcae0
Author: Paul Gofman <pgofman at codeweavers.com>
Date: Thu May 28 12:15:20 2020 +0300
ntoskrnl.exe/tests: Add more timer tests.
Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntoskrnl.exe/tests/driver.c | 88 ++++++++++++++++++++++++++++++++++++++--
1 file changed, 85 insertions(+), 3 deletions(-)
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index dc576bfb1b..e762ad0ccd 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -382,6 +382,14 @@ static void test_critical_region(BOOL is_dispatcher)
"KeAreApcsDisabled returned %x\n", result);
}
+static void sleep_1ms(void)
+{
+ LARGE_INTEGER timeout;
+
+ timeout.QuadPart = -1 * 10000;
+ KeDelayExecutionThread( KernelMode, FALSE, &timeout );
+}
+
static void sleep(void)
{
LARGE_INTEGER timeout;
@@ -447,18 +455,32 @@ static void WINAPI remove_lock_thread(void *arg)
PsTerminateSystemThread(STATUS_SUCCESS);
}
+struct test_sync_dpc_context
+{
+ BOOL called;
+};
+
+static void WINAPI test_sync_dpc(KDPC *dpc, void *context, void *system_argument1, void *system_argument2)
+{
+ struct test_sync_dpc_context *c = context;
+
+ c->called = TRUE;
+}
+
static void test_sync(void)
{
static const ULONG wine_tag = 0x454e4957; /* WINE */
- KSEMAPHORE semaphore, semaphore2;
+ struct test_sync_dpc_context dpc_context;
KEVENT manual_event, auto_event, *event;
- KTIMER timer;
+ KSEMAPHORE semaphore, semaphore2;
IO_REMOVE_LOCK remove_lock;
LARGE_INTEGER timeout;
OBJECT_ATTRIBUTES attr;
HANDLE handle, thread;
void *objs[2];
+ KTIMER timer;
NTSTATUS ret;
+ KDPC dpc;
int i;
KeInitializeEvent(&manual_event, NotificationEvent, FALSE);
@@ -711,13 +733,19 @@ static void test_sync(void)
KeCancelTimer(&timer);
KeInitializeTimerEx(&timer, SynchronizationTimer);
- KeSetTimerEx(&timer, timeout, 0, NULL);
+ memset(&dpc_context, 0, sizeof(dpc_context));
+ KeInitializeDpc(&dpc, test_sync_dpc, &dpc_context);
+
+ KeSetTimerEx(&timer, timeout, 0, &dpc);
ret = wait_single(&timer, 0);
ok(ret == WAIT_TIMEOUT, "got %#x\n", ret);
+ ok(!dpc_context.called, "DPC was called unexpectedly.\n");
ret = wait_single(&timer, -40 * 10000);
ok(ret == 0, "got %#x\n", ret);
+ sleep_1ms();
+ ok(dpc_context.called, "DPC was not called.\n");
ret = wait_single(&timer, -40 * 10000);
ok(ret == WAIT_TIMEOUT, "got %#x\n", ret);
@@ -742,6 +770,60 @@ static void test_sync(void)
KeCancelTimer(&timer);
+ /* Test cancelling timer. */
+ dpc_context.called = 0;
+ KeSetTimerEx(&timer, timeout, 0, &dpc);
+
+ ret = wait_single(&timer, 0);
+ ok(ret == WAIT_TIMEOUT, "got %#x\n", ret);
+ ok(!dpc_context.called, "DPC was called.\n");
+
+ KeCancelTimer(&timer);
+ dpc_context.called = 0;
+ ret = wait_single(&timer, -40 * 10000);
+ ok(ret == WAIT_TIMEOUT, "got %#x\n", ret);
+ ok(!dpc_context.called, "DPC was called.\n");
+
+ KeSetTimerEx(&timer, timeout, 20, &dpc);
+ KeSetTimerEx(&timer, timeout, 0, &dpc);
+ ret = wait_single(&timer, 0);
+ ok(ret == WAIT_TIMEOUT, "got %#x\n", ret);
+
+ ret = wait_single(&timer, -40 * 10000);
+ ok(ret == 0, "got %#x\n", ret);
+
+ ret = wait_single(&timer, 0);
+ ok(ret == WAIT_TIMEOUT, "got %#x\n", ret);
+
+ ret = wait_single(&timer, -40 * 10000);
+ ok(ret == WAIT_TIMEOUT, "got %#x\n", ret);
+
+ ret = wait_single(&timer, -40 * 10000);
+ ok(ret == WAIT_TIMEOUT, "got %#x\n", ret);
+
+ KeCancelTimer(&timer);
+ /* Test reinitializing timer. */
+ KeSetTimerEx(&timer, timeout, 0, &dpc);
+ KeInitializeTimerEx(&timer, SynchronizationTimer);
+ dpc_context.called = 0;
+ ret = wait_single(&timer, -40 * 10000);
+ ok(ret == 0, "got %#x\n", ret);
+ sleep_1ms();
+ todo_wine ok(dpc_context.called, "DPC was not called.\n");
+
+ ret = wait_single(&timer, 0);
+ ok(ret == WAIT_TIMEOUT, "got %#x\n", ret);
+ sleep_1ms();
+ todo_wine ok(dpc_context.called, "DPC was not called.\n");
+
+ dpc_context.called = 0;
+ KeSetTimerEx(&timer, timeout, 0, &dpc);
+ ret = wait_single(&timer, -40 * 10000);
+ ok(ret == 0, "got %#x\n", ret);
+ sleep_1ms();
+ ok(dpc_context.called, "DPC was not called.\n");
+
+ KeCancelTimer(&timer);
/* remove locks */
IoInitializeRemoveLockEx(&remove_lock, wine_tag, 0, 0, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
More information about the wine-cvs
mailing list