00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "ace/Sched_Params.h"
00014
00015 #if !defined (__ACE_INLINE__)
00016 #include "ace/Sched_Params.inl"
00017 #endif
00018
00019 #if defined (ACE_HAS_PRIOCNTL) && defined (ACE_HAS_STHREADS)
00020 # include "ace/OS_NS_string.h"
00021 # include <sys/priocntl.h>
00022 #endif
00023
00024 ACE_RCSID(ace, Sched_Params, "$Id: Sched_Params.cpp 80826 2008-03-04 14:51:23Z wotte $")
00025
00026 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00027
00028 int
00029 ACE_Sched_Params::priority_min (const Policy policy,
00030 const int scope)
00031 {
00032 #if defined (ACE_HAS_PRIOCNTL) && defined (ACE_HAS_STHREADS)
00033 ACE_UNUSED_ARG (scope);
00034
00035
00036
00037
00038
00039
00040
00041 if (scope == ACE_SCOPE_PROCESS || scope == ACE_SCOPE_LWP)
00042 {
00043 if (policy == ACE_SCHED_OTHER)
00044 {
00045
00046 pcinfo_t pcinfo;
00047
00048
00049 ACE_OS::memset (&pcinfo, 0, sizeof pcinfo);
00050 ACE_OS::strcpy (pcinfo.pc_clname, "TS");
00051
00052 if (ACE_OS::priority_control (P_ALL ,
00053 P_MYID ,
00054 PC_GETCID,
00055 (char *) &pcinfo) == -1)
00056
00057
00058 return -1;
00059
00060
00061
00062
00063
00064
00065 return -((tsinfo_t *) pcinfo.pc_clinfo)->ts_maxupri;
00066 }
00067 else
00068 return 0;
00069 }
00070 else
00071 {
00072
00073
00074
00075 switch (policy)
00076 {
00077 case ACE_SCHED_FIFO:
00078 return ACE_THR_PRI_FIFO_MIN;
00079 case ACE_SCHED_RR:
00080 return ACE_THR_PRI_RR_MIN;
00081 case ACE_SCHED_OTHER:
00082 default:
00083 return ACE_THR_PRI_OTHER_MIN;
00084 }
00085 }
00086 #elif defined(ACE_HAS_PTHREADS) && \
00087 (!defined(ACE_LACKS_SETSCHED) || defined (ACE_TANDEM_T1248_PTHREADS) || \
00088 defined (ACE_HAS_PTHREAD_SCHEDPARAM))
00089
00090 switch (scope)
00091 {
00092 case ACE_SCOPE_THREAD:
00093 switch (policy)
00094 {
00095 case ACE_SCHED_FIFO:
00096 return ACE_THR_PRI_FIFO_MIN;
00097 case ACE_SCHED_RR:
00098 return ACE_THR_PRI_RR_MIN;
00099 case ACE_SCHED_OTHER:
00100 default:
00101 return ACE_THR_PRI_OTHER_MIN;
00102 }
00103
00104 case ACE_SCOPE_PROCESS:
00105 default:
00106 switch (policy)
00107 {
00108 case ACE_SCHED_FIFO:
00109 return ACE_PROC_PRI_FIFO_MIN;
00110 case ACE_SCHED_RR:
00111 return ACE_PROC_PRI_RR_MIN;
00112 case ACE_SCHED_OTHER:
00113 default:
00114 return ACE_PROC_PRI_OTHER_MIN;
00115 }
00116 }
00117
00118 #elif defined (ACE_HAS_WTHREADS)
00119 ACE_UNUSED_ARG (policy);
00120 ACE_UNUSED_ARG (scope);
00121 return THREAD_PRIORITY_IDLE;
00122 #elif defined (ACE_VXWORKS)
00123 ACE_UNUSED_ARG (policy);
00124 ACE_UNUSED_ARG (scope);
00125 # if defined (VX_TASK_PRIORITY_MAX)
00126 return VX_TASK_PRIORITY_MAX;
00127 # else
00128 return 255;
00129 # endif
00130 #else
00131 ACE_UNUSED_ARG (policy);
00132 ACE_UNUSED_ARG (scope);
00133 ACE_NOTSUP_RETURN (-1);
00134 #endif
00135 }
00136
00137 int
00138 ACE_Sched_Params::priority_max (const Policy policy,
00139 const int scope)
00140 {
00141 #if defined (ACE_HAS_PRIOCNTL) && defined (ACE_HAS_STHREADS)
00142 ACE_UNUSED_ARG (scope);
00143
00144
00145
00146
00147 if (scope == ACE_SCOPE_PROCESS || scope == ACE_SCOPE_LWP)
00148 {
00149
00150
00151
00152
00153 pcinfo_t pcinfo;
00154
00155
00156 ACE_OS::memset (&pcinfo, 0, sizeof pcinfo);
00157 ACE_OS::strcpy (pcinfo.pc_clname,
00158 policy == ACE_SCHED_OTHER ? "TS" : "RT");
00159
00160 if (ACE_OS::priority_control (P_ALL ,
00161 P_MYID ,
00162 PC_GETCID,
00163 (char *) &pcinfo) == -1)
00164 return -1;
00165
00166
00167
00168
00169
00170 return policy == ACE_SCHED_OTHER
00171 ? ((tsinfo_t *) pcinfo.pc_clinfo)->ts_maxupri
00172 : ((rtinfo_t *) pcinfo.pc_clinfo)->rt_maxpri;
00173 }
00174 else
00175 {
00176
00177
00178
00179 switch (policy)
00180 {
00181 case ACE_SCHED_FIFO:
00182 return ACE_THR_PRI_FIFO_MAX;
00183 case ACE_SCHED_RR:
00184 return ACE_THR_PRI_RR_MAX;
00185 case ACE_SCHED_OTHER:
00186 default:
00187 return ACE_THR_PRI_OTHER_MAX;
00188 }
00189 }
00190 #elif defined(ACE_HAS_PTHREADS) && \
00191 (!defined(ACE_LACKS_SETSCHED) || defined (ACE_TANDEM_T1248_PTHREADS) || \
00192 defined (ACE_HAS_PTHREAD_SCHEDPARAM))
00193
00194 switch (scope)
00195 {
00196 case ACE_SCOPE_THREAD:
00197 switch (policy)
00198 {
00199 case ACE_SCHED_FIFO:
00200 return ACE_THR_PRI_FIFO_MAX;
00201 case ACE_SCHED_RR:
00202 return ACE_THR_PRI_RR_MAX;
00203 case ACE_SCHED_OTHER:
00204 default:
00205 return ACE_THR_PRI_OTHER_MAX;
00206 }
00207
00208 case ACE_SCOPE_PROCESS:
00209 default:
00210 switch (policy)
00211 {
00212 case ACE_SCHED_FIFO:
00213 return ACE_PROC_PRI_FIFO_MAX;
00214 case ACE_SCHED_RR:
00215 return ACE_PROC_PRI_RR_MAX;
00216 case ACE_SCHED_OTHER:
00217 default:
00218 return ACE_PROC_PRI_OTHER_MAX;
00219 }
00220 }
00221
00222 #elif defined (ACE_HAS_WTHREADS)
00223 ACE_UNUSED_ARG (policy);
00224 ACE_UNUSED_ARG (scope);
00225 return THREAD_PRIORITY_TIME_CRITICAL;
00226 #elif defined (ACE_VXWORKS)
00227 ACE_UNUSED_ARG (policy);
00228 ACE_UNUSED_ARG (scope);
00229 # if defined (VX_TASK_PRIORITY_MIN)
00230 return VX_TASK_PRIORITY_MIN;
00231 # else
00232 return 0;
00233 # endif
00234 #else
00235 ACE_UNUSED_ARG (policy);
00236 ACE_UNUSED_ARG (scope);
00237 ACE_NOTSUP_RETURN (-1);
00238 #endif
00239 }
00240
00241 int
00242 ACE_Sched_Params::next_priority (const Policy policy,
00243 const int priority,
00244 const int scope)
00245 {
00246 #if defined (ACE_HAS_WTHREADS)
00247 ACE_UNUSED_ARG (policy);
00248 ACE_UNUSED_ARG (scope);
00249 switch (priority)
00250 {
00251 case THREAD_PRIORITY_IDLE:
00252 return THREAD_PRIORITY_LOWEST;
00253 case THREAD_PRIORITY_LOWEST:
00254 return THREAD_PRIORITY_BELOW_NORMAL;
00255 case THREAD_PRIORITY_BELOW_NORMAL:
00256 return THREAD_PRIORITY_NORMAL;
00257 case THREAD_PRIORITY_NORMAL:
00258 return THREAD_PRIORITY_ABOVE_NORMAL;
00259 case THREAD_PRIORITY_ABOVE_NORMAL:
00260 return THREAD_PRIORITY_HIGHEST;
00261 case THREAD_PRIORITY_HIGHEST:
00262 return THREAD_PRIORITY_TIME_CRITICAL;
00263 case THREAD_PRIORITY_TIME_CRITICAL:
00264 return THREAD_PRIORITY_TIME_CRITICAL;
00265 default:
00266 return priority;
00267 }
00268 #elif defined(ACE_HAS_THREADS) && \
00269 (!defined(ACE_LACKS_SETSCHED) || defined (ACE_TANDEM_T1248_PTHREADS) || \
00270 defined (ACE_HAS_PTHREAD_SCHEDPARAM))
00271
00272 int const max = priority_max (policy, scope);
00273 return priority < max ? priority + 1 : max;
00274 #elif defined (ACE_VXWORKS)
00275 return priority > priority_max (policy, scope)
00276 ? priority - 1
00277 : priority_max (policy, scope);
00278 #else
00279 ACE_UNUSED_ARG (policy);
00280 ACE_UNUSED_ARG (scope);
00281 ACE_UNUSED_ARG (priority);
00282 ACE_NOTSUP_RETURN (-1);
00283 #endif
00284 }
00285
00286 int
00287 ACE_Sched_Params::previous_priority (const Policy policy,
00288 const int priority,
00289 const int scope)
00290 {
00291 #if defined (ACE_HAS_WTHREADS)
00292 ACE_UNUSED_ARG (policy);
00293 ACE_UNUSED_ARG (scope);
00294 switch (priority)
00295 {
00296 case THREAD_PRIORITY_IDLE:
00297 return THREAD_PRIORITY_IDLE;
00298 case THREAD_PRIORITY_LOWEST:
00299 return THREAD_PRIORITY_IDLE;
00300 case THREAD_PRIORITY_BELOW_NORMAL:
00301 return THREAD_PRIORITY_LOWEST;
00302 case THREAD_PRIORITY_NORMAL:
00303 return THREAD_PRIORITY_BELOW_NORMAL;
00304 case THREAD_PRIORITY_ABOVE_NORMAL:
00305 return THREAD_PRIORITY_NORMAL;
00306 case THREAD_PRIORITY_HIGHEST:
00307 return THREAD_PRIORITY_ABOVE_NORMAL;
00308 case THREAD_PRIORITY_TIME_CRITICAL:
00309 return THREAD_PRIORITY_HIGHEST;
00310 default:
00311 return priority;
00312 }
00313 #elif defined(ACE_HAS_THREADS) && \
00314 (!defined(ACE_LACKS_SETSCHED) || defined (ACE_TANDEM_T1248_PTHREADS) || \
00315 defined (ACE_HAS_PTHREAD_SCHEDPARAM))
00316
00317 int const min = priority_min (policy, scope);
00318
00319 return priority > min ? priority - 1 : min;
00320 #elif defined (ACE_VXWORKS)
00321 return priority < priority_min (policy, scope)
00322 ? priority + 1
00323 : priority_min (policy, scope);
00324 #else
00325 ACE_UNUSED_ARG (policy);
00326 ACE_UNUSED_ARG (scope);
00327 ACE_UNUSED_ARG (priority);
00328 ACE_NOTSUP_RETURN (-1);
00329 #endif
00330 }
00331
00332 ACE_END_VERSIONED_NAMESPACE_DECL