Ok - I was using DWORD instead of int for min & max which made them unsigned. I've corrected that now and attached an updated version of both patches (also corrected my email address in the patch)
Thanks, Matt On 7/19/07, Robert Shearman <[EMAIL PROTECTED]> wrote:
Matt Jones wrote: > + if ((req->priority >= min || > + req->priority == THREAD_PRIORITY_IDLE) || > + (req->priority <= max || > + req->priority == THREAD_PRIORITY_TIME_CRITICAL)) > + thread->priority = req->priority; > + } > This doesn't look correct. There should be an && in there instead of one of the || operators. -- Rob Shearman
From e1d7448127d2f1eed7bae1141b365bb61bd25447 Mon Sep 17 00:00:00 2001 From: Matt Jones <[EMAIL PROTECTED]> Date: Tue, 17 Jul 2007 14:51:14 -0700 Subject: [PATCH] kernel32: Added SetThreadPriority tests, try 2 --- dlls/kernel32/tests/thread.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c index bbda00e..e6df213 100644 --- a/dlls/kernel32/tests/thread.c +++ b/dlls/kernel32/tests/thread.c @@ -588,6 +588,21 @@ #endif "GetThreadPriority Failed\n"); ok(SetThreadPriority(curthread,0)!=0,"SetThreadPriority Failed\n"); +/* Check that the thread priority is not changed if SetThreadPriority + is called with a value outside of the max/min range */ + SetThreadPriority(curthread,min_priority); + SetThreadPriority(curthread,min_priority-1); + todo_wine + ok(GetThreadPriority(curthread)==min_priority, + "GetThreadPriority didn't return min_priority\n"); + + SetThreadPriority(curthread,max_priority); + SetThreadPriority(curthread,max_priority+1); + todo_wine + ok(GetThreadPriority(curthread)==max_priority, + "GetThreadPriority didn't return max_priority\n"); + + /* Check thread priority boost */ if (!pGetThreadPriorityBoost || !pSetThreadPriorityBoost) return; /* Win9x */ -- 1.4.1
From 40bcdbe07d2f5cc0e5de33512858625f940b9c8c Mon Sep 17 00:00:00 2001 From: Matt Jones <[EMAIL PROTECTED]> Date: Tue, 17 Jul 2007 14:58:01 -0700 Subject: [PATCH] server: Conform to SetThreadPriority check (only set priority if the new priority is valid), try 2 --- dlls/kernel32/tests/thread.c | 2 -- server/thread.c | 19 ++++++++++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c index e6df213..60c801a 100644 --- a/dlls/kernel32/tests/thread.c +++ b/dlls/kernel32/tests/thread.c @@ -592,13 +592,11 @@ #endif is called with a value outside of the max/min range */ SetThreadPriority(curthread,min_priority); SetThreadPriority(curthread,min_priority-1); - todo_wine ok(GetThreadPriority(curthread)==min_priority, "GetThreadPriority didn't return min_priority\n"); SetThreadPriority(curthread,max_priority); SetThreadPriority(curthread,max_priority+1); - todo_wine ok(GetThreadPriority(curthread)==max_priority, "GetThreadPriority didn't return max_priority\n"); diff --git a/server/thread.c b/server/thread.c index 62d50b5..49ecdf4 100644 --- a/server/thread.c +++ b/server/thread.c @@ -383,12 +383,29 @@ struct thread *get_thread_from_pid( int return NULL; } +#define THREAD_PRIORITY_REALTIME_HIGHEST 6 +#define THREAD_PRIORITY_REALTIME_LOWEST -7 + /* set all information about a thread */ static void set_thread_info( struct thread *thread, const struct set_thread_info_request *req ) { if (req->mask & SET_THREAD_INFO_PRIORITY) - thread->priority = req->priority; + { + int max = THREAD_PRIORITY_HIGHEST; + int min = THREAD_PRIORITY_LOWEST; + if (thread->process->priority == PROCESS_PRIOCLASS_REALTIME) + { + max = THREAD_PRIORITY_REALTIME_HIGHEST; + min = THREAD_PRIORITY_REALTIME_LOWEST; + } + + if ((req->priority >= min || + req->priority == THREAD_PRIORITY_IDLE) && + (req->priority <= max || + req->priority == THREAD_PRIORITY_TIME_CRITICAL)) + thread->priority = req->priority; + } if (req->mask & SET_THREAD_INFO_AFFINITY) { if (req->affinity != 1) set_error( STATUS_INVALID_PARAMETER ); -- 1.4.1