POSIX implementation of the Proactor.
#include <ace/POSIX_Proactor.h>
class ACE_POSIX_Proactor : public ACE_Proactor_Impl {
public:
friend class ACE_POSIX_SIG_Asynch_Accept_Handler;
virtual ~ACE_POSIX_Proactor (void);
virtual int close (void);
virtual int register_handle ( ACE_HANDLE handle, const void *completion_key );
virtual int post_completion (ACE_POSIX_Asynch_Result *result) = 0;
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_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 = ACE_INVALID_HANDLE, int priority = 0, int signal_number = ACE_SIGRTMIN );
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 = ACE_INVALID_HANDLE, int priority = 0, int signal_number = ACE_SIGRTMIN );
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 = ACE_INVALID_HANDLE, int priority = 0, int signal_number = ACE_SIGRTMIN );
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 = ACE_INVALID_HANDLE, int priority = 0, int signal_number = ACE_SIGRTMIN );
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 = ACE_INVALID_HANDLE, int priority = 0, int signal_number = ACE_SIGRTMIN );
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 = ACE_INVALID_HANDLE, int priority = 0, int signal_number = ACE_SIGRTMIN );
virtual ACE_Asynch_Result_Impl *create_asynch_timer ( ACE_Handler &handler, const void *act, const ACE_Time_Value &tv, ACE_HANDLE event = ACE_INVALID_HANDLE, int priority = 0, int signal_number = ACE_SIGRTMIN );
protected:
ACE_POSIX_Proactor (void);
void application_specific_code ( ACE_POSIX_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_Handler wakeup_handler_;
};
There are two different strategies by which Proactor can get
to know the completion of aio
operations. One is based on
Asynchronous I/O Control Blocks (AIOCB) where a list of
AIOCBs are stored and completion status of the corresponding
operations are queried on them. The other one is based on
POSIX Real Time signals. This class abstracts out the common
code needed for both the strategies. ACE_AIOCB_Proactor and
ACE_SIG_Proactor specialize this class for each strategy.
friend class ACE_POSIX_SIG_Asynch_Accept_Handler;
POSIX_SIG_Asynch_Accept
operation, this handler class does
the actual work, has to register the real-time signal with the
Proactor.
virtual ~ACE_POSIX_Proactor (void);
virtual int close (void);
virtual int register_handle (
ACE_HANDLE handle,
const void *completion_key
);
virtual int post_completion (ACE_POSIX_Asynch_Result *result) = 0;
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_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 = ACE_INVALID_HANDLE,
int priority = 0,
int signal_number = ACE_SIGRTMIN
);
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 = ACE_INVALID_HANDLE,
int priority = 0,
int signal_number = ACE_SIGRTMIN
);
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 = ACE_INVALID_HANDLE,
int priority = 0,
int signal_number = ACE_SIGRTMIN
);
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 = ACE_INVALID_HANDLE,
int priority = 0,
int signal_number = ACE_SIGRTMIN
);
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 = ACE_INVALID_HANDLE,
int priority = 0,
int signal_number = ACE_SIGRTMIN
);
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 = ACE_INVALID_HANDLE,
int priority = 0,
int signal_number = ACE_SIGRTMIN
);
virtual ACE_Asynch_Result_Impl *create_asynch_timer (
ACE_Handler &handler,
const void *act,
const ACE_Time_Value &tv,
ACE_HANDLE event = ACE_INVALID_HANDLE,
int priority = 0,
int signal_number = ACE_SIGRTMIN
);
ACE_POSIX_Proactor (void);
void application_specific_code (
ACE_POSIX_Asynch_Result *asynch_result,
u_long bytes_transferred,
int success,
const void *completion_key,
u_long error
);
completion_key
is not very useful
compared to AST
that can be associated each asynchronous
operation. completion_key
is implemented right now for the
POSIX Proators.
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_Handler wakeup_handler_;
ACE_Proactor::run_event_loop
.
irfan@cs.wustl.edu
,
Tim Harrison harrison@cs.wustl.edu
and
Alexander Babu Arulanthu alex@cs.wustl.edu