VirtualBox

Changeset 5653 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Nov 9, 2007 3:03:53 PM (17 years ago)
Author:
vboxsync
Message:

sched-os2.cpp

Location:
trunk/src/VBox/Runtime
Files:
1 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/Makefile.kmk

    r5555 r5653  
    298298        generic/RTTimeLocalNow-generic.cpp \
    299299        generic/RTTimerCreate-generic.cpp \
    300         generic/sched-generic.cpp \
    301300        generic/semnoint-generic.cpp \
    302301        generic/semsrw-generic.cpp \
     
    305304        generic/uuid-generic.cpp \
    306305        os2/RTErrConvertFromOS2.cpp \
     306        r3/os2/sched-os2.cpp \
    307307        r3/os2/sems-os2.cpp \
    308308        r3/os2/system-os2.cpp \
  • trunk/src/VBox/Runtime/r3/os2/sched-os2.cpp

    r5594 r5653  
    11/* $Id$ */
    22/** @file
    3  * innotek Portable Runtime - Scheduling, Win32.
     3 * innotek Portable Runtime - Scheduling, OS/2
    44 */
    55
     
    1616 */
    1717
    18 /** @def WIN32_SCHED_ENABLED
     18/** @def OS2_SCHED_ENABLED
    1919 * Enables the priority scheme. */
    20 #define WIN32_SCHED_ENABLED
     20#define OS2_SCHED_ENABLED
    2121
    2222
     
    2525*******************************************************************************/
    2626#define LOG_GROUP RTLOGGROUP_THREAD
    27 #include <Windows.h>
     27#define INCL_BASE
     28#define INCL_ERRORS
     29#include <os2.h>
    2830
    2931#include <iprt/thread.h>
     
    4749    /** The name of this priority. */
    4850    const char     *pszName;
    49     /** The Win32 process priority class. If ANY_PROCESS_PRIORITY_CLASS the
    50      * process priority class is left unchanged. */
    51     DWORD dwProcessPriorityClass;
    5251    /** Array scheduler attributes corresponding to each of the thread types. */
    5352    struct
     
    5554        /** For sanity include the array index. */
    5655        RTTHREADTYPE    enmType;
    57         /** The Win32 thread priority. */
    58         DWORD           dwThreadPriority;
     56        /** The OS/2 priority class. */
     57        ULONG           ulClass;
     58        /** The OS/2 priority delta. */
     59        ULONG           ulDelta;
    5960    } aTypes[RTTHREADTYPE_END];
    6061} PROCPRIORITY;
     
    7374{
    7475    {
    75         RTPROCPRIORITY_FLAT, "Flat", ANY_PROCESS_PRIORITY_CLASS,
     76        RTPROCPRIORITY_FLAT, "Flat",
     77        {
     78            { RTTHREADTYPE_INVALID,                 ~0, ~0 },
     79            { RTTHREADTYPE_INFREQUENT_POLLER,       PRTYC_REGULAR, 0 },
     80            { RTTHREADTYPE_MAIN_HEAVY_WORKER,       PRTYC_REGULAR, 0 },
     81            { RTTHREADTYPE_EMULATION,               PRTYC_REGULAR, 0 },
     82            { RTTHREADTYPE_DEFAULT,                 PRTYC_REGULAR, 0 },
     83            { RTTHREADTYPE_GUI,                     PRTYC_REGULAR, 0 },
     84            { RTTHREADTYPE_MAIN_WORKER,             PRTYC_REGULAR, 0 },
     85            { RTTHREADTYPE_VRDP_IO,                 PRTYC_REGULAR, 0 },
     86            { RTTHREADTYPE_DEBUGGER,                PRTYC_REGULAR, 0 },
     87            { RTTHREADTYPE_MSG_PUMP,                PRTYC_REGULAR, 0 },
     88            { RTTHREADTYPE_IO,                      PRTYC_REGULAR, 0 },
     89            { RTTHREADTYPE_TIMER,                   PRTYC_REGULAR, 0 }
     90        }
     91    },
     92    {
     93        RTPROCPRIORITY_LOW, "Low",
    7694        {
    7795            { RTTHREADTYPE_INVALID,                 ~0 },
    78             { RTTHREADTYPE_INFREQUENT_POLLER,       THREAD_PRIORITY_NORMAL },
    79             { RTTHREADTYPE_MAIN_HEAVY_WORKER,       THREAD_PRIORITY_NORMAL },
    80             { RTTHREADTYPE_EMULATION,               THREAD_PRIORITY_NORMAL },
    81             { RTTHREADTYPE_DEFAULT,                 THREAD_PRIORITY_NORMAL },
    82             { RTTHREADTYPE_GUI,                     THREAD_PRIORITY_NORMAL },
    83             { RTTHREADTYPE_MAIN_WORKER,             THREAD_PRIORITY_NORMAL },
    84             { RTTHREADTYPE_VRDP_IO,                 THREAD_PRIORITY_NORMAL },
    85             { RTTHREADTYPE_DEBUGGER,                THREAD_PRIORITY_NORMAL },
    86             { RTTHREADTYPE_MSG_PUMP,                THREAD_PRIORITY_NORMAL },
    87             { RTTHREADTYPE_IO,                      THREAD_PRIORITY_NORMAL },
    88             { RTTHREADTYPE_TIMER,                   THREAD_PRIORITY_NORMAL }
     96            { RTTHREADTYPE_INFREQUENT_POLLER,       PRTYC_IDLETIME, 0 },
     97            { RTTHREADTYPE_MAIN_HEAVY_WORKER,       PRTYC_IDLETIME, 0 },
     98            { RTTHREADTYPE_EMULATION,               PRTYC_IDLETIME, 0 },
     99            { RTTHREADTYPE_DEFAULT,                 PRTYC_IDLETIME, 30 },
     100            { RTTHREADTYPE_GUI,                     PRTYC_IDLETIME, 30 },
     101            { RTTHREADTYPE_MAIN_WORKER,             PRTYC_IDLETIME, 30 },
     102            { RTTHREADTYPE_VRDP_IO,                 PRTYC_REGULAR,  0 },
     103            { RTTHREADTYPE_DEBUGGER,                PRTYC_REGULAR,  0 },
     104            { RTTHREADTYPE_MSG_PUMP,                PRTYC_REGULAR,  0 },
     105            { RTTHREADTYPE_IO,                      PRTYC_REGULAR,  0 },
     106            { RTTHREADTYPE_TIMER,                   PRTYC_REGULAR,  0 }
    89107        }
    90108    },
    91109    {
    92         RTPROCPRIORITY_LOW, "Low - Below Normal", BELOW_NORMAL_PRIORITY_CLASS,
     110        RTPROCPRIORITY_NORMAL, "Normal",
    93111        {
    94112            { RTTHREADTYPE_INVALID,                 ~0 },
    95             { RTTHREADTYPE_INFREQUENT_POLLER,       THREAD_PRIORITY_LOWEST },
    96             { RTTHREADTYPE_MAIN_HEAVY_WORKER,       THREAD_PRIORITY_BELOW_NORMAL },
    97             { RTTHREADTYPE_EMULATION,               THREAD_PRIORITY_NORMAL },
    98             { RTTHREADTYPE_DEFAULT,                 THREAD_PRIORITY_NORMAL },
    99             { RTTHREADTYPE_GUI,                     THREAD_PRIORITY_NORMAL },
    100             { RTTHREADTYPE_MAIN_WORKER,             THREAD_PRIORITY_NORMAL },
    101             { RTTHREADTYPE_VRDP_IO,                 THREAD_PRIORITY_ABOVE_NORMAL },
    102             { RTTHREADTYPE_DEBUGGER,                THREAD_PRIORITY_ABOVE_NORMAL },
    103             { RTTHREADTYPE_MSG_PUMP,                THREAD_PRIORITY_ABOVE_NORMAL },
    104             { RTTHREADTYPE_IO,                      THREAD_PRIORITY_HIGHEST },
    105             { RTTHREADTYPE_TIMER,                   THREAD_PRIORITY_HIGHEST }
     113            { RTTHREADTYPE_INFREQUENT_POLLER,       PRTYC_IDLETIME, 30 },
     114            { RTTHREADTYPE_MAIN_HEAVY_WORKER,       PRTYC_IDLETIME, 31 },
     115            { RTTHREADTYPE_EMULATION,               PRTYC_REGULAR,  0 },
     116            { RTTHREADTYPE_DEFAULT,                 PRTYC_REGULAR,  5 },
     117            { RTTHREADTYPE_GUI,                     PRTYC_REGULAR,  10 },
     118            { RTTHREADTYPE_MAIN_WORKER,             PRTYC_REGULAR,  12 },
     119            { RTTHREADTYPE_VRDP_IO,                 PRTYC_REGULAR,  15 },
     120            { RTTHREADTYPE_DEBUGGER,                PRTYC_REGULAR,  20 },
     121            { RTTHREADTYPE_MSG_PUMP,                PRTYC_REGULAR,  25 },
     122            { RTTHREADTYPE_IO,                      PRTYC_FOREGROUNDSERVER,  5 },
     123            { RTTHREADTYPE_TIMER,                   PRTYC_TIMECRITICAL, 0 }
    106124        }
    107125    },
    108126    {
    109         RTPROCPRIORITY_LOW, "Low", ANY_PROCESS_PRIORITY_CLASS,
     127        RTPROCPRIORITY_HIGH, "High",
    110128        {
    111129            { RTTHREADTYPE_INVALID,                 ~0 },
    112             { RTTHREADTYPE_INFREQUENT_POLLER,       THREAD_PRIORITY_LOWEST },
    113             { RTTHREADTYPE_MAIN_HEAVY_WORKER,       THREAD_PRIORITY_LOWEST },
    114             { RTTHREADTYPE_EMULATION,               THREAD_PRIORITY_LOWEST },
    115             { RTTHREADTYPE_DEFAULT,                 THREAD_PRIORITY_BELOW_NORMAL },
    116             { RTTHREADTYPE_GUI,                     THREAD_PRIORITY_BELOW_NORMAL },
    117             { RTTHREADTYPE_MAIN_WORKER,             THREAD_PRIORITY_BELOW_NORMAL },
    118             { RTTHREADTYPE_VRDP_IO,                 THREAD_PRIORITY_NORMAL },
    119             { RTTHREADTYPE_DEBUGGER,                THREAD_PRIORITY_NORMAL },
    120             { RTTHREADTYPE_MSG_PUMP,                THREAD_PRIORITY_NORMAL },
    121             { RTTHREADTYPE_IO,                      THREAD_PRIORITY_NORMAL },
    122             { RTTHREADTYPE_TIMER,                   THREAD_PRIORITY_NORMAL }
    123         }
    124     },
    125     {
    126         RTPROCPRIORITY_NORMAL, "Normal - Normal", NORMAL_PRIORITY_CLASS,
    127         {
    128             { RTTHREADTYPE_INVALID,                 ~0 },
    129             { RTTHREADTYPE_INFREQUENT_POLLER,       THREAD_PRIORITY_LOWEST },
    130             { RTTHREADTYPE_MAIN_HEAVY_WORKER,       THREAD_PRIORITY_LOWEST },
    131             { RTTHREADTYPE_EMULATION,               THREAD_PRIORITY_BELOW_NORMAL },
    132             { RTTHREADTYPE_DEFAULT,                 THREAD_PRIORITY_NORMAL },
    133             { RTTHREADTYPE_GUI,                     THREAD_PRIORITY_NORMAL },
    134             { RTTHREADTYPE_MAIN_WORKER,             THREAD_PRIORITY_NORMAL },
    135             { RTTHREADTYPE_VRDP_IO,                 THREAD_PRIORITY_ABOVE_NORMAL },
    136             { RTTHREADTYPE_DEBUGGER,                THREAD_PRIORITY_ABOVE_NORMAL },
    137             { RTTHREADTYPE_MSG_PUMP,                THREAD_PRIORITY_ABOVE_NORMAL },
    138             { RTTHREADTYPE_IO,                      THREAD_PRIORITY_ABOVE_NORMAL },
    139             { RTTHREADTYPE_TIMER,                   THREAD_PRIORITY_HIGHEST }
    140         }
    141     },
    142     {
    143         RTPROCPRIORITY_NORMAL, "Normal", ANY_PROCESS_PRIORITY_CLASS,
    144         {
    145             { RTTHREADTYPE_INVALID,                 ~0 },
    146             { RTTHREADTYPE_INFREQUENT_POLLER,       THREAD_PRIORITY_LOWEST },
    147             { RTTHREADTYPE_MAIN_HEAVY_WORKER,       THREAD_PRIORITY_LOWEST },
    148             { RTTHREADTYPE_EMULATION,               THREAD_PRIORITY_BELOW_NORMAL },
    149             { RTTHREADTYPE_DEFAULT,                 THREAD_PRIORITY_NORMAL },
    150             { RTTHREADTYPE_GUI,                     THREAD_PRIORITY_NORMAL },
    151             { RTTHREADTYPE_MAIN_WORKER,             THREAD_PRIORITY_NORMAL },
    152             { RTTHREADTYPE_VRDP_IO,                 THREAD_PRIORITY_ABOVE_NORMAL },
    153             { RTTHREADTYPE_DEBUGGER,                THREAD_PRIORITY_ABOVE_NORMAL },
    154             { RTTHREADTYPE_MSG_PUMP,                THREAD_PRIORITY_ABOVE_NORMAL },
    155             { RTTHREADTYPE_IO,                      THREAD_PRIORITY_ABOVE_NORMAL },
    156             { RTTHREADTYPE_TIMER,                   THREAD_PRIORITY_HIGHEST }
    157         }
    158     },
    159     {
    160         RTPROCPRIORITY_HIGH, "High - High", HIGH_PRIORITY_CLASS,
    161         {
    162             { RTTHREADTYPE_INVALID,                 ~0 },
    163             { RTTHREADTYPE_INFREQUENT_POLLER,       THREAD_PRIORITY_LOWEST },
    164             { RTTHREADTYPE_MAIN_HEAVY_WORKER,       THREAD_PRIORITY_LOWEST },
    165             { RTTHREADTYPE_EMULATION,               THREAD_PRIORITY_BELOW_NORMAL },
    166             { RTTHREADTYPE_DEFAULT,                 THREAD_PRIORITY_NORMAL },
    167             { RTTHREADTYPE_GUI,                     THREAD_PRIORITY_NORMAL },
    168             { RTTHREADTYPE_MAIN_WORKER,             THREAD_PRIORITY_NORMAL },
    169             { RTTHREADTYPE_VRDP_IO,                 THREAD_PRIORITY_ABOVE_NORMAL },
    170             { RTTHREADTYPE_DEBUGGER,                THREAD_PRIORITY_ABOVE_NORMAL },
    171             { RTTHREADTYPE_MSG_PUMP,                THREAD_PRIORITY_ABOVE_NORMAL },
    172             { RTTHREADTYPE_IO,                      THREAD_PRIORITY_HIGHEST },
    173             { RTTHREADTYPE_TIMER,                   THREAD_PRIORITY_HIGHEST }
    174         }
    175     },
    176     {
    177         RTPROCPRIORITY_HIGH, "High - Above Normal", ABOVE_NORMAL_PRIORITY_CLASS,
    178         {
    179             { RTTHREADTYPE_INVALID,                 ~0 },
    180             { RTTHREADTYPE_INFREQUENT_POLLER,       THREAD_PRIORITY_LOWEST },
    181             { RTTHREADTYPE_MAIN_HEAVY_WORKER,       THREAD_PRIORITY_LOWEST },
    182             { RTTHREADTYPE_EMULATION,               THREAD_PRIORITY_BELOW_NORMAL },
    183             { RTTHREADTYPE_DEFAULT,                 THREAD_PRIORITY_NORMAL },
    184             { RTTHREADTYPE_GUI,                     THREAD_PRIORITY_NORMAL },
    185             { RTTHREADTYPE_MAIN_WORKER,             THREAD_PRIORITY_NORMAL },
    186             { RTTHREADTYPE_VRDP_IO,                 THREAD_PRIORITY_ABOVE_NORMAL },
    187             { RTTHREADTYPE_DEBUGGER,                THREAD_PRIORITY_ABOVE_NORMAL },
    188             { RTTHREADTYPE_MSG_PUMP,                THREAD_PRIORITY_ABOVE_NORMAL },
    189             { RTTHREADTYPE_IO,                      THREAD_PRIORITY_HIGHEST },
    190             { RTTHREADTYPE_TIMER,                   THREAD_PRIORITY_HIGHEST }
    191         }
    192     },
    193     {
    194         RTPROCPRIORITY_HIGH, "High", ANY_PROCESS_PRIORITY_CLASS,
    195         {
    196             { RTTHREADTYPE_INVALID,                 ~0 },
    197             { RTTHREADTYPE_INFREQUENT_POLLER,       THREAD_PRIORITY_BELOW_NORMAL },
    198             { RTTHREADTYPE_MAIN_HEAVY_WORKER,       THREAD_PRIORITY_NORMAL },
    199             { RTTHREADTYPE_EMULATION,               THREAD_PRIORITY_NORMAL },
    200             { RTTHREADTYPE_DEFAULT,                 THREAD_PRIORITY_ABOVE_NORMAL },
    201             { RTTHREADTYPE_GUI,                     THREAD_PRIORITY_ABOVE_NORMAL },
    202             { RTTHREADTYPE_MAIN_WORKER,             THREAD_PRIORITY_ABOVE_NORMAL },
    203             { RTTHREADTYPE_VRDP_IO,                 THREAD_PRIORITY_ABOVE_NORMAL },
    204             { RTTHREADTYPE_DEBUGGER,                THREAD_PRIORITY_HIGHEST },
    205             { RTTHREADTYPE_MSG_PUMP,                THREAD_PRIORITY_HIGHEST },
    206             { RTTHREADTYPE_IO,                      THREAD_PRIORITY_HIGHEST },
    207             { RTTHREADTYPE_TIMER,                   THREAD_PRIORITY_HIGHEST }
     130            { RTTHREADTYPE_INFREQUENT_POLLER,       PRTYC_IDLETIME, 30 },
     131            { RTTHREADTYPE_MAIN_HEAVY_WORKER,       PRTYC_REGULAR,  0 },
     132            { RTTHREADTYPE_EMULATION,               PRTYC_REGULAR,  0 },
     133            { RTTHREADTYPE_DEFAULT,                 PRTYC_REGULAR,  15 },
     134            { RTTHREADTYPE_GUI,                     PRTYC_REGULAR,  20 },
     135            { RTTHREADTYPE_MAIN_WORKER,             PRTYC_REGULAR,  25 },
     136            { RTTHREADTYPE_VRDP_IO,                 PRTYC_REGULAR,  30 },
     137            { RTTHREADTYPE_DEBUGGER,                PRTYC_TIMECRITICAL, 2 },
     138            { RTTHREADTYPE_MSG_PUMP,                PRTYC_TIMECRITICAL, 3 },
     139            { RTTHREADTYPE_IO,                      PRTYC_TIMECRITICAL, 4 },
     140            { RTTHREADTYPE_TIMER,                   PRTYC_TIMECRITICAL, 5 }
    208141        }
    209142    }
     
    215148 * This can be recalulated at runtime depending on what the
    216149 * system allow us to do. Presently we don't do this as it's
    217  * generally not a bit issue on Win32 hosts.
     150 * generally not a bit issue on OS/2 hosts.
    218151 */
    219152static PROCPRIORITY g_aDefaultPriority =
    220153{
    221     RTPROCPRIORITY_LOW, "Default", ANY_PROCESS_PRIORITY_CLASS,
     154    RTPROCPRIORITY_LOW, "Default",
    222155    {
    223156        { RTTHREADTYPE_INVALID,                 ~0 },
    224         { RTTHREADTYPE_INFREQUENT_POLLER,       THREAD_PRIORITY_LOWEST },
    225         { RTTHREADTYPE_MAIN_HEAVY_WORKER,       THREAD_PRIORITY_BELOW_NORMAL },
    226         { RTTHREADTYPE_EMULATION,               THREAD_PRIORITY_NORMAL },
    227         { RTTHREADTYPE_DEFAULT,                 THREAD_PRIORITY_NORMAL },
    228         { RTTHREADTYPE_GUI,                     THREAD_PRIORITY_NORMAL },
    229         { RTTHREADTYPE_MAIN_WORKER,             THREAD_PRIORITY_NORMAL },
    230         { RTTHREADTYPE_VRDP_IO,                 THREAD_PRIORITY_NORMAL },
    231         { RTTHREADTYPE_DEBUGGER,                THREAD_PRIORITY_ABOVE_NORMAL },
    232         { RTTHREADTYPE_MSG_PUMP,                THREAD_PRIORITY_ABOVE_NORMAL },
    233         { RTTHREADTYPE_IO,                      THREAD_PRIORITY_HIGHEST },
    234         { RTTHREADTYPE_TIMER,                   THREAD_PRIORITY_HIGHEST }
     157        { RTTHREADTYPE_INFREQUENT_POLLER,       PRTYC_IDLETIME, 30 },
     158        { RTTHREADTYPE_MAIN_HEAVY_WORKER,       PRTYC_IDLETIME, 31 },
     159        { RTTHREADTYPE_EMULATION,               PRTYC_REGULAR,  0 },
     160        { RTTHREADTYPE_DEFAULT,                 PRTYC_REGULAR,  5 },
     161        { RTTHREADTYPE_GUI,                     PRTYC_REGULAR,  10 },
     162        { RTTHREADTYPE_MAIN_WORKER,             PRTYC_REGULAR,  12 },
     163        { RTTHREADTYPE_VRDP_IO,                 PRTYC_REGULAR,  15 },
     164        { RTTHREADTYPE_DEBUGGER,                PRTYC_REGULAR,  20 },
     165        { RTTHREADTYPE_MSG_PUMP,                PRTYC_REGULAR,  25 },
     166        { RTTHREADTYPE_IO,                      PRTYC_FOREGROUNDSERVER, 5 },
     167        { RTTHREADTYPE_TIMER,                   PRTYC_TIMECRITICAL, 0 }
    235168    }
    236169};
     
    268201    Assert(enmPriority > RTPROCPRIORITY_INVALID && enmPriority < RTPROCPRIORITY_LAST);
    269202    return VINF_SUCCESS;
    270 }
    271 
    272 
    273 /**
    274  * Gets the win32 thread handle.
    275  *
    276  * @returns Valid win32 handle for the specified thread.
    277  * @param   pThread     The thread.
    278  */
    279 inline HANDLE rtThreadNativeGetHandle(PRTTHREADINT pThread)
    280 {
    281     if ((uintptr_t)pThread->Core.Key == GetCurrentThreadId())
    282         return GetCurrentThread();
    283     return (HANDLE)pThread->hThread;
    284203}
    285204
     
    303222              ("enmType=%d entry=%d\n", enmType, g_pProcessPriority->aTypes[enmType].enmType));
    304223
    305 #ifdef WIN32_SCHED_ENABLED
    306     if (SetThreadPriority(rtThreadNativeGetHandle(pThread), g_pProcessPriority->aTypes[enmType].dwThreadPriority))
    307         return VINF_SUCCESS;
    308 
    309     DWORD dwLastError = GetLastError();
    310     int rc = RTErrConvertFromWin32(dwLastError);
    311     AssertMsgFailed(("SetThreadPriority(%p, %d) failed, dwLastError=%d rc=%Vrc\n",
    312                      rtThreadNativeGetHandle(pThread), g_pProcessPriority->aTypes[enmType].dwThreadPriority, dwLastError, rc));
    313     return rc;
     224#ifdef OS2_SCHED_ENABLED
     225    APIRET rc = DosSetPriority(PRTYS_THREAD, g_pProcessPriority->aTypes[enmType].ulClass, g_pProcessPriority->aTypes[enmType].ulDelta, (ULONG)pThread->Core.Key & 0xffff /*tid*/);
     226    AssertMsg(rc == NO_ERROR, ("%d\n", rc));
     227    return RTErrConvertFromOS2(rc);
    314228#else
    315229    return VINF_SUCCESS;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette