#include <ace/WIN_Proactor.h>
class ACE_WIN32_Proactor : public ACE_Proactor_Impl {
public:
ACE_WIN32_Proactor ( size_t number_of_threads = 0, int used_with_reactor_event_loop = 0 );
virtual ~ACE_WIN32_Proactor (void);
virtual int close (void);
virtual int register_handle ( ACE_HANDLE handle, const void *completion_key );
virtual int handle_events (ACE_Time_Value &wait_time);
virtual int handle_events (void);
virtual int post_completion (ACE_WIN32_Asynch_Result *result);
int wake_up_dispatch_threads (void);
int close_dispatch_threads (int wait);
size_t number_of_threads (void) const;
void number_of_threads (size_t threads);
virtual ACE_HANDLE get_handle (void) const;
virtual ACE_Asynch_Read_Stream_Impl *create_asynch_read_stream ( void );
virtual ACE_Asynch_Write_Stream_Impl *create_asynch_write_stream ( void );
virtual ACE_Asynch_Read_File_Impl *create_asynch_read_file (void);
virtual ACE_Asynch_Write_File_Impl *create_asynch_write_file ( void );
virtual ACE_Asynch_Accept_Impl *create_asynch_accept (void);
virtual ACE_Asynch_Transmit_File_Impl *create_asynch_transmit_file ( void );
virtual ACE_Asynch_Read_Stream_Result_Impl *create_asynch_read_stream_result ( ACE_Handler &handler, ACE_HANDLE handle, ACE_Message_Block &message_block, u_long bytes_to_read, const void* act, ACE_HANDLE event, int priority, int signal_number = 0 );
virtual ACE_Asynch_Write_Stream_Result_Impl *create_asynch_write_stream_result ( ACE_Handler &handler, ACE_HANDLE handle, ACE_Message_Block &message_block, u_long bytes_to_write, const void* act, ACE_HANDLE event, int priority, int signal_number = 0 );
virtual ACE_Asynch_Read_File_Result_Impl *create_asynch_read_file_result ( ACE_Handler &handler, ACE_HANDLE handle, ACE_Message_Block &message_block, u_long bytes_to_read, const void* act, u_long offset, u_long offset_high, ACE_HANDLE event, int priority, int signal_number = 0 );
virtual ACE_Asynch_Write_File_Result_Impl *create_asynch_write_file_result ( ACE_Handler &handler, ACE_HANDLE handle, ACE_Message_Block &message_block, u_long bytes_to_write, const void* act, u_long offset, u_long offset_high, ACE_HANDLE event, int priority, int signal_number = 0 );
virtual ACE_Asynch_Accept_Result_Impl *create_asynch_accept_result ( ACE_Handler &handler, ACE_HANDLE listen_handle, ACE_HANDLE accept_handle, ACE_Message_Block &message_block, u_long bytes_to_read, const void* act, ACE_HANDLE event, int priority, int signal_number = 0 );
virtual ACE_Asynch_Transmit_File_Result_Impl *create_asynch_transmit_file_result ( ACE_Handler &handler, ACE_HANDLE socket, ACE_HANDLE file, ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer, u_long bytes_to_write, u_long offset, u_long offset_high, u_long bytes_per_send, u_long flags, const void *act, ACE_HANDLE event, int priority, int signal_number = 0 );
virtual ACE_Asynch_Result_Impl *create_asynch_timer ( ACE_Handler &handler, const void *act, const ACE_Time_Value &tv, ACE_HANDLE event, int priority, int signal_number = 0 );
protected:
virtual int handle_signal ( int signum, siginfo_t * = 0, ucontext_t * = 0 );
virtual int handle_close ( ACE_HANDLE handle, ACE_Reactor_Mask close_mask );
virtual int handle_events (unsigned long milli_seconds);
void application_specific_code ( ACE_WIN32_Asynch_Result *asynch_result, u_long bytes_transferred, int success, const void *completion_key, u_long error );
virtual int post_wakeup_completions (int how_many);
ACE_HANDLE completion_port_;
size_t number_of_threads_;
ACE_Auto_Event event_;
int used_with_reactor_event_loop_;
ACE_Handler wakeup_handler_;
};
ACE_WIN32_Proactor (
size_t number_of_threads = 0,
int used_with_reactor_event_loop = 0
);
virtual ~ACE_WIN32_Proactor (void);
virtual int close (void);
virtual int register_handle (
ACE_HANDLE handle,
const void *completion_key
);
handle
to the I/O completion port. This
function is a no-op function for Unix systems.
virtual int handle_events (ACE_Time_Value &wait_time);
wait_time
elapses before
any events occur, return 0. Return 1 on success i.e., when a
completion is dispatched, non-zero (-1) on errors and errno is
set accordingly.
virtual int handle_events (void);
wait_time
elapses before
any events occur, return 0. Return 1 on success i.e., when a
completion is dispatched, non-zero (-1) on errors and errno is
set accordingly.
virtual int post_completion (ACE_WIN32_Asynch_Result *result);
int wake_up_dispatch_threads (void);
int close_dispatch_threads (int wait);
size_t number_of_threads (void) const;
void number_of_threads (size_t threads);
virtual ACE_HANDLE get_handle (void) const;
virtual ACE_Asynch_Read_Stream_Impl *create_asynch_read_stream (void);
virtual ACE_Asynch_Write_Stream_Impl *create_asynch_write_stream (
void
);
virtual ACE_Asynch_Read_File_Impl *create_asynch_read_file (void);
virtual ACE_Asynch_Write_File_Impl *create_asynch_write_file (void);
virtual ACE_Asynch_Accept_Impl *create_asynch_accept (void);
virtual ACE_Asynch_Transmit_File_Impl *create_asynch_transmit_file (
void
);
virtual ACE_Asynch_Read_Stream_Result_Impl *create_asynch_read_stream_result (
ACE_Handler &handler,
ACE_HANDLE handle,
ACE_Message_Block &message_block,
u_long bytes_to_read,
const void* act,
ACE_HANDLE event,
int priority,
int signal_number = 0
);
virtual ACE_Asynch_Write_Stream_Result_Impl *create_asynch_write_stream_result (
ACE_Handler &handler,
ACE_HANDLE handle,
ACE_Message_Block &message_block,
u_long bytes_to_write,
const void* act,
ACE_HANDLE event,
int priority,
int signal_number = 0
);
virtual ACE_Asynch_Read_File_Result_Impl *create_asynch_read_file_result (
ACE_Handler &handler,
ACE_HANDLE handle,
ACE_Message_Block &message_block,
u_long bytes_to_read,
const void* act,
u_long offset,
u_long offset_high,
ACE_HANDLE event,
int priority,
int signal_number = 0
);
virtual ACE_Asynch_Write_File_Result_Impl *create_asynch_write_file_result (
ACE_Handler &handler,
ACE_HANDLE handle,
ACE_Message_Block &message_block,
u_long bytes_to_write,
const void* act,
u_long offset,
u_long offset_high,
ACE_HANDLE event,
int priority,
int signal_number = 0
);
virtual ACE_Asynch_Accept_Result_Impl *create_asynch_accept_result (
ACE_Handler &handler,
ACE_HANDLE listen_handle,
ACE_HANDLE accept_handle,
ACE_Message_Block &message_block,
u_long bytes_to_read,
const void* act,
ACE_HANDLE event,
int priority,
int signal_number = 0
);
virtual ACE_Asynch_Transmit_File_Result_Impl *create_asynch_transmit_file_result (
ACE_Handler &handler,
ACE_HANDLE socket,
ACE_HANDLE file,
ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer,
u_long bytes_to_write,
u_long offset,
u_long offset_high,
u_long bytes_per_send,
u_long flags,
const void *act,
ACE_HANDLE event,
int priority,
int signal_number = 0
);
virtual ACE_Asynch_Result_Impl *create_asynch_timer (
ACE_Handler &handler,
const void *act,
const ACE_Time_Value &tv,
ACE_HANDLE event,
int priority,
int signal_number = 0
);
virtual int handle_signal (
int signum,
siginfo_t * = 0,
ucontext_t * = 0
);
virtual int handle_close (
ACE_HANDLE handle,
ACE_Reactor_Mask close_mask
);
virtual int handle_events (unsigned long milli_seconds);
milli_seconds
elapses
before any events occur, return 0. Return 1 if a completion is
dispatched. Return -1 on errors.
void application_specific_code (
ACE_WIN32_Asynch_Result *asynch_result,
u_long bytes_transferred,
int success,
const void *completion_key,
u_long error
);
virtual int post_wakeup_completions (int how_many);
how_many
completions to the completion port so that all
threads can wake up. This is used in conjunction with the
run_event_loop
.
ACE_HANDLE completion_port_;
size_t number_of_threads_;
CreatIOCompletionPort
system
call.
ACE_Auto_Event event_;
int used_with_reactor_event_loop_;
ACE_Handler wakeup_handler_;
ACE_Proactor::run_event_loop
.
alex@cs.wustl.edu