[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