[6/11] kernel32: Implement CreateTimerQueueTimer.
Dan Hipschman
dsh at linux.ucla.edu
Fri Jul 18 19:17:43 CDT 2008
---
dlls/kernel32/sync.c | 29 +++++++++++++++++++++++++++--
dlls/kernel32/tests/sync.c | 7 -------
2 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c
index a86ba50..8085077 100644
--- a/dlls/kernel32/sync.c
+++ b/dlls/kernel32/sync.c
@@ -1070,6 +1070,11 @@ HANDLE WINAPI CreateTimerQueue(void)
return q;
}
+static void queue_remove_timer(struct timer_queue *q, struct queue_timer *t)
+{
+ list_remove(&t->entry);
+ HeapFree(GetProcessHeap(), 0, t);
+}
/***********************************************************************
* DeleteTimerQueueEx (KERNEL32.@)
@@ -1077,7 +1082,9 @@ HANDLE WINAPI CreateTimerQueue(void)
BOOL WINAPI DeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent)
{
struct timer_queue *q = TimerQueue;
+ struct queue_timer *t, *temp;
BOOL ret;
+
if (CompletionEvent == INVALID_HANDLE_VALUE)
{
ret = TRUE;
@@ -1087,6 +1094,12 @@ BOOL WINAPI DeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent)
ret = FALSE;
SetLastError(ERROR_IO_PENDING);
}
+
+ RtlEnterCriticalSection(&q->cs);
+ LIST_FOR_EACH_ENTRY_SAFE(t, temp, &q->timers, struct queue_timer, entry)
+ queue_remove_timer(q, t);
+ RtlLeaveCriticalSection(&q->cs);
+
HeapFree(GetProcessHeap(), 0, q);
return ret;
}
@@ -1108,8 +1121,20 @@ BOOL WINAPI CreateTimerQueueTimer( PHANDLE phNewTimer, HANDLE TimerQueue,
WAITORTIMERCALLBACK Callback, PVOID Parameter,
DWORD DueTime, DWORD Period, ULONG Flags )
{
- FIXME("stub\n");
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ struct timer_queue *q = TimerQueue;
+ struct queue_timer *t = HeapAlloc(GetProcessHeap(), 0, sizeof *t);
+ if (!t)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+ FIXME(": Timer expiration unimplemented\n");
+
+ RtlEnterCriticalSection(&q->cs);
+ list_add_tail(&q->timers, &t->entry);
+ RtlLeaveCriticalSection(&q->cs);
+
+ *phNewTimer = t;
return TRUE;
}
diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c
index f279e3a..0ff3862 100644
--- a/dlls/kernel32/tests/sync.c
+++ b/dlls/kernel32/tests/sync.c
@@ -628,7 +628,6 @@ static void test_timer_queue(void)
ret = pCreateTimerQueueTimer(&t1, q, timer_queue_cb1, &n1, 0,
0, 0);
ok(ret, "CreateTimerQueueTimer\n");
- todo_wine
ok(t1 != NULL, "CreateTimerQueueTimer\n");
/* A slow one. */
@@ -637,7 +636,6 @@ static void test_timer_queue(void)
ret = pCreateTimerQueueTimer(&t2, q, timer_queue_cb1, &n2, 0,
100, 0);
ok(ret, "CreateTimerQueueTimer\n");
- todo_wine
ok(t2 != NULL, "CreateTimerQueueTimer\n");
/* A fast one. */
@@ -646,7 +644,6 @@ static void test_timer_queue(void)
ret = pCreateTimerQueueTimer(&t3, q, timer_queue_cb1, &n3, 0,
10, 0);
ok(ret, "CreateTimerQueueTimer\n");
- todo_wine
ok(t3 != NULL, "CreateTimerQueueTimer\n");
/* Start really late (it won't start). */
@@ -655,7 +652,6 @@ static void test_timer_queue(void)
ret = pCreateTimerQueueTimer(&t4, q, timer_queue_cb1, &n4, 10000,
10, 0);
ok(ret, "CreateTimerQueueTimer\n");
- todo_wine
ok(t4 != NULL, "CreateTimerQueueTimer\n");
/* Start soon, but delay so long it won't run again. */
@@ -664,7 +660,6 @@ static void test_timer_queue(void)
ret = pCreateTimerQueueTimer(&t5, q, timer_queue_cb1, &n5, 0,
10000, 0);
ok(ret, "CreateTimerQueueTimer\n");
- todo_wine
ok(t5 != NULL, "CreateTimerQueueTimer\n");
/* Give them a chance to do some work. */
@@ -715,7 +710,6 @@ static void test_timer_queue(void)
10, 0);
d2.t = t2;
ok(ret, "CreateTimerQueueTimer\n");
- todo_wine
ok(t2 != NULL, "CreateTimerQueueTimer\n");
d3.t = t3 = NULL;
@@ -726,7 +720,6 @@ static void test_timer_queue(void)
10, 0);
d3.t = t3;
ok(ret, "CreateTimerQueueTimer\n");
- todo_wine
ok(t3 != NULL, "CreateTimerQueueTimer\n");
Sleep(200);
More information about the wine-patches
mailing list