Home | History | Annotate | Download | only in pthreads-win32
      1 /*
      2  * sched_get_priority_max.c
      3  *
      4  * Description:
      5  * POSIX thread functions that deal with thread scheduling.
      6  *
      7  * --------------------------------------------------------------------------
      8  *
      9  *      Pthreads-win32 - POSIX Threads Library for Win32
     10  *      Copyright(C) 1998 John E. Bossom
     11  *      Copyright(C) 1999,2005 Pthreads-win32 contributors
     12  *
     13  *      Contact Email: rpj (at) callisto.canberra.edu.au
     14  *
     15  *      The current list of contributors is contained
     16  *      in the file CONTRIBUTORS included with the source
     17  *      code distribution. The list can also be seen at the
     18  *      following World Wide Web location:
     19  *      http://sources.redhat.com/pthreads-win32/contributors.html
     20  *
     21  *      This library is free software; you can redistribute it and/or
     22  *      modify it under the terms of the GNU Lesser General Public
     23  *      License as published by the Free Software Foundation; either
     24  *      version 2 of the License, or (at your option) any later version.
     25  *
     26  *      This library is distributed in the hope that it will be useful,
     27  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
     28  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     29  *      Lesser General Public License for more details.
     30  *
     31  *      You should have received a copy of the GNU Lesser General Public
     32  *      License along with this library in the file COPYING.LIB;
     33  *      if not, write to the Free Software Foundation, Inc.,
     34  *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
     35  */
     36 
     37 #include "pthread.h"
     38 #include "implement.h"
     39 #include "sched.h"
     40 
     41 /*
     42  * On Windows98, THREAD_PRIORITY_LOWEST is (-2) and
     43  * THREAD_PRIORITY_HIGHEST is 2, and everything works just fine.
     44  *
     45  * On WinCE 3.0, it so happen that THREAD_PRIORITY_LOWEST is 5
     46  * and THREAD_PRIORITY_HIGHEST is 1 (yes, I know, it is funny:
     47  * highest priority use smaller numbers) and the following happens:
     48  *
     49  * sched_get_priority_min() returns 5
     50  * sched_get_priority_max() returns 1
     51  *
     52  * The following table shows the base priority levels for combinations
     53  * of priority class and priority value in Win32.
     54  *
     55  *   Process Priority Class               Thread Priority Level
     56  *   -----------------------------------------------------------------
     57  *   1 IDLE_PRIORITY_CLASS                THREAD_PRIORITY_IDLE
     58  *   1 BELOW_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_IDLE
     59  *   1 NORMAL_PRIORITY_CLASS              THREAD_PRIORITY_IDLE
     60  *   1 ABOVE_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_IDLE
     61  *   1 HIGH_PRIORITY_CLASS                THREAD_PRIORITY_IDLE
     62  *   2 IDLE_PRIORITY_CLASS                THREAD_PRIORITY_LOWEST
     63  *   3 IDLE_PRIORITY_CLASS                THREAD_PRIORITY_BELOW_NORMAL
     64  *   4 IDLE_PRIORITY_CLASS                THREAD_PRIORITY_NORMAL
     65  *   4 BELOW_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_LOWEST
     66  *   5 IDLE_PRIORITY_CLASS                THREAD_PRIORITY_ABOVE_NORMAL
     67  *   5 BELOW_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_BELOW_NORMAL
     68  *   5 Background NORMAL_PRIORITY_CLASS   THREAD_PRIORITY_LOWEST
     69  *   6 IDLE_PRIORITY_CLASS                THREAD_PRIORITY_HIGHEST
     70  *   6 BELOW_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_NORMAL
     71  *   6 Background NORMAL_PRIORITY_CLASS   THREAD_PRIORITY_BELOW_NORMAL
     72  *   7 BELOW_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_ABOVE_NORMAL
     73  *   7 Background NORMAL_PRIORITY_CLASS   THREAD_PRIORITY_NORMAL
     74  *   7 Foreground NORMAL_PRIORITY_CLASS   THREAD_PRIORITY_LOWEST
     75  *   8 BELOW_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_HIGHEST
     76  *   8 NORMAL_PRIORITY_CLASS              THREAD_PRIORITY_ABOVE_NORMAL
     77  *   8 Foreground NORMAL_PRIORITY_CLASS   THREAD_PRIORITY_BELOW_NORMAL
     78  *   8 ABOVE_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_LOWEST
     79  *   9 NORMAL_PRIORITY_CLASS              THREAD_PRIORITY_HIGHEST
     80  *   9 Foreground NORMAL_PRIORITY_CLASS   THREAD_PRIORITY_NORMAL
     81  *   9 ABOVE_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_BELOW_NORMAL
     82  *  10 Foreground NORMAL_PRIORITY_CLASS   THREAD_PRIORITY_ABOVE_NORMAL
     83  *  10 ABOVE_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_NORMAL
     84  *  11 Foreground NORMAL_PRIORITY_CLASS   THREAD_PRIORITY_HIGHEST
     85  *  11 ABOVE_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_ABOVE_NORMAL
     86  *  11 HIGH_PRIORITY_CLASS                THREAD_PRIORITY_LOWEST
     87  *  12 ABOVE_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_HIGHEST
     88  *  12 HIGH_PRIORITY_CLASS                THREAD_PRIORITY_BELOW_NORMAL
     89  *  13 HIGH_PRIORITY_CLASS                THREAD_PRIORITY_NORMAL
     90  *  14 HIGH_PRIORITY_CLASS                THREAD_PRIORITY_ABOVE_NORMAL
     91  *  15 HIGH_PRIORITY_CLASS                THREAD_PRIORITY_HIGHEST
     92  *  15 HIGH_PRIORITY_CLASS                THREAD_PRIORITY_TIME_CRITICAL
     93  *  15 IDLE_PRIORITY_CLASS                THREAD_PRIORITY_TIME_CRITICAL
     94  *  15 BELOW_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_TIME_CRITICAL
     95  *  15 NORMAL_PRIORITY_CLASS              THREAD_PRIORITY_TIME_CRITICAL
     96  *  15 ABOVE_NORMAL_PRIORITY_CLASS        THREAD_PRIORITY_TIME_CRITICAL
     97  *  16 REALTIME_PRIORITY_CLASS            THREAD_PRIORITY_IDLE
     98  *  17 REALTIME_PRIORITY_CLASS            -7
     99  *  18 REALTIME_PRIORITY_CLASS            -6
    100  *  19 REALTIME_PRIORITY_CLASS            -5
    101  *  20 REALTIME_PRIORITY_CLASS            -4
    102  *  21 REALTIME_PRIORITY_CLASS            -3
    103  *  22 REALTIME_PRIORITY_CLASS            THREAD_PRIORITY_LOWEST
    104  *  23 REALTIME_PRIORITY_CLASS            THREAD_PRIORITY_BELOW_NORMAL
    105  *  24 REALTIME_PRIORITY_CLASS            THREAD_PRIORITY_NORMAL
    106  *  25 REALTIME_PRIORITY_CLASS            THREAD_PRIORITY_ABOVE_NORMAL
    107  *  26 REALTIME_PRIORITY_CLASS            THREAD_PRIORITY_HIGHEST
    108  *  27 REALTIME_PRIORITY_CLASS             3
    109  *  28 REALTIME_PRIORITY_CLASS             4
    110  *  29 REALTIME_PRIORITY_CLASS             5
    111  *  30 REALTIME_PRIORITY_CLASS             6
    112  *  31 REALTIME_PRIORITY_CLASS            THREAD_PRIORITY_TIME_CRITICAL
    113  *
    114  * Windows NT:  Values -7, -6, -5, -4, -3, 3, 4, 5, and 6 are not supported.
    115  */
    116 
    117 
    118 int
    119 sched_get_priority_max (int policy)
    120 {
    121   if (policy < SCHED_MIN || policy > SCHED_MAX)
    122     {
    123       errno = EINVAL;
    124       return -1;
    125     }
    126 
    127 #if (THREAD_PRIORITY_LOWEST > THREAD_PRIORITY_NORMAL)
    128   /* WinCE? */
    129   return PTW32_MAX (THREAD_PRIORITY_IDLE, THREAD_PRIORITY_TIME_CRITICAL);
    130 #else
    131   /* This is independent of scheduling policy in Win32. */
    132   return PTW32_MAX (THREAD_PRIORITY_IDLE, THREAD_PRIORITY_TIME_CRITICAL);
    133 #endif
    134 }
    135