VirtualBox

source: vbox/trunk/src/VBox/Runtime/r3/os2/sched-os2.cpp@ 5999

Last change on this file since 5999 was 5999, checked in by vboxsync, 17 years ago

The Giant CDDL Dual-License Header Change.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 8.8 KB
Line 
1/* $Id: sched-os2.cpp 5999 2007-12-07 15:05:06Z vboxsync $ */
2/** @file
3 * innotek Portable Runtime - Scheduling, OS/2
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
8 *
9 * innotek GmbH confidential
10 * All rights reserved
11 */
12
13/** @def OS2_SCHED_ENABLED
14 * Enables the priority scheme. */
15#define OS2_SCHED_ENABLED
16
17
18/*******************************************************************************
19* Header Files *
20*******************************************************************************/
21#define LOG_GROUP RTLOGGROUP_THREAD
22#define INCL_BASE
23#define INCL_ERRORS
24#include <os2.h>
25
26#include <iprt/thread.h>
27#include <iprt/log.h>
28#include <iprt/assert.h>
29#include <iprt/err.h>
30#include "internal/sched.h"
31#include "internal/thread.h"
32
33
34/*******************************************************************************
35* Structures and Typedefs *
36*******************************************************************************/
37/**
38 * Configuration of one priority.
39 */
40typedef struct
41{
42 /** The priority. */
43 RTPROCPRIORITY enmPriority;
44 /** The name of this priority. */
45 const char *pszName;
46 /** Array scheduler attributes corresponding to each of the thread types. */
47 struct
48 {
49 /** For sanity include the array index. */
50 RTTHREADTYPE enmType;
51 /** The OS/2 priority class. */
52 ULONG ulClass;
53 /** The OS/2 priority delta. */
54 ULONG ulDelta;
55 } aTypes[RTTHREADTYPE_END];
56} PROCPRIORITY;
57
58/** Matches any process priority class. */
59#define ANY_PROCESS_PRIORITY_CLASS (~0U)
60
61
62/*******************************************************************************
63* Global Variables *
64*******************************************************************************/
65/**
66 * Array of static priority configurations.
67 */
68static const PROCPRIORITY g_aPriorities[] =
69{
70 {
71 RTPROCPRIORITY_FLAT, "Flat",
72 {
73 { RTTHREADTYPE_INVALID, ~0, ~0 },
74 { RTTHREADTYPE_INFREQUENT_POLLER, PRTYC_REGULAR, 0 },
75 { RTTHREADTYPE_MAIN_HEAVY_WORKER, PRTYC_REGULAR, 0 },
76 { RTTHREADTYPE_EMULATION, PRTYC_REGULAR, 0 },
77 { RTTHREADTYPE_DEFAULT, PRTYC_REGULAR, 0 },
78 { RTTHREADTYPE_GUI, PRTYC_REGULAR, 0 },
79 { RTTHREADTYPE_MAIN_WORKER, PRTYC_REGULAR, 0 },
80 { RTTHREADTYPE_VRDP_IO, PRTYC_REGULAR, 0 },
81 { RTTHREADTYPE_DEBUGGER, PRTYC_REGULAR, 0 },
82 { RTTHREADTYPE_MSG_PUMP, PRTYC_REGULAR, 0 },
83 { RTTHREADTYPE_IO, PRTYC_REGULAR, 0 },
84 { RTTHREADTYPE_TIMER, PRTYC_REGULAR, 0 }
85 }
86 },
87 {
88 RTPROCPRIORITY_LOW, "Low",
89 {
90 { RTTHREADTYPE_INVALID, ~0 },
91 { RTTHREADTYPE_INFREQUENT_POLLER, PRTYC_IDLETIME, 0 },
92 { RTTHREADTYPE_MAIN_HEAVY_WORKER, PRTYC_IDLETIME, 0 },
93 { RTTHREADTYPE_EMULATION, PRTYC_IDLETIME, 0 },
94 { RTTHREADTYPE_DEFAULT, PRTYC_IDLETIME, 30 },
95 { RTTHREADTYPE_GUI, PRTYC_IDLETIME, 30 },
96 { RTTHREADTYPE_MAIN_WORKER, PRTYC_IDLETIME, 30 },
97 { RTTHREADTYPE_VRDP_IO, PRTYC_REGULAR, 0 },
98 { RTTHREADTYPE_DEBUGGER, PRTYC_REGULAR, 0 },
99 { RTTHREADTYPE_MSG_PUMP, PRTYC_REGULAR, 0 },
100 { RTTHREADTYPE_IO, PRTYC_REGULAR, 0 },
101 { RTTHREADTYPE_TIMER, PRTYC_REGULAR, 0 }
102 }
103 },
104 {
105 RTPROCPRIORITY_NORMAL, "Normal",
106 {
107 { RTTHREADTYPE_INVALID, ~0 },
108 { RTTHREADTYPE_INFREQUENT_POLLER, PRTYC_IDLETIME, 30 },
109 { RTTHREADTYPE_MAIN_HEAVY_WORKER, PRTYC_IDLETIME, 31 },
110 { RTTHREADTYPE_EMULATION, PRTYC_REGULAR, 0 },
111 { RTTHREADTYPE_DEFAULT, PRTYC_REGULAR, 5 },
112 { RTTHREADTYPE_GUI, PRTYC_REGULAR, 10 },
113 { RTTHREADTYPE_MAIN_WORKER, PRTYC_REGULAR, 12 },
114 { RTTHREADTYPE_VRDP_IO, PRTYC_REGULAR, 15 },
115 { RTTHREADTYPE_DEBUGGER, PRTYC_REGULAR, 20 },
116 { RTTHREADTYPE_MSG_PUMP, PRTYC_REGULAR, 25 },
117 { RTTHREADTYPE_IO, PRTYC_FOREGROUNDSERVER, 5 },
118 { RTTHREADTYPE_TIMER, PRTYC_TIMECRITICAL, 0 }
119 }
120 },
121 {
122 RTPROCPRIORITY_HIGH, "High",
123 {
124 { RTTHREADTYPE_INVALID, ~0 },
125 { RTTHREADTYPE_INFREQUENT_POLLER, PRTYC_IDLETIME, 30 },
126 { RTTHREADTYPE_MAIN_HEAVY_WORKER, PRTYC_REGULAR, 0 },
127 { RTTHREADTYPE_EMULATION, PRTYC_REGULAR, 0 },
128 { RTTHREADTYPE_DEFAULT, PRTYC_REGULAR, 15 },
129 { RTTHREADTYPE_GUI, PRTYC_REGULAR, 20 },
130 { RTTHREADTYPE_MAIN_WORKER, PRTYC_REGULAR, 25 },
131 { RTTHREADTYPE_VRDP_IO, PRTYC_REGULAR, 30 },
132 { RTTHREADTYPE_DEBUGGER, PRTYC_TIMECRITICAL, 2 },
133 { RTTHREADTYPE_MSG_PUMP, PRTYC_TIMECRITICAL, 3 },
134 { RTTHREADTYPE_IO, PRTYC_TIMECRITICAL, 4 },
135 { RTTHREADTYPE_TIMER, PRTYC_TIMECRITICAL, 5 }
136 }
137 }
138};
139
140/**
141 * The dynamic default priority configuration.
142 *
143 * This can be recalulated at runtime depending on what the
144 * system allow us to do. Presently we don't do this as it's
145 * generally not a bit issue on OS/2 hosts.
146 */
147static PROCPRIORITY g_aDefaultPriority =
148{
149 RTPROCPRIORITY_LOW, "Default",
150 {
151 { RTTHREADTYPE_INVALID, ~0 },
152 { RTTHREADTYPE_INFREQUENT_POLLER, PRTYC_IDLETIME, 30 },
153 { RTTHREADTYPE_MAIN_HEAVY_WORKER, PRTYC_IDLETIME, 31 },
154 { RTTHREADTYPE_EMULATION, PRTYC_REGULAR, 0 },
155 { RTTHREADTYPE_DEFAULT, PRTYC_REGULAR, 5 },
156 { RTTHREADTYPE_GUI, PRTYC_REGULAR, 10 },
157 { RTTHREADTYPE_MAIN_WORKER, PRTYC_REGULAR, 12 },
158 { RTTHREADTYPE_VRDP_IO, PRTYC_REGULAR, 15 },
159 { RTTHREADTYPE_DEBUGGER, PRTYC_REGULAR, 20 },
160 { RTTHREADTYPE_MSG_PUMP, PRTYC_REGULAR, 25 },
161 { RTTHREADTYPE_IO, PRTYC_FOREGROUNDSERVER, 5 },
162 { RTTHREADTYPE_TIMER, PRTYC_TIMECRITICAL, 0 }
163 }
164};
165
166
167/** Pointer to the current priority configuration. */
168static const PROCPRIORITY *g_pProcessPriority = &g_aDefaultPriority;
169
170
171/**
172 * Calculate the scheduling properties for all the threads in the default
173 * process priority, assuming the current thread have the type enmType.
174 *
175 * @returns iprt status code.
176 * @param enmType The thread type to be assumed for the current thread.
177 */
178int rtSchedNativeCalcDefaultPriority(RTTHREADTYPE enmType)
179{
180 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_END);
181 return VINF_SUCCESS;
182}
183
184
185/**
186 * Validates and sets the process priority.
187 * This will check that all rtThreadNativeSetPriority() will success for all the
188 * thread types when applied to the current thread.
189 *
190 * @returns iprt status code.
191 * @param enmPriority The priority to validate and set.
192 * @remark Located in sched.
193 */
194int rtProcNativeSetPriority(RTPROCPRIORITY enmPriority)
195{
196 Assert(enmPriority > RTPROCPRIORITY_INVALID && enmPriority < RTPROCPRIORITY_LAST);
197 return VINF_SUCCESS;
198}
199
200
201/**
202 * Sets the priority of the thread according to the thread type
203 * and current process priority.
204 *
205 * The RTTHREADINT::enmType member has not yet been updated and will be updated by
206 * the caller on a successful return.
207 *
208 * @returns iprt status code.
209 * @param pThread The thread in question.
210 * @param enmType The thread type.
211 * @remark Located in sched.
212 */
213int rtThreadNativeSetPriority(PRTTHREADINT pThread, RTTHREADTYPE enmType)
214{
215 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_END);
216 AssertMsg(g_pProcessPriority && g_pProcessPriority->aTypes[enmType].enmType == enmType,
217 ("enmType=%d entry=%d\n", enmType, g_pProcessPriority->aTypes[enmType].enmType));
218
219#ifdef OS2_SCHED_ENABLED
220 APIRET rc = DosSetPriority(PRTYS_THREAD, g_pProcessPriority->aTypes[enmType].ulClass, g_pProcessPriority->aTypes[enmType].ulDelta, (ULONG)pThread->Core.Key & 0xffff /*tid*/);
221 AssertMsg(rc == NO_ERROR, ("%d\n", rc));
222 return RTErrConvertFromOS2(rc);
223#else
224 return VINF_SUCCESS;
225#endif
226}
227
Note: See TracBrowser for help on using the repository browser.

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