📄 dispatching_modules.h
字号:
int open (void);
/// Removes self from the reactor.
void shutdown (void);
// = These result in eh_->handle_signal getting called. eh_ should
// point to a dispatching module.
virtual int notify (void);
virtual int notify (ACE_Event_Handler *,
ACE_Reactor_Mask mask);
// ACE_HANDLE get_handle (void);
// Returns event_.handle ().
private:
/// Registered with the ReactorEx.
ACE_Auto_Event event_;
/// To schedule timers.
TAO_EC_Timer_Module *timer_module_;
};
typedef ACE_ES_ReactorEx_NS ACE_ES_Notification_Strategy;
#else // *******************************************************
/**
* @class ACE_ES_Reactor_NS
*
* @brief Event Service Reactor Notification Strategy
*
* Maps to the ACE_Reactor_Notification_Strategy interface. This
* version is for non WIN32 platforms.
*/
class TAO_RTOLDEvent_Export ACE_ES_Reactor_NS : public ACE_Reactor_Notification_Strategy
{
public:
/// Calls ACE_Reactor_Notification_Strategy with the ORB's reactor
/// and signal mask.
ACE_ES_Reactor_NS (ACE_Event_Handler *eh,
TAO_EC_Timer_Module *tm);
/// Does nothing.
int open (void);
/// Does nothing.
void shutdown (void);
};
typedef ACE_ES_Reactor_NS ACE_ES_Notification_Strategy;
#endif /* ACE_WIN32 */
// ************************************************************
/**
* @class ACE_ES_MQ
*
* @brief Event Service Message Queue
*/
class TAO_RTOLDEvent_Export ACE_ES_MQ : public ACE_ES_QUEUE
{
/// Does nothing.
virtual int notify (void) { return 0;}
};
// ************************************************************
/**
* @class ACE_ES_Dispatch_Queue
*
* @brief Event Service Dispatch Queue
*
* An encapsulation of a dispatch queue. By inheriting from
* ACE_RT_Task, we can make this zero-threaded or multi-threaded.
*/
class TAO_RTOLDEvent_Export ACE_ES_Dispatch_Queue : public ACE_RT_Task
{
public:
/// Stores <dispatching_module> for this->threads_closed. Stores
/// away <notification_strategy> for this->synch_threads.
ACE_ES_Dispatch_Queue (ACE_ES_Dispatching_Base *dispatching_module,
ACE_ES_Notification_Strategy *notification_strategy,
RtecScheduler::Scheduler_ptr scheduler);
/// This is a hack to get the channel to work with the new
/// scheduler.
int open_queue (RtecScheduler::Period_t &period,
int threads);
#if 0
/**
* Creates a name from the <priority> and tries to find a scheduling
* qos structure. If one is not found, but created, qos_ is set
* with default values. Either way, if qos_->thread_ > 0, it calls
* this->synch_threads. Otherwise, our message queue will use
* notification_strategy_. This will cause the ReactorEx to call
* back the dispatching_module_ when requests are queued on our
* message queue. Returns 0 on success, -1 on failure.
*/
int open_queue (RtecScheduler::OS_Priority priority,
int threads);
#endif
/// Called when every thread has exited. This will call
/// dispatching_module_->dispatch_queue_closed.
virtual void threads_closed (void);
private:
/// Used in threads_closed.
ACE_ES_Dispatching_Base *dispatching_module_;
/// Notifies the Dispatching Module when a request has been queued on
/// our message queue.
ACE_ES_Notification_Strategy *notification_strategy_;
};
// ************************************************************
/**
* @class ACE_ES_Priority_Dispatching
*
* @brief Event Service Priority Dispatching Module
*
* Inherits from ACE_Event_Handler to utilitize the
* ACE_Message_Queue notification strategy. This implementation
* does priority dispatching without preemption.
*/
class TAO_RTOLDEvent_Export ACE_ES_Priority_Dispatching : public ACE_ES_Dispatching_Base
{
public:
/// Store <channel>.
ACE_ES_Priority_Dispatching (ACE_EventChannel *channel);
/// Delete queues.
~ACE_ES_Priority_Dispatching (void);
/// Allocate any needed dispatching resources for this consumers
/// priority.
void connected (ACE_Push_Consumer_Proxy *consumer
ACE_ENV_ARG_DECL_NOT_USED);
/// Release unneeded dispatch queues.
void disconnected (ACE_Push_Consumer_Proxy *consumer);
// = Not needed.
// void connected (ACE_Push_Supplier_Proxy *supplier);
// void disconnecting (ACE_Push_Supplier_Proxy *supplier);
/// Enqueues the request on the appropriate Dispatch Queue.
virtual void push (ACE_ES_Dispatch_Request *request
ACE_ENV_ARG_DECL_NOT_USED);
/**
* Open all queues.
* Spawns <threads_per_queue> thread for each dispatch queue.
* If != 0, then the channel is an MT_CHANNEL.
* If == 0, then the channel is an ST_CHANNEL.
*/
virtual void activate (int threads_per_queue);
/// Closes all queues "asynchronously." When all queues are closed,
/// deletes them all and then deletes itself.
virtual void shutdown (void);
/// Called when all the threads of a <q> have exited. Deletes <q>.
virtual void dispatch_queue_closed (ACE_ES_Dispatch_Queue *q);
// virtual ACE_HANDLE get_handle (void) const;
// Get the I/O handle.
protected:
/// Called when input has arrived on a message queue. This is used
/// for single-threaded implementations.
virtual int handle_signal (int signum, siginfo_t * = 0, ucontext_t * = 0);
/**
* For single-threaded implementations on non-win32 platforms that
* use the ACE_Reactor_Notification_Strategy. This just forwards
* all calls to this->handle_signal ().
*/
virtual int handle_input (ACE_HANDLE);
/// Shared between all dispatch queues.
ACE_ES_Notification_Strategy notification_strategy_;
/// This is a hack to create a queue for each of the 4 rate groups.
void initialize_queues (void);
/// Pointers to dispatch queues.
ACE_ES_Dispatch_Queue *queues_[ACE_Scheduler_MAX_PRIORITIES];
/// The number of consumers using each queue.
int queue_count_[ACE_Scheduler_MAX_PRIORITIES];
/// The highest priority queue in queues_. This allows us to
/// optimize the handle_signal method.
int highest_priority_;
/// Make sure to only shutdown the dispatching module once.
int shutdown_;
/// The number of threads to spawn for each dispatch queue.
int threads_per_queue_;
/// The thread manager for the threads of this object.
ACE_RT_Thread_Manager thr_mgr_;
/// The scheduler.
RtecScheduler::Scheduler_var scheduler_;
};
// ************************************************************
/**
* @class ACE_ES_EFD_Dispatching
*
* @brief Event Service EFD Dispatching Module
*
* Implements a zero-threaded dispatcher with no preemption.
*/
class TAO_RTOLDEvent_Export ACE_ES_EFD_Dispatching : public ACE_ES_Dispatching_Base
{
public:
/// Acquires the proper qos structure and passes <channel> onto to
/// the dispatching base constructor.
ACE_ES_EFD_Dispatching (ACE_EventChannel *channel);
/// Forward up_.
virtual void push (ACE_ES_Dispatch_Request *request
ACE_ENV_ARG_DECL_NOT_USED);
};
// ************************************************************
/**
* @class ACE_ES_RTU_Dispatching
*
* @brief Event Service RTU Dispatching Module
*
* Implements a single-threaded dispatcher with delayed preemption.
*/
class TAO_RTOLDEvent_Export ACE_ES_RTU_Dispatching : public ACE_ES_Priority_Dispatching
{
public:
/// Store <channel>.
ACE_ES_RTU_Dispatching (ACE_EventChannel *channel);
/**
* Called by ACE_Dispatch_Queues and handle_signal when an event
* needs to be dequeued. Implements an RTU-like delayed preemption
* policy.
*/
virtual int dispatch_event (ACE_ES_Dispatch_Request *request,
u_long &command_action);
/// Calls ACE_ES_Priority_Dispatching::push and then checks if
/// preemption is necessary.
virtual void push (ACE_ES_Dispatch_Request *request
ACE_ENV_ARG_DECL_NOT_USED);
};
#if defined (__ACE_INLINE__)
#include "Dispatching_Modules.i"
#endif /* __ACE_INLINE__ */
#include /**/ "ace/post.h"
#endif /* ACE_DISPATCHING_MODULES_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -