From: Marc-Aurel Zent mzent@codeweavers.com
--- dlls/ntdll/unix/thread.c | 18 +++++++++++++----- server/protocol.def | 7 ++++--- server/thread.c | 3 +++ server/thread.h | 1 + 4 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c index 1dd7faecb14..995498f8ff7 100644 --- a/dlls/ntdll/unix/thread.c +++ b/dlls/ntdll/unix/thread.c @@ -2296,12 +2296,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 a47075f7543..9a9f1baba50 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1231,9 +1231,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 12b73d44353..29659d91f15 100644 --- a/server/thread.c +++ b/server/thread.c @@ -409,6 +409,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; @@ -1731,6 +1732,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 7fdae3a629f..03b0b547c2f 100644 --- a/server/thread.h +++ b/server/thread.h @@ -83,6 +83,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 */