[5/11] kernel32: Implement Create/DeleteTimerQueue[Ex].
Dan Hipschman
dsh at linux.ucla.edu
Fri Jul 18 19:17:00 CDT 2008
---
dlls/kernel32/sync.c | 40 ++++++++++++++++++++++++++++++++++------
dlls/kernel32/tests/sync.c | 11 +++--------
2 files changed, 37 insertions(+), 14 deletions(-)
diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c
index 44cc47f..a86ba50 100644
--- a/dlls/kernel32/sync.c
+++ b/dlls/kernel32/sync.c
@@ -47,6 +47,7 @@
#include "kernel_private.h"
#include "wine/debug.h"
+#include "wine/list.h"
WINE_DEFAULT_DEBUG_CHANNEL(sync);
@@ -1042,14 +1043,31 @@ BOOL WINAPI CancelWaitableTimer( HANDLE handle )
}
+struct queue_timer
+{
+ struct list entry;
+};
+
+struct timer_queue
+{
+ RTL_CRITICAL_SECTION cs;
+ struct list timers;
+};
+
/***********************************************************************
* CreateTimerQueue (KERNEL32.@)
*/
HANDLE WINAPI CreateTimerQueue(void)
{
- FIXME("stub\n");
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return NULL;
+ struct timer_queue *q = HeapAlloc(GetProcessHeap(), 0, sizeof *q);
+ if (!q)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return NULL;
+ }
+ RtlInitializeCriticalSection(&q->cs);
+ list_init(&q->timers);
+ return q;
}
@@ -1058,9 +1076,19 @@ HANDLE WINAPI CreateTimerQueue(void)
*/
BOOL WINAPI DeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent)
{
- FIXME("(%p, %p): stub\n", TimerQueue, CompletionEvent);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ struct timer_queue *q = TimerQueue;
+ BOOL ret;
+ if (CompletionEvent == INVALID_HANDLE_VALUE)
+ {
+ ret = TRUE;
+ }
+ else
+ {
+ ret = FALSE;
+ SetLastError(ERROR_IO_PENDING);
+ }
+ HeapFree(GetProcessHeap(), 0, q);
+ return ret;
}
/***********************************************************************
diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c
index 2aee819..f279e3a 100644
--- a/dlls/kernel32/tests/sync.c
+++ b/dlls/kernel32/tests/sync.c
@@ -611,18 +611,15 @@ static void test_timer_queue(void)
/* Test asyncronous deletion of the queue. */
q = pCreateTimerQueue();
- todo_wine
ok(q != NULL, "CreateTimerQueue\n");
SetLastError(0xdeadbeef);
ret = pDeleteTimerQueueEx(q, NULL);
ok(!ret, "DeleteTimerQueueEx\n");
- todo_wine
ok(GetLastError() == ERROR_IO_PENDING, "DeleteTimerQueueEx\n");
/* Test syncronous deletion of the queue and running timers. */
q = pCreateTimerQueue();
- todo_wine
ok(q != NULL, "CreateTimerQueue\n");
/* Called once. */
@@ -674,9 +671,9 @@ static void test_timer_queue(void)
Sleep(500);
ret = pDeleteTimerQueueEx(q, INVALID_HANDLE_VALUE);
+ ok(ret, "DeleteTimerQueueEx\n");
todo_wine
{
- ok(ret, "DeleteTimerQueueEx\n");
ok(n1 == 1, "Timer callback 1\n");
ok(n2 < n3, "Timer callback 2 should be much slower than 3\n");
}
@@ -693,15 +690,14 @@ static void test_timer_queue(void)
}
q = pCreateTimerQueue();
- todo_wine
ok(q != NULL, "CreateTimerQueue\n");
SetLastError(0xdeadbeef);
ret = pDeleteTimerQueueEx(q, e);
ok(!ret, "DeleteTimerQueueEx\n");
+ ok(GetLastError() == ERROR_IO_PENDING, "DeleteTimerQueueEx\n");
todo_wine
{
- ok(GetLastError() == ERROR_IO_PENDING, "DeleteTimerQueueEx\n");
ok(WaitForSingleObject(e, 250) == WAIT_OBJECT_0,
"Timer destruction event not triggered\n");
}
@@ -709,7 +705,6 @@ static void test_timer_queue(void)
/* Test deleting/changing a timer in execution. */
q = pCreateTimerQueue();
- todo_wine
ok(q != NULL, "CreateTimerQueue\n");
d2.t = t2 = NULL;
@@ -737,9 +732,9 @@ static void test_timer_queue(void)
Sleep(200);
ret = pDeleteTimerQueueEx(q, INVALID_HANDLE_VALUE);
+ ok(ret, "DeleteTimerQueueEx\n");
todo_wine
{
- ok(ret, "DeleteTimerQueueEx\n");
ok(d2.num_calls == d2.max_calls, "DeleteTimerQueueTimer\n");
ok(d3.num_calls == d3.max_calls, "ChangeTimerQueueTimer\n");
}
More information about the wine-patches
mailing list