2 //=============================================================================
4 * @file Sched_Params.cpp
8 //=============================================================================
11 #include "ace/Sched_Params.h"
13 #if !defined (__ACE_INLINE__)
14 #include "ace/Sched_Params.inl"
15 #endif /* __ACE_INLINE__ */
17 #if defined (ACE_HAS_PRIOCNTL) && defined (ACE_HAS_STHREADS)
18 # include "ace/OS_NS_string.h"
19 # include /**/ <sys/priocntl.h>
20 #endif /* ACE_HAS_PRIOCNTL && ACE_HAS_THREADS */
24 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
27 ACE_Sched_Params::priority_min (const Policy policy
,
30 #if defined (ACE_HAS_PRIOCNTL) && defined (ACE_HAS_STHREADS)
31 ACE_UNUSED_ARG (scope
);
33 // Assume that ACE_SCHED_OTHER indicates TS class, and that other
34 // policies indicate RT class.
36 // Call ACE_OS::priority_control only for processes (lightweight
37 // or otherwise). Calling ACE_OS::priority_control for thread
38 // priorities gives incorrect results.
39 if (scope
== ACE_SCOPE_PROCESS
|| scope
== ACE_SCOPE_LWP
)
41 if (policy
== ACE_SCHED_OTHER
)
43 // Get the priority class ID and attributes.
45 // The following is just to avoid Purify warnings about unitialized
47 ACE_OS::memset (&pcinfo
, 0, sizeof pcinfo
);
48 ACE_OS::strcpy (pcinfo
.pc_clname
, "TS");
50 if (ACE_OS::priority_control (P_ALL
/* ignored */,
53 (char *) &pcinfo
) == -1)
54 // Just hope that priority range wasn't configured from -1
58 // OK, now we've got the class ID in pcinfo.pc_cid. In
59 // addition, the maximum configured time-share priority is in
60 // ((tsinfo_t *) pcinfo.pc_clinfo)->ts_maxupri. The minimum
61 // priority is just the negative of that.
63 return -((tsinfo_t
*) pcinfo
.pc_clinfo
)->ts_maxupri
;
70 // Here we handle the case for ACE_SCOPE_THREAD. Calling
71 // ACE_OS::priority_control for thread scope gives incorrect
76 return ACE_THR_PRI_FIFO_MIN
;
78 return ACE_THR_PRI_RR_MIN
;
81 return ACE_THR_PRI_OTHER_MIN
;
84 #elif defined(ACE_HAS_PTHREADS) && \
85 (!defined(ACE_LACKS_SETSCHED))
88 case ACE_SCOPE_THREAD
:
92 return ACE_THR_PRI_FIFO_MIN
;
94 return ACE_THR_PRI_RR_MIN
;
97 return ACE_THR_PRI_OTHER_MIN
;
100 case ACE_SCOPE_PROCESS
:
105 return ACE_PROC_PRI_FIFO_MIN
;
107 return ACE_PROC_PRI_RR_MIN
;
108 case ACE_SCHED_OTHER
:
110 return ACE_PROC_PRI_OTHER_MIN
;
114 #elif defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
115 ACE_UNUSED_ARG (policy
);
116 ACE_UNUSED_ARG (scope
);
117 return THREAD_PRIORITY_IDLE
;
118 #elif defined (ACE_HAS_WTHREADS) && defined (ACE_HAS_WINCE)
119 ACE_UNUSED_ARG (policy
);
120 ACE_UNUSED_ARG (scope
);
122 #elif defined (ACE_VXWORKS)
123 ACE_UNUSED_ARG (policy
);
124 ACE_UNUSED_ARG (scope
);
125 # if defined (VX_TASK_PRIORITY_MAX)
126 return VX_TASK_PRIORITY_MAX
;
131 ACE_UNUSED_ARG (policy
);
132 ACE_UNUSED_ARG (scope
);
133 ACE_NOTSUP_RETURN (-1);
134 #endif /* ACE_HAS_PRIOCNTL && defined (ACE_HAS_STHREADS) */
138 ACE_Sched_Params::priority_max (const Policy policy
,
141 #if defined (ACE_HAS_PRIOCNTL) && defined (ACE_HAS_STHREADS)
142 ACE_UNUSED_ARG (scope
);
144 // Call ACE_OS::priority_control only for processes (lightweight
145 // or otherwise). Calling ACE_OS::priority_control for thread
146 // priorities gives incorrect results.
147 if (scope
== ACE_SCOPE_PROCESS
|| scope
== ACE_SCOPE_LWP
)
149 // Assume that ACE_SCHED_OTHER indicates TS class, and that other
150 // policies indicate RT class.
152 // Get the priority class ID and attributes.
154 // The following is just to avoid Purify warnings about unitialized
156 ACE_OS::memset (&pcinfo
, 0, sizeof pcinfo
);
157 ACE_OS::strcpy (pcinfo
.pc_clname
,
158 policy
== ACE_SCHED_OTHER
? "TS" : "RT");
160 if (ACE_OS::priority_control (P_ALL
/* ignored */,
161 P_MYID
/* ignored */,
163 (char *) &pcinfo
) == -1)
166 // OK, now we've got the class ID in pcinfo.pc_cid. In addition,
167 // the maximum configured real-time priority is in ((rtinfo_t *)
168 // pcinfo.pc_clinfo)->rt_maxpri, or similarly for the TS class.
170 return policy
== ACE_SCHED_OTHER
171 ? ((tsinfo_t
*) pcinfo
.pc_clinfo
)->ts_maxupri
172 : ((rtinfo_t
*) pcinfo
.pc_clinfo
)->rt_maxpri
;
176 // Here we handle the case for ACE_SCOPE_THREAD. Calling
177 // ACE_OS::priority_control for thread scope gives incorrect
182 return ACE_THR_PRI_FIFO_MAX
;
184 return ACE_THR_PRI_RR_MAX
;
185 case ACE_SCHED_OTHER
:
187 return ACE_THR_PRI_OTHER_MAX
;
190 #elif defined(ACE_HAS_PTHREADS) && \
191 (!defined(ACE_LACKS_SETSCHED) || \
192 defined (ACE_HAS_PTHREAD_SCHEDPARAM))
196 case ACE_SCOPE_THREAD
:
200 return ACE_THR_PRI_FIFO_MAX
;
202 return ACE_THR_PRI_RR_MAX
;
203 case ACE_SCHED_OTHER
:
205 return ACE_THR_PRI_OTHER_MAX
;
208 case ACE_SCOPE_PROCESS
:
213 return ACE_PROC_PRI_FIFO_MAX
;
215 return ACE_PROC_PRI_RR_MAX
;
216 case ACE_SCHED_OTHER
:
218 return ACE_PROC_PRI_OTHER_MAX
;
222 #elif defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
223 ACE_UNUSED_ARG (policy
);
224 ACE_UNUSED_ARG (scope
);
225 return THREAD_PRIORITY_TIME_CRITICAL
;
226 #elif defined (ACE_HAS_WTHREADS) && defined (ACE_HAS_WINCE)
227 ACE_UNUSED_ARG (policy
);
228 ACE_UNUSED_ARG (scope
);
230 #elif defined (ACE_VXWORKS)
231 ACE_UNUSED_ARG (policy
);
232 ACE_UNUSED_ARG (scope
);
233 # if defined (VX_TASK_PRIORITY_MIN)
234 return VX_TASK_PRIORITY_MIN
;
239 ACE_UNUSED_ARG (policy
);
240 ACE_UNUSED_ARG (scope
);
241 ACE_NOTSUP_RETURN (-1);
242 #endif /* ACE_HAS_PRIOCNTL && defined (ACE_HAS_STHREADS) */
246 ACE_Sched_Params::next_priority (const Policy policy
,
250 #if defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
251 ACE_UNUSED_ARG (policy
);
252 ACE_UNUSED_ARG (scope
);
255 case THREAD_PRIORITY_IDLE
:
256 return THREAD_PRIORITY_LOWEST
;
257 case THREAD_PRIORITY_LOWEST
:
258 return THREAD_PRIORITY_BELOW_NORMAL
;
259 case THREAD_PRIORITY_BELOW_NORMAL
:
260 return THREAD_PRIORITY_NORMAL
;
261 case THREAD_PRIORITY_NORMAL
:
262 return THREAD_PRIORITY_ABOVE_NORMAL
;
263 case THREAD_PRIORITY_ABOVE_NORMAL
:
264 return THREAD_PRIORITY_HIGHEST
;
265 case THREAD_PRIORITY_HIGHEST
:
266 return THREAD_PRIORITY_TIME_CRITICAL
;
267 case THREAD_PRIORITY_TIME_CRITICAL
:
268 return THREAD_PRIORITY_TIME_CRITICAL
;
270 return priority
; // unknown priority: should never get here
272 #elif defined(ACE_HAS_THREADS) && \
273 (!defined(ACE_LACKS_SETSCHED) || \
274 defined (ACE_HAS_PTHREAD_SCHEDPARAM))
275 // including STHREADS, and PTHREADS
276 int const max
= priority_max (policy
, scope
);
277 return priority
< max
? priority
+ 1 : max
;
278 #elif defined (ACE_VXWORKS) || defined (ACE_HAS_WINCE)
279 int const max
= priority_max (policy
, scope
);
280 return priority
> max
? priority
- 1 : max
;
282 ACE_UNUSED_ARG (policy
);
283 ACE_UNUSED_ARG (scope
);
284 ACE_UNUSED_ARG (priority
);
285 ACE_NOTSUP_RETURN (-1);
286 #endif /* ACE_HAS_THREADS */
290 ACE_Sched_Params::previous_priority (const Policy policy
,
294 #if defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
295 ACE_UNUSED_ARG (policy
);
296 ACE_UNUSED_ARG (scope
);
299 case THREAD_PRIORITY_IDLE
:
300 return THREAD_PRIORITY_IDLE
;
301 case THREAD_PRIORITY_LOWEST
:
302 return THREAD_PRIORITY_IDLE
;
303 case THREAD_PRIORITY_BELOW_NORMAL
:
304 return THREAD_PRIORITY_LOWEST
;
305 case THREAD_PRIORITY_NORMAL
:
306 return THREAD_PRIORITY_BELOW_NORMAL
;
307 case THREAD_PRIORITY_ABOVE_NORMAL
:
308 return THREAD_PRIORITY_NORMAL
;
309 case THREAD_PRIORITY_HIGHEST
:
310 return THREAD_PRIORITY_ABOVE_NORMAL
;
311 case THREAD_PRIORITY_TIME_CRITICAL
:
312 return THREAD_PRIORITY_HIGHEST
;
314 return priority
; // unknown priority: should never get here
316 #elif defined(ACE_HAS_THREADS) && \
317 (!defined(ACE_LACKS_SETSCHED) || \
318 defined (ACE_HAS_PTHREAD_SCHEDPARAM))
319 // including STHREADS and PTHREADS
320 int const min
= priority_min (policy
, scope
);
321 return priority
> min
? priority
- 1 : min
;
322 #elif defined (ACE_VXWORKS) || defined (ACE_HAS_WINCE)
323 int const min
= priority_min (policy
, scope
);
324 return priority
< min
? priority
+ 1 : min
;
326 ACE_UNUSED_ARG (policy
);
327 ACE_UNUSED_ARG (scope
);
328 ACE_UNUSED_ARG (priority
);
329 ACE_NOTSUP_RETURN (-1);
330 #endif /* ACE_HAS_THREADS */
333 ACE_END_VERSIONED_NAMESPACE_DECL