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