Sched_Params.cpp

Go to the documentation of this file.
00001 
00002 //=============================================================================
00003 /**
00004  *  @file    Sched_Params.cpp
00005  *
00006  *  $Id: Sched_Params.cpp 80826 2008-03-04 14:51:23Z wotte $
00007  *
00008  *  @author David Levine
00009  */
00010 //=============================================================================
00011 
00012 
00013 #include "ace/Sched_Params.h"
00014 
00015 #if !defined (__ACE_INLINE__)
00016 #include "ace/Sched_Params.inl"
00017 #endif /* __ACE_INLINE__ */
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 /* ACE_HAS_PRIOCNTL && ACE_HAS_THREADS */
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   // Assume that ACE_SCHED_OTHER indicates TS class, and that other
00036   // policies indicate RT class.
00037 
00038   // Call ACE_OS::priority_control only for processes (lightweight
00039   // or otherwise). Calling ACE_OS::priority_control for thread
00040   // priorities gives incorrect results.
00041   if (scope == ACE_SCOPE_PROCESS || scope == ACE_SCOPE_LWP)
00042     {
00043       if (policy == ACE_SCHED_OTHER)
00044         {
00045           // Get the priority class ID and attributes.
00046           pcinfo_t pcinfo;
00047           // The following is just to avoid Purify warnings about unitialized
00048           // memory reads.
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 /* ignored */,
00053                                         P_MYID /* ignored */,
00054                                         PC_GETCID,
00055                                         (char *) &pcinfo) == -1)
00056             // Just hope that priority range wasn't configured from -1
00057             // .. 1
00058             return -1;
00059 
00060           // OK, now we've got the class ID in pcinfo.pc_cid.  In
00061           // addition, the maximum configured time-share priority is in
00062           // ((tsinfo_t *) pcinfo.pc_clinfo)->ts_maxupri.  The minimum
00063           // priority is just the negative of that.
00064 
00065           return -((tsinfo_t *) pcinfo.pc_clinfo)->ts_maxupri;
00066         }
00067       else
00068         return 0;
00069     }
00070   else
00071     {
00072       // Here we handle the case for ACE_SCOPE_THREAD. Calling
00073       // ACE_OS::priority_control for thread scope gives incorrect
00074       // results.
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 /* ACE_HAS_PRIOCNTL && defined (ACE_HAS_STHREADS) */
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   // Call ACE_OS::priority_control only for processes (lightweight
00145   // or otherwise). Calling ACE_OS::priority_control for thread
00146   // priorities gives incorrect results.
00147   if (scope == ACE_SCOPE_PROCESS || scope == ACE_SCOPE_LWP)
00148     {
00149       // Assume that ACE_SCHED_OTHER indicates TS class, and that other
00150       // policies indicate RT class.
00151 
00152       // Get the priority class ID and attributes.
00153       pcinfo_t pcinfo;
00154       // The following is just to avoid Purify warnings about unitialized
00155       // memory reads.
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 /* ignored */,
00161                                     P_MYID /* ignored */,
00162                                     PC_GETCID,
00163                                     (char *) &pcinfo) == -1)
00164         return -1;
00165 
00166       // OK, now we've got the class ID in pcinfo.pc_cid.  In addition,
00167       // the maximum configured real-time priority is in ((rtinfo_t *)
00168       // pcinfo.pc_clinfo)->rt_maxpri, or similarly for the TS class.
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       // Here we handle the case for ACE_SCOPE_THREAD. Calling
00177       // ACE_OS::priority_control for thread scope gives incorrect
00178       // results.
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 /* ACE_HAS_PRIOCNTL && defined (ACE_HAS_STHREADS) */
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;  // unknown priority:  should never get here
00267     }
00268 #elif defined(ACE_HAS_THREADS) && \
00269       (!defined(ACE_LACKS_SETSCHED) || defined (ACE_TANDEM_T1248_PTHREADS) || \
00270        defined (ACE_HAS_PTHREAD_SCHEDPARAM))
00271   // including STHREADS, and PTHREADS
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 /* ACE_HAS_THREADS */
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;  // unknown priority:  should never get here
00312     }
00313 #elif defined(ACE_HAS_THREADS) && \
00314       (!defined(ACE_LACKS_SETSCHED) || defined (ACE_TANDEM_T1248_PTHREADS) || \
00315        defined (ACE_HAS_PTHREAD_SCHEDPARAM))
00316   // including STHREADS and PTHREADS
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 /* ACE_HAS_THREADS */
00330 }
00331 
00332 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:18:42 2010 for ACE by  doxygen 1.4.7