Go to the documentation of this file.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 83624 2008-11-09 11:45:59Z johnnyw $")
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) && !defined (ACE_HAS_WINCE)
00119 ACE_UNUSED_ARG (policy);
00120 ACE_UNUSED_ARG (scope);
00121 return THREAD_PRIORITY_IDLE;
00122 #elif defined (ACE_HAS_WTHREADS) && defined (ACE_HAS_WINCE)
00123 ACE_UNUSED_ARG (policy);
00124 ACE_UNUSED_ARG (scope);
00125 return 255;
00126 #elif defined (ACE_VXWORKS)
00127 ACE_UNUSED_ARG (policy);
00128 ACE_UNUSED_ARG (scope);
00129 # if defined (VX_TASK_PRIORITY_MAX)
00130 return VX_TASK_PRIORITY_MAX;
00131 # else
00132 return 255;
00133 # endif
00134 #else
00135 ACE_UNUSED_ARG (policy);
00136 ACE_UNUSED_ARG (scope);
00137 ACE_NOTSUP_RETURN (-1);
00138 #endif
00139 }
00140
00141 int
00142 ACE_Sched_Params::priority_max (const Policy policy,
00143 const int scope)
00144 {
00145 #if defined (ACE_HAS_PRIOCNTL) && defined (ACE_HAS_STHREADS)
00146 ACE_UNUSED_ARG (scope);
00147
00148
00149
00150
00151 if (scope == ACE_SCOPE_PROCESS || scope == ACE_SCOPE_LWP)
00152 {
00153
00154
00155
00156
00157 pcinfo_t pcinfo;
00158
00159
00160 ACE_OS::memset (&pcinfo, 0, sizeof pcinfo);
00161 ACE_OS::strcpy (pcinfo.pc_clname,
00162 policy == ACE_SCHED_OTHER ? "TS" : "RT");
00163
00164 if (ACE_OS::priority_control (P_ALL ,
00165 P_MYID ,
00166 PC_GETCID,
00167 (char *) &pcinfo) == -1)
00168 return -1;
00169
00170
00171
00172
00173
00174 return policy == ACE_SCHED_OTHER
00175 ? ((tsinfo_t *) pcinfo.pc_clinfo)->ts_maxupri
00176 : ((rtinfo_t *) pcinfo.pc_clinfo)->rt_maxpri;
00177 }
00178 else
00179 {
00180
00181
00182
00183 switch (policy)
00184 {
00185 case ACE_SCHED_FIFO:
00186 return ACE_THR_PRI_FIFO_MAX;
00187 case ACE_SCHED_RR:
00188 return ACE_THR_PRI_RR_MAX;
00189 case ACE_SCHED_OTHER:
00190 default:
00191 return ACE_THR_PRI_OTHER_MAX;
00192 }
00193 }
00194 #elif defined(ACE_HAS_PTHREADS) && \
00195 (!defined(ACE_LACKS_SETSCHED) || defined (ACE_TANDEM_T1248_PTHREADS) || \
00196 defined (ACE_HAS_PTHREAD_SCHEDPARAM))
00197
00198 switch (scope)
00199 {
00200 case ACE_SCOPE_THREAD:
00201 switch (policy)
00202 {
00203 case ACE_SCHED_FIFO:
00204 return ACE_THR_PRI_FIFO_MAX;
00205 case ACE_SCHED_RR:
00206 return ACE_THR_PRI_RR_MAX;
00207 case ACE_SCHED_OTHER:
00208 default:
00209 return ACE_THR_PRI_OTHER_MAX;
00210 }
00211
00212 case ACE_SCOPE_PROCESS:
00213 default:
00214 switch (policy)
00215 {
00216 case ACE_SCHED_FIFO:
00217 return ACE_PROC_PRI_FIFO_MAX;
00218 case ACE_SCHED_RR:
00219 return ACE_PROC_PRI_RR_MAX;
00220 case ACE_SCHED_OTHER:
00221 default:
00222 return ACE_PROC_PRI_OTHER_MAX;
00223 }
00224 }
00225
00226 #elif defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
00227 ACE_UNUSED_ARG (policy);
00228 ACE_UNUSED_ARG (scope);
00229 return THREAD_PRIORITY_TIME_CRITICAL;
00230 #elif defined (ACE_HAS_WTHREADS) && defined (ACE_HAS_WINCE)
00231 ACE_UNUSED_ARG (policy);
00232 ACE_UNUSED_ARG (scope);
00233 return 0;
00234 #elif defined (ACE_VXWORKS)
00235 ACE_UNUSED_ARG (policy);
00236 ACE_UNUSED_ARG (scope);
00237 # if defined (VX_TASK_PRIORITY_MIN)
00238 return VX_TASK_PRIORITY_MIN;
00239 # else
00240 return 0;
00241 # endif
00242 #else
00243 ACE_UNUSED_ARG (policy);
00244 ACE_UNUSED_ARG (scope);
00245 ACE_NOTSUP_RETURN (-1);
00246 #endif
00247 }
00248
00249 int
00250 ACE_Sched_Params::next_priority (const Policy policy,
00251 const int priority,
00252 const int scope)
00253 {
00254 #if defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
00255 ACE_UNUSED_ARG (policy);
00256 ACE_UNUSED_ARG (scope);
00257 switch (priority)
00258 {
00259 case THREAD_PRIORITY_IDLE:
00260 return THREAD_PRIORITY_LOWEST;
00261 case THREAD_PRIORITY_LOWEST:
00262 return THREAD_PRIORITY_BELOW_NORMAL;
00263 case THREAD_PRIORITY_BELOW_NORMAL:
00264 return THREAD_PRIORITY_NORMAL;
00265 case THREAD_PRIORITY_NORMAL:
00266 return THREAD_PRIORITY_ABOVE_NORMAL;
00267 case THREAD_PRIORITY_ABOVE_NORMAL:
00268 return THREAD_PRIORITY_HIGHEST;
00269 case THREAD_PRIORITY_HIGHEST:
00270 return THREAD_PRIORITY_TIME_CRITICAL;
00271 case THREAD_PRIORITY_TIME_CRITICAL:
00272 return THREAD_PRIORITY_TIME_CRITICAL;
00273 default:
00274 return priority;
00275 }
00276 #elif defined(ACE_HAS_THREADS) && \
00277 (!defined(ACE_LACKS_SETSCHED) || defined (ACE_TANDEM_T1248_PTHREADS) || \
00278 defined (ACE_HAS_PTHREAD_SCHEDPARAM))
00279
00280 int const max = priority_max (policy, scope);
00281 return priority < max ? priority + 1 : max;
00282 #elif defined (ACE_VXWORKS) || defined (ACE_HAS_WINCE)
00283 int const max = priority_max (policy, scope);
00284 return priority > max ? priority - 1 : max;
00285 #else
00286 ACE_UNUSED_ARG (policy);
00287 ACE_UNUSED_ARG (scope);
00288 ACE_UNUSED_ARG (priority);
00289 ACE_NOTSUP_RETURN (-1);
00290 #endif
00291 }
00292
00293 int
00294 ACE_Sched_Params::previous_priority (const Policy policy,
00295 const int priority,
00296 const int scope)
00297 {
00298 #if defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
00299 ACE_UNUSED_ARG (policy);
00300 ACE_UNUSED_ARG (scope);
00301 switch (priority)
00302 {
00303 case THREAD_PRIORITY_IDLE:
00304 return THREAD_PRIORITY_IDLE;
00305 case THREAD_PRIORITY_LOWEST:
00306 return THREAD_PRIORITY_IDLE;
00307 case THREAD_PRIORITY_BELOW_NORMAL:
00308 return THREAD_PRIORITY_LOWEST;
00309 case THREAD_PRIORITY_NORMAL:
00310 return THREAD_PRIORITY_BELOW_NORMAL;
00311 case THREAD_PRIORITY_ABOVE_NORMAL:
00312 return THREAD_PRIORITY_NORMAL;
00313 case THREAD_PRIORITY_HIGHEST:
00314 return THREAD_PRIORITY_ABOVE_NORMAL;
00315 case THREAD_PRIORITY_TIME_CRITICAL:
00316 return THREAD_PRIORITY_HIGHEST;
00317 default:
00318 return priority;
00319 }
00320 #elif defined(ACE_HAS_THREADS) && \
00321 (!defined(ACE_LACKS_SETSCHED) || defined (ACE_TANDEM_T1248_PTHREADS) || \
00322 defined (ACE_HAS_PTHREAD_SCHEDPARAM))
00323
00324 int const min = priority_min (policy, scope);
00325 return priority > min ? priority - 1 : min;
00326 #elif defined (ACE_VXWORKS) || defined (ACE_HAS_WINCE)
00327 int const min = priority_min (policy, scope);
00328 return priority < min ? priority + 1 : min;
00329 #else
00330 ACE_UNUSED_ARG (policy);
00331 ACE_UNUSED_ARG (scope);
00332 ACE_UNUSED_ARG (priority);
00333 ACE_NOTSUP_RETURN (-1);
00334 #endif
00335 }
00336
00337 ACE_END_VERSIONED_NAMESPACE_DECL