server: Only commit SetThreadPriority if new priority is correct (try 3)

Matt Jones mattj at google.com
Thu Jul 19 18:42:15 CDT 2007


Change SetThreadPriority to correctly handle invalid priority values
-------------- next part --------------
From 40bcdbe07d2f5cc0e5de33512858625f940b9c8c Mon Sep 17 00:00:00 2001
From: Matt Jones <mattj at google.com>
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


More information about the wine-patches mailing list