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