NAME

ACE_WFMO_Reactor -

An object oriented event demultiplexor and event handler WFMO_Reactor for Win32 WaitForMultipleObjects

SYNOPSIS

#include <ace/WFMO_Reactor.h>

class ACE_WFMO_Reactor : public ACE_Reactor_Impl { public: friend class ACE_WFMO_Reactor_Handler_Repository; friend class ACE_WFMO_Reactor_Test; enum{ DEFAULT_SIZE = MAXIMUM_WAIT_OBJECTS - 2 }; ACE_WFMO_Reactor (ACE_Sig_Handler * = 0, ACE_Timer_Queue * = 0); ACE_WFMO_Reactor ( size_t size, int unused = 0, ACE_Sig_Handler * = 0, ACE_Timer_Queue * = 0 ); virtual int open ( size_t size = DEFAULT_SIZE, int restart = 0, ACE_Sig_Handler * = 0, ACE_Timer_Queue * = 0 ); virtual int set_sig_handler (ACE_Sig_Handler *signal_handler); virtual int set_timer_queue (ACE_Timer_Queue *timer_queue); virtual int close (void); virtual ~ACE_WFMO_Reactor (void); virtual int handle_events (ACE_Time_Value *max_wait_time = 0); virtual int alertable_handle_events ( ACE_Time_Value *max_wait_time = 0 ); virtual int handle_events (ACE_Time_Value &max_wait_time); virtual int alertable_handle_events ( ACE_Time_Value &max_wait_time ); virtual int register_handler ( ACE_Event_Handler *event_handler, ACE_HANDLE event_handle = ACE_INVALID_HANDLE ); virtual int register_handler ( ACE_HANDLE event_handle, ACE_HANDLE io_handle, ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask ); virtual int register_handler ( ACE_HANDLE io_handle, ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask ); virtual int register_handler ( ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask ); virtual int register_handler ( const ACE_Handle_Set &handles, ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask ); virtual int register_handler ( int signum, ACE_Event_Handler *new_sh, ACE_Sig_Action *new_disp = 0, ACE_Event_Handler **old_sh = 0, ACE_Sig_Action *old_disp = 0 ); virtual int register_handler ( const ACE_Sig_Set &sigset, ACE_Event_Handler *new_sh, ACE_Sig_Action *new_disp = 0 ); virtual int remove_handler ( ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask ); virtual int remove_handler ( ACE_HANDLE handle, ACE_Reactor_Mask mask ); virtual int remove_handler ( const ACE_Handle_Set &handle_set, ACE_Reactor_Mask ); virtual int remove_handler ( int signum, ACE_Sig_Action *new_disp, ACE_Sig_Action *old_disp = 0, int sigkey = -1 ); virtual int remove_handler (const ACE_Sig_Set &sigset); virtual int suspend_handler (ACE_Event_Handler *event_handler); virtual int suspend_handler (ACE_HANDLE handle); virtual int suspend_handler (const ACE_Handle_Set &handles); virtual int suspend_handlers (void); virtual int resume_handler (ACE_Event_Handler *event_handler); virtual int resume_handler (ACE_HANDLE handle); virtual int resume_handler (const ACE_Handle_Set &handles); virtual int resume_handlers (void); virtual int uses_event_associations (void); virtual long schedule_timer ( ACE_Event_Handler *event_handler, const void *arg, const ACE_Time_Value &delta, const ACE_Time_Value &interval = ACE_Time_Value::zero ); virtual int cancel_timer ( ACE_Event_Handler *event_handler, int dont_call_handle_close = 1 ); virtual int cancel_timer ( long timer_id, const void **arg = 0, int dont_call_handle_close = 1 ); virtual int schedule_wakeup ( ACE_Event_Handler *event_handler, ACE_Reactor_Mask masks_to_be_added ); virtual int schedule_wakeup ( ACE_HANDLE handle, ACE_Reactor_Mask masks_to_be_added ); virtual int cancel_wakeup ( ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask ); virtual int cancel_wakeup ( ACE_HANDLE handle, ACE_Reactor_Mask mask ); virtual int notify ( ACE_Event_Handler * = 0, ACE_Reactor_Mask = ACE_Event_Handler::EXCEPT_MASK, ACE_Time_Value * = 0 ); virtual void max_notify_iterations (int); virtual int max_notify_iterations (void); virtual int handler ( ACE_HANDLE handle, ACE_Reactor_Mask mask, ACE_Event_Handler **event_handler = 0 ); virtual int handler (int signum, ACE_Event_Handler ** = 0); virtual int initialized (void); virtual size_t size (void); virtual ACE_Lock &lock (void); virtual void wakeup_all_threads (void); virtual int owner ( ACE_thread_t new_owner, ACE_thread_t *old_owner = 0 ); virtual int owner (ACE_thread_t *owner); virtual void requeue_position (int); virtual int requeue_position (void); virtual int mask_ops ( ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask, int ops ); virtual int mask_ops ( ACE_HANDLE handle, ACE_Reactor_Mask mask, int ops ); virtual int ready_ops ( ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask, int ops ); virtual int ready_ops ( ACE_HANDLE handle, ACE_Reactor_Mask, int ops ); ACE_ALLOC_HOOK_DECLARE; virtual void dump (void) const; protected: virtual int schedule_wakeup_i ( ACE_HANDLE handle, ACE_Reactor_Mask masks_to_be_added ); virtual int register_handler_i ( ACE_HANDLE event_handle, ACE_HANDLE io_handle, ACE_Event_Handler *event_handler, ACE_Reactor_Mask mask ); virtual int event_handling ( ACE_Time_Value *max_wait_time = 0, int alertable = 0 ); virtual ACE_thread_t owner_i (void); virtual int ok_to_wait ( ACE_Time_Value *max_wait_time, int alertable ); virtual int wait_for_multiple_events (int timeout, int alertable); virtual DWORD poll_remaining_handles (size_t index); virtual int expire_timers (void); virtual int dispatch (int wait_status); virtual int safe_dispatch (int wait_status); virtual int dispatch_handles (size_t index); virtual int dispatch_handler (size_t index, size_t max_handlep1); virtual int simple_dispatch_handler ( int index, ACE_HANDLE event_handle ); virtual int complex_dispatch_handler ( int index, ACE_HANDLE event_handle ); virtual int dispatch_window_messages (void); virtual ACE_Reactor_Mask upcall ( ACE_Event_Handler *event_handler, ACE_HANDLE io_handle, ACE_HANDLE event_handle, long interested_events ); virtual int calculate_timeout (ACE_Time_Value *time); virtual int update_state (void); virtual int new_owner (void); virtual int change_owner (void); ACE_Sig_Handler *signal_handler_; int delete_signal_handler_; ACE_Timer_Queue *timer_queue_; int delete_timer_queue_; int delete_handler_rep_; ACE_Process_Mutex lock_; ACE_Lock_Adapter<ACE_Process_Mutex> lock_adapter_; ACE_WFMO_Reactor_Handler_Repository handler_rep_; ACE_WFMO_Reactor_Notify notify_handler_; ACE_Manual_Event ok_to_wait_; ACE_Manual_Event wakeup_all_threads_; ACE_Wakeup_All_Threads_Handler wakeup_all_threads_handler_; ACE_Auto_Event waiting_to_change_state_; size_t active_threads_; ACE_thread_t owner_; ACE_thread_t new_owner_; ACE_thread_t change_state_thread_; ACE_HANDLE atomic_wait_array_ [2]; int open_for_business_; private: ACE_WFMO_Reactor (const ACE_WFMO_Reactor &); ACE_WFMO_Reactor &operator = (const ACE_WFMO_Reactor &); };

