mirror of
https://github.com/mangosfour/server.git
synced 2025-12-11 16:37:03 +00:00
335 lines
10 KiB
C++
335 lines
10 KiB
C++
|
|
//=============================================================================
|
|
/**
|
|
* @file Sched_Params.cpp
|
|
*
|
|
* $Id: Sched_Params.cpp 95761 2012-05-15 18:23:04Z johnnyw $
|
|
*
|
|
* @author David Levine
|
|
*/
|
|
//=============================================================================
|
|
|
|
|
|
#include "ace/Sched_Params.h"
|
|
|
|
#if !defined (__ACE_INLINE__)
|
|
#include "ace/Sched_Params.inl"
|
|
#endif /* __ACE_INLINE__ */
|
|
|
|
#if defined (ACE_HAS_PRIOCNTL) && defined (ACE_HAS_STHREADS)
|
|
# include "ace/OS_NS_string.h"
|
|
# include /**/ <sys/priocntl.h>
|
|
#endif /* ACE_HAS_PRIOCNTL && ACE_HAS_THREADS */
|
|
|
|
|
|
|
|
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
|
|
|
|
int
|
|
ACE_Sched_Params::priority_min (const Policy policy,
|
|
const int scope)
|
|
{
|
|
#if defined (ACE_HAS_PRIOCNTL) && defined (ACE_HAS_STHREADS)
|
|
ACE_UNUSED_ARG (scope);
|
|
|
|
// Assume that ACE_SCHED_OTHER indicates TS class, and that other
|
|
// policies indicate RT class.
|
|
|
|
// Call ACE_OS::priority_control only for processes (lightweight
|
|
// or otherwise). Calling ACE_OS::priority_control for thread
|
|
// priorities gives incorrect results.
|
|
if (scope == ACE_SCOPE_PROCESS || scope == ACE_SCOPE_LWP)
|
|
{
|
|
if (policy == ACE_SCHED_OTHER)
|
|
{
|
|
// Get the priority class ID and attributes.
|
|
pcinfo_t pcinfo;
|
|
// The following is just to avoid Purify warnings about unitialized
|
|
// memory reads.
|
|
ACE_OS::memset (&pcinfo, 0, sizeof pcinfo);
|
|
ACE_OS::strcpy (pcinfo.pc_clname, "TS");
|
|
|
|
if (ACE_OS::priority_control (P_ALL /* ignored */,
|
|
P_MYID /* ignored */,
|
|
PC_GETCID,
|
|
(char *) &pcinfo) == -1)
|
|
// Just hope that priority range wasn't configured from -1
|
|
// .. 1
|
|
return -1;
|
|
|
|
// OK, now we've got the class ID in pcinfo.pc_cid. In
|
|
// addition, the maximum configured time-share priority is in
|
|
// ((tsinfo_t *) pcinfo.pc_clinfo)->ts_maxupri. The minimum
|
|
// priority is just the negative of that.
|
|
|
|
return -((tsinfo_t *) pcinfo.pc_clinfo)->ts_maxupri;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
// Here we handle the case for ACE_SCOPE_THREAD. Calling
|
|
// ACE_OS::priority_control for thread scope gives incorrect
|
|
// results.
|
|
switch (policy)
|
|
{
|
|
case ACE_SCHED_FIFO:
|
|
return ACE_THR_PRI_FIFO_MIN;
|
|
case ACE_SCHED_RR:
|
|
return ACE_THR_PRI_RR_MIN;
|
|
case ACE_SCHED_OTHER:
|
|
default:
|
|
return ACE_THR_PRI_OTHER_MIN;
|
|
}
|
|
}
|
|
#elif defined(ACE_HAS_PTHREADS) && \
|
|
(!defined(ACE_LACKS_SETSCHED))
|
|
switch (scope)
|
|
{
|
|
case ACE_SCOPE_THREAD:
|
|
switch (policy)
|
|
{
|
|
case ACE_SCHED_FIFO:
|
|
return ACE_THR_PRI_FIFO_MIN;
|
|
case ACE_SCHED_RR:
|
|
return ACE_THR_PRI_RR_MIN;
|
|
case ACE_SCHED_OTHER:
|
|
default:
|
|
return ACE_THR_PRI_OTHER_MIN;
|
|
}
|
|
|
|
case ACE_SCOPE_PROCESS:
|
|
default:
|
|
switch (policy)
|
|
{
|
|
case ACE_SCHED_FIFO:
|
|
return ACE_PROC_PRI_FIFO_MIN;
|
|
case ACE_SCHED_RR:
|
|
return ACE_PROC_PRI_RR_MIN;
|
|
case ACE_SCHED_OTHER:
|
|
default:
|
|
return ACE_PROC_PRI_OTHER_MIN;
|
|
}
|
|
}
|
|
|
|
#elif defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
return THREAD_PRIORITY_IDLE;
|
|
#elif defined (ACE_HAS_WTHREADS) && defined (ACE_HAS_WINCE)
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
return 255;
|
|
#elif defined (ACE_VXWORKS)
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
# if defined (VX_TASK_PRIORITY_MAX)
|
|
return VX_TASK_PRIORITY_MAX;
|
|
# else
|
|
return 255;
|
|
# endif
|
|
#else
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
ACE_NOTSUP_RETURN (-1);
|
|
#endif /* ACE_HAS_PRIOCNTL && defined (ACE_HAS_STHREADS) */
|
|
}
|
|
|
|
int
|
|
ACE_Sched_Params::priority_max (const Policy policy,
|
|
const int scope)
|
|
{
|
|
#if defined (ACE_HAS_PRIOCNTL) && defined (ACE_HAS_STHREADS)
|
|
ACE_UNUSED_ARG (scope);
|
|
|
|
// Call ACE_OS::priority_control only for processes (lightweight
|
|
// or otherwise). Calling ACE_OS::priority_control for thread
|
|
// priorities gives incorrect results.
|
|
if (scope == ACE_SCOPE_PROCESS || scope == ACE_SCOPE_LWP)
|
|
{
|
|
// Assume that ACE_SCHED_OTHER indicates TS class, and that other
|
|
// policies indicate RT class.
|
|
|
|
// Get the priority class ID and attributes.
|
|
pcinfo_t pcinfo;
|
|
// The following is just to avoid Purify warnings about unitialized
|
|
// memory reads.
|
|
ACE_OS::memset (&pcinfo, 0, sizeof pcinfo);
|
|
ACE_OS::strcpy (pcinfo.pc_clname,
|
|
policy == ACE_SCHED_OTHER ? "TS" : "RT");
|
|
|
|
if (ACE_OS::priority_control (P_ALL /* ignored */,
|
|
P_MYID /* ignored */,
|
|
PC_GETCID,
|
|
(char *) &pcinfo) == -1)
|
|
return -1;
|
|
|
|
// OK, now we've got the class ID in pcinfo.pc_cid. In addition,
|
|
// the maximum configured real-time priority is in ((rtinfo_t *)
|
|
// pcinfo.pc_clinfo)->rt_maxpri, or similarly for the TS class.
|
|
|
|
return policy == ACE_SCHED_OTHER
|
|
? ((tsinfo_t *) pcinfo.pc_clinfo)->ts_maxupri
|
|
: ((rtinfo_t *) pcinfo.pc_clinfo)->rt_maxpri;
|
|
}
|
|
else
|
|
{
|
|
// Here we handle the case for ACE_SCOPE_THREAD. Calling
|
|
// ACE_OS::priority_control for thread scope gives incorrect
|
|
// results.
|
|
switch (policy)
|
|
{
|
|
case ACE_SCHED_FIFO:
|
|
return ACE_THR_PRI_FIFO_MAX;
|
|
case ACE_SCHED_RR:
|
|
return ACE_THR_PRI_RR_MAX;
|
|
case ACE_SCHED_OTHER:
|
|
default:
|
|
return ACE_THR_PRI_OTHER_MAX;
|
|
}
|
|
}
|
|
#elif defined(ACE_HAS_PTHREADS) && \
|
|
(!defined(ACE_LACKS_SETSCHED) || \
|
|
defined (ACE_HAS_PTHREAD_SCHEDPARAM))
|
|
|
|
switch (scope)
|
|
{
|
|
case ACE_SCOPE_THREAD:
|
|
switch (policy)
|
|
{
|
|
case ACE_SCHED_FIFO:
|
|
return ACE_THR_PRI_FIFO_MAX;
|
|
case ACE_SCHED_RR:
|
|
return ACE_THR_PRI_RR_MAX;
|
|
case ACE_SCHED_OTHER:
|
|
default:
|
|
return ACE_THR_PRI_OTHER_MAX;
|
|
}
|
|
|
|
case ACE_SCOPE_PROCESS:
|
|
default:
|
|
switch (policy)
|
|
{
|
|
case ACE_SCHED_FIFO:
|
|
return ACE_PROC_PRI_FIFO_MAX;
|
|
case ACE_SCHED_RR:
|
|
return ACE_PROC_PRI_RR_MAX;
|
|
case ACE_SCHED_OTHER:
|
|
default:
|
|
return ACE_PROC_PRI_OTHER_MAX;
|
|
}
|
|
}
|
|
|
|
#elif defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
return THREAD_PRIORITY_TIME_CRITICAL;
|
|
#elif defined (ACE_HAS_WTHREADS) && defined (ACE_HAS_WINCE)
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
return 0;
|
|
#elif defined (ACE_VXWORKS)
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
# if defined (VX_TASK_PRIORITY_MIN)
|
|
return VX_TASK_PRIORITY_MIN;
|
|
# else
|
|
return 0;
|
|
# endif
|
|
#else
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
ACE_NOTSUP_RETURN (-1);
|
|
#endif /* ACE_HAS_PRIOCNTL && defined (ACE_HAS_STHREADS) */
|
|
}
|
|
|
|
int
|
|
ACE_Sched_Params::next_priority (const Policy policy,
|
|
const int priority,
|
|
const int scope)
|
|
{
|
|
#if defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
switch (priority)
|
|
{
|
|
case THREAD_PRIORITY_IDLE:
|
|
return THREAD_PRIORITY_LOWEST;
|
|
case THREAD_PRIORITY_LOWEST:
|
|
return THREAD_PRIORITY_BELOW_NORMAL;
|
|
case THREAD_PRIORITY_BELOW_NORMAL:
|
|
return THREAD_PRIORITY_NORMAL;
|
|
case THREAD_PRIORITY_NORMAL:
|
|
return THREAD_PRIORITY_ABOVE_NORMAL;
|
|
case THREAD_PRIORITY_ABOVE_NORMAL:
|
|
return THREAD_PRIORITY_HIGHEST;
|
|
case THREAD_PRIORITY_HIGHEST:
|
|
return THREAD_PRIORITY_TIME_CRITICAL;
|
|
case THREAD_PRIORITY_TIME_CRITICAL:
|
|
return THREAD_PRIORITY_TIME_CRITICAL;
|
|
default:
|
|
return priority; // unknown priority: should never get here
|
|
}
|
|
#elif defined(ACE_HAS_THREADS) && \
|
|
(!defined(ACE_LACKS_SETSCHED) || \
|
|
defined (ACE_HAS_PTHREAD_SCHEDPARAM))
|
|
// including STHREADS, and PTHREADS
|
|
int const max = priority_max (policy, scope);
|
|
return priority < max ? priority + 1 : max;
|
|
#elif defined (ACE_VXWORKS) || defined (ACE_HAS_WINCE)
|
|
int const max = priority_max (policy, scope);
|
|
return priority > max ? priority - 1 : max;
|
|
#else
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
ACE_UNUSED_ARG (priority);
|
|
ACE_NOTSUP_RETURN (-1);
|
|
#endif /* ACE_HAS_THREADS */
|
|
}
|
|
|
|
int
|
|
ACE_Sched_Params::previous_priority (const Policy policy,
|
|
const int priority,
|
|
const int scope)
|
|
{
|
|
#if defined (ACE_HAS_WTHREADS) && !defined (ACE_HAS_WINCE)
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
switch (priority)
|
|
{
|
|
case THREAD_PRIORITY_IDLE:
|
|
return THREAD_PRIORITY_IDLE;
|
|
case THREAD_PRIORITY_LOWEST:
|
|
return THREAD_PRIORITY_IDLE;
|
|
case THREAD_PRIORITY_BELOW_NORMAL:
|
|
return THREAD_PRIORITY_LOWEST;
|
|
case THREAD_PRIORITY_NORMAL:
|
|
return THREAD_PRIORITY_BELOW_NORMAL;
|
|
case THREAD_PRIORITY_ABOVE_NORMAL:
|
|
return THREAD_PRIORITY_NORMAL;
|
|
case THREAD_PRIORITY_HIGHEST:
|
|
return THREAD_PRIORITY_ABOVE_NORMAL;
|
|
case THREAD_PRIORITY_TIME_CRITICAL:
|
|
return THREAD_PRIORITY_HIGHEST;
|
|
default:
|
|
return priority; // unknown priority: should never get here
|
|
}
|
|
#elif defined(ACE_HAS_THREADS) && \
|
|
(!defined(ACE_LACKS_SETSCHED) || \
|
|
defined (ACE_HAS_PTHREAD_SCHEDPARAM))
|
|
// including STHREADS and PTHREADS
|
|
int const min = priority_min (policy, scope);
|
|
return priority > min ? priority - 1 : min;
|
|
#elif defined (ACE_VXWORKS) || defined (ACE_HAS_WINCE)
|
|
int const min = priority_min (policy, scope);
|
|
return priority < min ? priority + 1 : min;
|
|
#else
|
|
ACE_UNUSED_ARG (policy);
|
|
ACE_UNUSED_ARG (scope);
|
|
ACE_UNUSED_ARG (priority);
|
|
ACE_NOTSUP_RETURN (-1);
|
|
#endif /* ACE_HAS_THREADS */
|
|
}
|
|
|
|
ACE_END_VERSIONED_NAMESPACE_DECL
|