Jacek Caban : kernelbase: Implement CreateThreadpoolIo.

Alexandre Julliard julliard at winehq.org
Wed Apr 15 15:55:42 CDT 2020


Module: wine
Branch: master
Commit: b66e13ef249065abf693500faa77d0161bc92a11
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b66e13ef249065abf693500faa77d0161bc92a11

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Apr 15 02:00:18 2020 +0200

kernelbase: Implement CreateThreadpoolIo.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernelbase/thread.c      | 15 ++++++++++++---
 dlls/ntdll/tests/threadpool.c |  4 +---
 dlls/ntdll/threadpool.c       |  1 +
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/dlls/kernelbase/thread.c b/dlls/kernelbase/thread.c
index 94ea9c49de..99f64e072b 100644
--- a/dlls/kernelbase/thread.c
+++ b/dlls/kernelbase/thread.c
@@ -1187,14 +1187,23 @@ PTP_CLEANUP_GROUP WINAPI DECLSPEC_HOTPATCH CreateThreadpoolCleanupGroup(void)
 }
 
 
+static void WINAPI tp_io_callback( TP_CALLBACK_INSTANCE *instance, void *userdata, void *cvalue, IO_STATUS_BLOCK *iosb, TP_IO *io )
+{
+    PTP_WIN32_IO_CALLBACK callback = *(void **)io;
+    callback( instance, userdata, cvalue, RtlNtStatusToDosError( iosb->u.Status ), iosb->Information, io );
+}
+
+
 /***********************************************************************
  *           CreateThreadpoolIo   (kernelbase.@)
  */
-PTP_IO WINAPI /* DECLSPEC_HOTPATCH */ CreateThreadpoolIo( HANDLE handle, PTP_WIN32_IO_CALLBACK callback,
+PTP_IO WINAPI DECLSPEC_HOTPATCH CreateThreadpoolIo( HANDLE handle, PTP_WIN32_IO_CALLBACK callback,
                                                     PVOID userdata, TP_CALLBACK_ENVIRON *environment )
 {
-    FIXME( "(%p, %p, %p, %p): stub\n", handle, callback, userdata, environment );
-    return FALSE;
+    TP_IO *io;
+    if (!set_ntstatus( TpAllocIoCompletion( &io, handle, tp_io_callback, userdata, environment ))) return NULL;
+    *(void **)io = callback; /* ntdll leaves us space to store our callback at the beginning of TP_IO struct */
+    return io;
 }
 
 
diff --git a/dlls/ntdll/tests/threadpool.c b/dlls/ntdll/tests/threadpool.c
index 2984983a06..24f32346fb 100644
--- a/dlls/ntdll/tests/threadpool.c
+++ b/dlls/ntdll/tests/threadpool.c
@@ -2130,9 +2130,7 @@ static void test_kernel32_tp_io(void)
     environment.Pool = pool;
     io = NULL;
     io = pCreateThreadpoolIo(server, kernel32_io_cb, &userdata, &environment);
-    todo_wine ok(!!io, "expected non-NULL TP_IO\n");
-    if (!io)
-        return;
+    ok(!!io, "expected non-NULL TP_IO\n");
 
     pWaitForThreadpoolIoCallbacks(io, FALSE);
 
diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c
index 215a5e9c53..87bfdb0751 100644
--- a/dlls/ntdll/threadpool.c
+++ b/dlls/ntdll/threadpool.c
@@ -153,6 +153,7 @@ struct io_completion
 /* internal threadpool object representation */
 struct threadpool_object
 {
+    void                   *win32_callback; /* leave space for kernelbase to store win32 callback */
     LONG                    refcount;
     BOOL                    shutdown;
     /* read-only information */




More information about the wine-cvs mailing list