diff options
author | William R. Otte <wotte@dre.vanderbilt.edu> | 2008-03-04 14:51:23 +0000 |
---|---|---|
committer | William R. Otte <wotte@dre.vanderbilt.edu> | 2008-03-04 14:51:23 +0000 |
commit | 99aa8c60282c7b8072eb35eb9ac815702f5bf586 (patch) | |
tree | bda96bf8c3a4c2875a083d7b16720533c8ffeaf4 /ACE/ace/Sched_Params.h | |
parent | c4078c377d74290ebe4e66da0b4975da91732376 (diff) | |
download | ATCD-99aa8c60282c7b8072eb35eb9ac815702f5bf586.tar.gz |
undoing accidental deletion
Diffstat (limited to 'ACE/ace/Sched_Params.h')
-rw-r--r-- | ACE/ace/Sched_Params.h | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/ACE/ace/Sched_Params.h b/ACE/ace/Sched_Params.h new file mode 100644 index 00000000000..36e2935bb87 --- /dev/null +++ b/ACE/ace/Sched_Params.h @@ -0,0 +1,232 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Sched_Params.h + * + * $Id$ + * + * @author David Levine <levine@cs.wustl.edu> + * @author Carlos O'Ryan <coryan@uci.edu> + */ +//============================================================================= + +#ifndef ACE_SCHED_PARAMS_H +#define ACE_SCHED_PARAMS_H +#include /**/ "ace/pre.h" + +#include /**/ "ace/ACE_export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "ace/Time_Value.h" +#include "ace/OS_NS_Thread.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL + +/** + * @class ACE_Sched_Params + * + * @brief Container for scheduling-related parameters. + * + * ACE_Sched_Params are passed via <ACE_OS::sched_params> to the + * OS to specify scheduling parameters. These parameters include + * scheduling policy, such as FIFO (ACE_SCHED_FIFO), round-robin + * (ACE_SCHED_RR), or an implementation-defined "OTHER" + * (ACE_SCHED_OTHER), to which many systems default; priority; + * and a time-slice quantum for round-robin scheduling. A + * "scope" parameter specifies whether the ACE_Sched_Params + * applies to the current process, current lightweight process + * (LWP) (on Solaris), or current thread. Please see the "NOTE" + * below about not all combinations of parameters being legal on + * a particular platform. + * For the case of thread priorities, it is intended that + * <ACE_OS::sched_params> usually be called from <main> before + * any threads have been spawned. If spawned threads inherit + * their parent's priority (I think that's the default behavior + * for all of our platforms), then this sets the default base + * priority. Individual thread priorities can be adjusted as + * usual using <ACE_OS::thr_prio> or via the ACE_Thread + * interface. See the parameter descriptions in the private: + * section below. + * @note This class does not do any checking of parameters. It + * is just a container class. If it is constructed with values + * that are not supported on a platform, the call to + * <ACE_OS::sched_params> will fail by returning -1 with EINVAL + * (available through <ACE_OS::last_error>). + */ +class ACE_Export ACE_Sched_Params +{ + // NOTE: Solaris 2.5.x threads in the RT class must set the + // priority of their LWP. The only way to do that through ACE is + // for the RT thread itself to call <ACE_OS::thr_setprio> with + // it's own priority. + + // OS Scheduling parameters are complicated and often confusing. + // Many thanks to Thilo Kielmann + // <kielmann@informatik.uni-siegen.de> for his careful review of + // this class design, thoughtful comments, and assistance with + // implementation, especially for PTHREADS platforms. Please + // send any comments or corrections to the ACE developers. +public: + typedef int Policy; + + // = Initialization and termination methods. + /// Constructor. + ACE_Sched_Params (const Policy policy, + const ACE_Sched_Priority priority, + const int scope = ACE_SCOPE_THREAD, + const ACE_Time_Value &quantum = ACE_Time_Value::zero); + + /// Termination. + ~ACE_Sched_Params (void); + + // = Get/Set methods: + + // = Get/Set policy + Policy policy (void) const; + void policy (const Policy); + + // = Get/Set priority. + ACE_Sched_Priority priority (void) const; + void priority (const ACE_Sched_Priority); + + // = Get/Set scope. + int scope (void) const; + void scope(const int); + + // = Get/Set quantum. + const ACE_Time_Value &quantum (void) const; + void quantum (const ACE_Time_Value &); + + // = Accessors for OS-specific priorities. + // These return priority values for ACE_SCHED_OTHER if the Policy value + // is invalid. + static int priority_min (const Policy, + const int scope = ACE_SCOPE_THREAD); + static int priority_max (const Policy, + const int scope = ACE_SCOPE_THREAD); + + /** + * The next higher priority. "Higher" refers to scheduling priority, + * not to the priority value itself. (On some platforms, higher scheduling + * priority is indicated by a lower priority value.) If "priority" is + * already the highest priority (for the specified policy), then it is + * returned. + */ + static int next_priority (const Policy, + const int priority, + const int scope = ACE_SCOPE_THREAD); + + /** + * The previous, lower priority. "Lower" refers to scheduling priority, + * not to the priority value itself. (On some platforms, lower scheduling + * priority is indicated by a higher priority value.) If "priority" is + * already the lowest priority (for the specified policy), then it is + * returned. + */ + static int previous_priority (const Policy, + const int priority, + const int scope = ACE_SCOPE_THREAD); + +private: + /// Scheduling policy. + Policy policy_; + + /// Default <priority_>: for setting the priority for the process, LWP, + /// or thread, as indicated by the scope_ parameter. + ACE_Sched_Priority priority_; + + /** + * <scope_> must be one of the following: + * ACE_SCOPE_PROCESS: sets the scheduling policy for the + * process, and the process priority. On some platforms, + * such as Win32, the scheduling policy can _only_ be + * set at process scope. + * ACE_SCOPE_LWP: lightweight process scope, only used with + * Solaris threads. + * ACE_SCOPE_THREAD: sets the scheduling policy for the thread, + * if the OS supports it, such as with Posix threads, and the + * thread priority. + * NOTE: I don't think that these are the same as POSIX + * contention scope. POSIX users who are interested in, + * and understand, contention scope will have to set it + * by using system calls outside of ACE. + */ + int scope_; + + /** + * The <quantum_> is for time slicing. An ACE_Time_Value of 0 has + * special significance: it means time-slicing is disabled; with + * that, a thread that is running on a CPU will continue to run + * until it blocks or is preempted. Currently ignored if the OS + * doesn't directly support time slicing, such as on VxWorks, or + * setting the quantum (can that be done on Win32?). + */ + ACE_Time_Value quantum_; +}; + +/** + * @class ACE_Sched_Priority_Iterator + * + * @brief An iterator over the OS-defined scheduling priorities. + * + * The order of priorities (numeric value vs. importance) is OS + * dependant, it can be the case that the priorities are not even + * contigous. This class permits iteration over priorities using + * the iterator pattern. + */ +class ACE_Export ACE_Sched_Priority_Iterator +{ +public: + /// Initialize the iterator, the arguments define the scheduling + /// policy and scope for the priorities (see ACE_Sched_Param). + ACE_Sched_Priority_Iterator (const ACE_Sched_Params::Policy &policy, + int scope = ACE_SCOPE_THREAD); + + /// Default dtor. + ~ACE_Sched_Priority_Iterator (void); + + /// Check if there are more priorities. + int more (void) const; + + /// Return the current priority. + int priority (void) const; + + /// Move to the next priority. + /// The iteration is from lowest to highest importance. + void next (void); + + /// Accessor for the scheduling policy over which we are iterating. + const ACE_Sched_Params::Policy &policy (void) const; + + /// Accessor for the scheduling + int scope (void) const; + +private: + /// The Scheduling policy (FIFO, RR, etc.) and scheduling scope + /// (PROCESS, SYSTEM) we are iterating on. + ACE_Sched_Params::Policy policy_; + int scope_; + + /// The current priority. + int priority_; + + /** + * This is set to 1 when there are no more priorities. Cannot easily + * compare against the highest priority on platforms were priorities + * are non-contigous or descending. + */ + int done_; +}; + +ACE_END_VERSIONED_NAMESPACE_DECL + +#if defined (__ACE_INLINE__) +#include "ace/Sched_Params.inl" +#endif /* __ACE_INLINE__ */ + +#include /**/ "ace/post.h" +#endif /* ACE_SCHED_PARAMS_H */ |