NAME

ACE_TP_Reactor - Specialization of Select Reactor to support thread-pool based event dispatching.

SYNOPSIS

#include <ace/TP_Reactor.h>

class ACE_TP_Reactor : public ACE_Select_Reactor { public: ACE_TP_Reactor ( ACE_Sig_Handler * = 0, ACE_Timer_Queue * = 0, int mask_signals = 1 ); ACE_TP_Reactor ( size_t max_number_of_handles, int restart = 0, ACE_Sig_Handler * = 0, ACE_Timer_Queue * = 0, int mask_signals = 1 ); virtual int handle_events (ACE_Time_Value *max_wait_time = 0); virtual int handle_events (ACE_Time_Value &max_wait_time); virtual int mask_ops ( ACE_Event_Handler *eh, ACE_Reactor_Mask mask, int ops ); virtual int mask_ops ( ACE_HANDLE handle, ACE_Reactor_Mask mask, int ops ); static void no_op_sleep_hook (void *); virtual void wakeup_all_threads (void); ACE_ALLOC_HOOK_DECLARE; protected: virtual int dispatch_io_set ( int number_of_active_handles, int& number_dispatched, int mask, ACE_Handle_Set& dispatch_mask, ACE_Handle_Set& ready_mask, ACE_EH_PTMF callback ); virtual void notify_handle ( ACE_HANDLE handle, ACE_Reactor_Mask mask, ACE_Handle_Set &, ACE_Event_Handler *eh, ACE_EH_PTMF callback ); virtual int notify_handle (ACE_EH_Dispatch_Info &dispatch_info); ACE_EH_Dispatch_Info dispatch_info_; private: ACE_TP_Reactor (const ACE_TP_Reactor &); ACE_TP_Reactor &operator = (const ACE_TP_Reactor &); };

DESCRIPTION

TP_Reactor (ala, Thread Pool Reactor) uses the leader-follower model to demultiplex requests among a bunch of threads. Basically, when using thread pool reactor, one will pre-spawn a _fixed_ number of threads. When you issue the run_event_loop method, one of the thread will become the leader thread and wait for an event. The other threads (followers) will be lined up and waiting for their turns to become the leader. When an event occurs, the leader will pick a follower to become the leader and go on to handle the event. The consequence of using TP_Reactor is the amortization of the costs used to creating threads. The context switching cost will also reduce. More over, the total resources used by threads are bounded (because there are only so many threads.)

Initialization and termination methods.

ACE_TP_Reactor (
    ACE_Sig_Handler * = 0,
    ACE_Timer_Queue * = 0,
    int mask_signals = 1
    );

ACE_TP_Reactor (
    size_t max_number_of_handles,
    int restart = 0,
    ACE_Sig_Handler * = 0,
    ACE_Timer_Queue * = 0,
    int mask_signals = 1
    );

Event loop drivers.

virtual int handle_events (ACE_Time_Value *max_wait_time = 0);

virtual int handle_events (ACE_Time_Value &max_wait_time);

virtual int mask_ops (
    ACE_Event_Handler *eh,
    ACE_Reactor_Mask mask,
    int ops
    );

virtual int mask_ops (
    ACE_HANDLE handle,
    ACE_Reactor_Mask mask,
    int ops
    );

static void no_op_sleep_hook (void *);

virtual void wakeup_all_threads (void);

ACE_ALLOC_HOOK_DECLARE;

Internal methods that do the actual work.

virtual int dispatch_io_set (
    int number_of_active_handles,
    int& number_dispatched,
    int mask,
    ACE_Handle_Set& dispatch_mask,
    ACE_Handle_Set& ready_mask,
    ACE_EH_PTMF callback
    );

virtual void notify_handle (
    ACE_HANDLE handle,
    ACE_Reactor_Mask mask,
    ACE_Handle_Set &,
    ACE_Event_Handler *eh,
    ACE_EH_PTMF callback
    );

virtual int notify_handle (ACE_EH_Dispatch_Info &dispatch_info);

ACE_EH_Dispatch_Info dispatch_info_;

AUTHOR

Irfan Pyarali Nanbor Wang

LIBRARY

ace