[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