DESCRIPTION

The ACE_WFMO_Reactor is an object-oriented event demultiplexor and event handler Reactor. The sources of events that the ACE_WFMO_Reactor waits for and dispatches includes I/O events, general Win32 synchronization events (such as mutexes, semaphores, threads, etc.) and timer events.

Note that changes to the state of WFMO_Reactor are not instantaneous. Most changes (registration, removal, suspension, and resumption of handles, and changes in ownership) are made when the WFMO_Reactor reaches a stable state. Users should be careful, specially when removing handlers. This is because the WFMO_Reactor will call handle_close on the handler when it is finally removed and not when remove_handler is called. If the handler is not going to be around when the WFMO_Reactor calls handler-handle_close(), use the DONT_CALL flag with remove_handler(). Or else, dynamically allocate the handler, and then call "delete this" inside handler-handle_close().

Initialization and termination methods.

ACE_WFMO_Reactor (ACE_Sig_Handler * = 0, ACE_Timer_Queue * = 0);

ACE_WFMO_Reactor (
    size_t size,
    int unused = 0,
    ACE_Sig_Handler * = 0,
    ACE_Timer_Queue * = 0
    );

virtual int open (
    size_t size = DEFAULT_SIZE,
    int restart = 0,
    ACE_Sig_Handler * = 0,
    ACE_Timer_Queue * = 0
    );

virtual int set_sig_handler (ACE_Sig_Handler *signal_handler);

virtual int set_timer_queue (ACE_Timer_Queue *timer_queue);

virtual int close (void);

virtual ~ACE_WFMO_Reactor (void);

Event loop drivers.

virtual int handle_events (ACE_Time_Value *max_wait_time = 0);

virtual int alertable_handle_events (
    ACE_Time_Value *max_wait_time = 0
    );

virtual int handle_events (ACE_Time_Value &max_wait_time);

virtual int alertable_handle_events (ACE_Time_Value &max_wait_time);

