From: Marc-Aurel Zent mzent@codeweavers.com
--- dlls/kernel32/tests/thread.c | 2 +- dlls/ntdll/unix/thread.c | 18 +++++++++++++----- server/protocol.def | 7 ++++--- server/thread.c | 3 +++ server/thread.h | 1 + 5 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c index fa25fd4e4a7..e68b9da7dc4 100644 --- a/dlls/kernel32/tests/thread.c +++ b/dlls/kernel32/tests/thread.c @@ -770,7 +770,7 @@ static VOID test_thread_priority(void) ok(access_thread!=NULL,"OpenThread returned an invalid handle\n"); if (access_thread!=NULL) { todo_wine obey_ar(pSetThreadPriorityBoost(access_thread,1)==0); - todo_wine obey_ar(pGetThreadPriorityBoost(access_thread,&disabled)==0); + obey_ar(pGetThreadPriorityBoost(access_thread, &disabled) == 0); ok(CloseHandle(access_thread),"Error Closing thread handle\n"); } } diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c index ce6683e075f..5456ccdace1 100644 --- a/dlls/ntdll/unix/thread.c +++ b/dlls/ntdll/unix/thread.c @@ -2307,12 +2307,20 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class,
case ThreadPriorityBoost: { - DWORD *value = data; - if (length != sizeof(ULONG)) return STATUS_INFO_LENGTH_MISMATCH; - if (ret_len) *ret_len = sizeof(ULONG); - *value = 0; - return STATUS_SUCCESS; + SERVER_START_REQ( get_thread_info ) + { + req->handle = wine_server_obj_handle( handle ); + status = wine_server_call( req ); + if (status == STATUS_SUCCESS) + { + ULONG disable_boost = !!(reply->flags & GET_THREAD_INFO_FLAG_DISABLE_BOOST); + if (data) memcpy( data, &disable_boost, sizeof(disable_boost) ); + if (ret_len) *ret_len = sizeof(disable_boost); + } + } + SERVER_END_REQ; + return status; }
case ThreadIdealProcessorEx: diff --git a/server/protocol.def b/server/protocol.def index 22470e33ae0..2dce37de8c3 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1242,9 +1242,10 @@ struct obj_locator data_size_t desc_len; /* description length in bytes */ VARARG(desc,unicode_str); /* description string */ @END -#define GET_THREAD_INFO_FLAG_DBG_HIDDEN 0x01 -#define GET_THREAD_INFO_FLAG_TERMINATED 0x02 -#define GET_THREAD_INFO_FLAG_LAST 0x04 +#define GET_THREAD_INFO_FLAG_DBG_HIDDEN 0x01 +#define GET_THREAD_INFO_FLAG_TERMINATED 0x02 +#define GET_THREAD_INFO_FLAG_LAST 0x04 +#define GET_THREAD_INFO_FLAG_DISABLE_BOOST 0x08
/* Retrieve information about thread times */ diff --git a/server/thread.c b/server/thread.c index 05ec6a4ec00..c4f5da5a2cf 100644 --- a/server/thread.c +++ b/server/thread.c @@ -416,6 +416,7 @@ static inline void init_thread_structure( struct thread *thread ) thread->exit_code = 0; thread->priority = 0; thread->base_priority = 0; + thread->disable_boost = 0; thread->suspend = 0; thread->dbg_hidden = 0; thread->desktop_users = 0; @@ -1797,6 +1798,8 @@ DECL_HANDLER(get_thread_info) reply->flags |= GET_THREAD_INFO_FLAG_TERMINATED; if (thread->process->running_threads == 1) reply->flags |= GET_THREAD_INFO_FLAG_LAST; + if (thread->disable_boost) + reply->flags |= GET_THREAD_INFO_FLAG_DISABLE_BOOST;
if (thread->desc && get_reply_max_size()) { diff --git a/server/thread.h b/server/thread.h index 58081be7481..169abf18594 100644 --- a/server/thread.h +++ b/server/thread.h @@ -84,6 +84,7 @@ struct thread affinity_t affinity; /* affinity mask */ int priority; /* current thread priority */ int base_priority; /* base priority level (relative to process base priority class) */ + int disable_boost; /* disable thread priority boost */ int suspend; /* suspend count */ int dbg_hidden; /* hidden from debugger */ obj_handle_t desktop; /* desktop handle */