Module: wine Branch: master Commit: 421b3867e011dca1eef605c05e8a3d20ce0bfa39 URL: https://gitlab.winehq.org/wine/wine/-/commit/421b3867e011dca1eef605c05e8a3d2...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sun Nov 20 22:31:23 2022 +0300
kernelbase: Forward SetThreadIdealProcessor() to ntdll.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
---
dlls/kernelbase/thread.c | 14 +++++++------- dlls/ntdll/tests/info.c | 22 ++++++++++++++++++++++ dlls/ntdll/unix/thread.c | 13 +++++++++++-- dlls/wow64/process.c | 1 + 4 files changed, 41 insertions(+), 9 deletions(-)
diff --git a/dlls/kernelbase/thread.c b/dlls/kernelbase/thread.c index f11d17748fe..a817609a385 100644 --- a/dlls/kernelbase/thread.c +++ b/dlls/kernelbase/thread.c @@ -512,13 +512,13 @@ BOOL WINAPI DECLSPEC_HOTPATCH SetThreadGroupAffinity( HANDLE thread, const GROUP */ DWORD WINAPI DECLSPEC_HOTPATCH SetThreadIdealProcessor( HANDLE thread, DWORD proc ) { - FIXME( "(%p %lu): stub\n", thread, proc ); - if (proc > MAXIMUM_PROCESSORS) - { - SetLastError( ERROR_INVALID_PARAMETER ); - return ~0u; - } - return 0; + NTSTATUS status; + + status = NtSetInformationThread( thread, ThreadIdealProcessor, &proc, sizeof(proc) ); + if (NT_SUCCESS(status)) return status; + + SetLastError( RtlNtStatusToDosError( status )); + return ~0u; }
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index bef982b20b0..c3c40d8f99c 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -3356,6 +3356,27 @@ static void test_thread_lookup(void) ok( !handle || broken(handle == (HANDLE)0xdeadbeef) /* vista */, "handle set %p\n", handle ); }
+static void test_thread_ideal_processor(void) +{ + ULONG number, len; + NTSTATUS status; + + number = 0; + status = pNtSetInformationThread( GetCurrentThread(), ThreadIdealProcessor, &number, sizeof(number) ); + ok(NT_SUCCESS(status), "Unexpected status %#lx.\n", status); + + number = 64 + 1; + status = pNtSetInformationThread( GetCurrentThread(), ThreadIdealProcessor, &number, sizeof(number) ); + ok(status == STATUS_INVALID_PARAMETER, "Unexpected status %#lx.\n", status); + + number = 0; + status = pNtSetInformationThread( GetCurrentThread(), ThreadIdealProcessor, &number, sizeof(number) ); + ok(!status, "Unexpected status %#lx.\n", status); + + status = pNtQueryInformationThread( GetCurrentThread(), ThreadIdealProcessor, &number, sizeof(number), &len ); + ok(status == STATUS_INVALID_INFO_CLASS, "Unexpected status %#lx.\n", status); +} + static void test_thread_info(void) { NTSTATUS status; @@ -3613,6 +3634,7 @@ START_TEST(info) test_HideFromDebugger(); test_thread_start_address(); test_thread_lookup(); + test_thread_ideal_processor();
test_affinity(); test_debug_object(); diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c index 27f6f916220..05c575cfdaa 100644 --- a/dlls/ntdll/unix/thread.c +++ b/dlls/ntdll/unix/thread.c @@ -2177,6 +2177,7 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class, if (ret_len) *ret_len = sizeof(BOOLEAN); return STATUS_SUCCESS;
+ case ThreadIdealProcessor: case ThreadEnableAlignmentFaultFixup: return STATUS_INVALID_INFO_CLASS;
@@ -2186,7 +2187,6 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class, case ThreadEventPair_Reusable: case ThreadZeroTlsCell: case ThreadPerformanceCount: - case ThreadIdealProcessor: case ThreadPriorityBoost: case ThreadSetTlsArrayAddress: default: @@ -2379,6 +2379,16 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class, FIXME( "ThreadPowerThrottling stub!\n" ); return STATUS_SUCCESS;
+ case ThreadIdealProcessor: + { + const ULONG *number = data; + + if (length != sizeof(*number)) return STATUS_INFO_LENGTH_MISMATCH; + if (*number > MAXIMUM_PROCESSORS) return STATUS_INVALID_PARAMETER; + FIXME( "ThreadIdealProcessor stub!\n" ); + return STATUS_SUCCESS; + } + case ThreadBasicInformation: case ThreadTimes: case ThreadPriority: @@ -2386,7 +2396,6 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class, case ThreadEventPair_Reusable: case ThreadPerformanceCount: case ThreadAmILastThread: - case ThreadIdealProcessor: case ThreadPriorityBoost: case ThreadSetTlsArrayAddress: case ThreadIsIoPending: diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index ea7a1beb5e3..61ecc68724c 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -1162,6 +1162,7 @@ NTSTATUS WINAPI wow64_NtSetInformationThread( UINT *args ) case ThreadHideFromDebugger: /* void */ case ThreadEnableAlignmentFaultFixup: /* BOOLEAN */ case ThreadPowerThrottlingState: /* THREAD_POWER_THROTTLING_STATE */ + case ThreadIdealProcessor: /* ULONG */ return NtSetInformationThread( handle, class, ptr, len );
case ThreadImpersonationToken: /* HANDLE */