Register and remove Handlers.

virtual int register_handler (
    ACE_Event_Handler *event_handler,
    ACE_HANDLE event_handle = ACE_INVALID_HANDLE
    );

virtual int register_handler (
    ACE_HANDLE event_handle,
    ACE_HANDLE io_handle,
    ACE_Event_Handler *event_handler,
    ACE_Reactor_Mask mask
    );

virtual int register_handler (
    ACE_HANDLE io_handle,
    ACE_Event_Handler *event_handler,
    ACE_Reactor_Mask mask
    );

virtual int register_handler (
    ACE_Event_Handler *event_handler,
    ACE_Reactor_Mask mask
    );

virtual int register_handler (
    const ACE_Handle_Set &handles,
    ACE_Event_Handler *event_handler,
    ACE_Reactor_Mask mask
    );

virtual int register_handler (
    int signum,
    ACE_Event_Handler *new_sh,
    ACE_Sig_Action *new_disp = 0,
    ACE_Event_Handler **old_sh = 0,
    ACE_Sig_Action *old_disp = 0
    );

virtual int register_handler (
    const ACE_Sig_Set &sigset,
    ACE_Event_Handler *new_sh,
    ACE_Sig_Action *new_disp = 0
    );

virtual int remove_handler (
    ACE_Event_Handler *event_handler,
    ACE_Reactor_Mask mask
    );

virtual int remove_handler (ACE_HANDLE handle, ACE_Reactor_Mask mask);

virtual int remove_handler (
    const ACE_Handle_Set &handle_set,
    ACE_Reactor_Mask
    );

virtual int remove_handler (
    int signum,
    ACE_Sig_Action *new_disp,
    ACE_Sig_Action *old_disp = 0,
    int sigkey = -1
    );

virtual int remove_handler (const ACE_Sig_Set &sigset);

Suspend and resume Handlers.

virtual int suspend_handler (ACE_Event_Handler *event_handler);

virtual int suspend_handler (ACE_HANDLE handle);

virtual int suspend_handler (const ACE_Handle_Set &handles);

virtual int suspend_handlers (void);

virtual int resume_handler (ACE_Event_Handler *event_handler);

virtual int resume_handler (ACE_HANDLE handle);

virtual int resume_handler (const ACE_Handle_Set &handles);

virtual int resume_handlers (void);

virtual int uses_event_associations (void);

Timer management.

virtual long schedule_timer (
    ACE_Event_Handler *event_handler,
    const void *arg,
    const ACE_Time_Value &delta,
    const ACE_Time_Value &interval = ACE_Time_Value::zero
    );

virtual int cancel_timer (
    ACE_Event_Handler *event_handler,
    int dont_call_handle_close = 1
    );

virtual int cancel_timer (
    long timer_id,
    const void **arg = 0,
    int dont_call_handle_close = 1
    );

High-level Event_Handler scheduling operations

virtual int schedule_wakeup (
    ACE_Event_Handler *event_handler,
    ACE_Reactor_Mask masks_to_be_added
    );

virtual int schedule_wakeup (
    ACE_HANDLE handle,
    ACE_Reactor_Mask masks_to_be_added
    );

virtual int cancel_wakeup (
    ACE_Event_Handler *event_handler,
    ACE_Reactor_Mask mask
    );

virtual int cancel_wakeup (ACE_HANDLE handle, ACE_Reactor_Mask mask);

Notification methods.

virtual int notify (
    ACE_Event_Handler * = 0,
    ACE_Reactor_Mask = ACE_Event_Handler::EXCEPT_MASK,
    ACE_Time_Value * = 0
    );

virtual void max_notify_iterations (int);

virtual int max_notify_iterations (void);

virtual int handler (
    ACE_HANDLE handle,
    ACE_Reactor_Mask mask,
    ACE_Event_Handler **event_handler = 0
    );

virtual int handler (int signum, ACE_Event_Handler ** = 0);

virtual int initialized (void);

virtual size_t size (void);

virtual ACE_Lock &lock (void);

virtual void wakeup_all_threads (void);

virtual int owner (
    ACE_thread_t new_owner,
    ACE_thread_t *old_owner = 0
    );

virtual int owner (ACE_thread_t *owner);

virtual void requeue_position (int);

virtual int requeue_position (void);

Low-level wait_set mask manipulation methods.

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

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

Low-level ready_set mask manipulation methods.

virtual int ready_ops (
    ACE_Event_Handler *event_handler,
    ACE_Reactor_Mask mask,
    int ops
    );

virtual int ready_ops (ACE_HANDLE handle, ACE_Reactor_Mask, int ops);

ACE_ALLOC_HOOK_DECLARE;

virtual void dump (void) const;

AUTHOR

Irfan Pyarali, Tim Harrison, and Doug Schmidt

LIBRARY

ace