From b66e13ef249065abf693500faa77d0161bc92a11 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 15 Apr 2020 02:00:18 +0200 Subject: [PATCH] kernelbase: Implement CreateThreadpoolIo. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- 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 94ea9c49de9..99f64e072bb 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 2984983a061..24f32346fbe 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 215a5e9c53a..87bfdb0751d 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 */