ACE
6.1.0
|
This Proactor makes use of Asynchronous I/O Control Blocks (AIOCB) to notify/get the completion status of the <aio_> operations issued. More...
#include <POSIX_Proactor.h>
Public Member Functions | |
ACE_POSIX_AIOCB_Proactor (size_t nmaxop=ACE_AIO_DEFAULT_SIZE) | |
virtual Proactor_Type | get_impl_type (void) |
virtual | ~ACE_POSIX_AIOCB_Proactor (void) |
Destructor. | |
virtual int | close (void) |
Close down the Proactor. | |
virtual int | handle_events (ACE_Time_Value &wait_time) |
virtual int | handle_events (void) |
virtual int | post_completion (ACE_POSIX_Asynch_Result *result) |
Post a result to the completion port of the Proactor. | |
virtual int | start_aio (ACE_POSIX_Asynch_Result *result, ACE_POSIX_Proactor::Opcode op) |
virtual int | cancel_aio (ACE_HANDLE h) |
Protected Member Functions | |
ACE_POSIX_AIOCB_Proactor (size_t nmaxop, ACE_POSIX_Proactor::Proactor_Type ptype) | |
virtual int | get_result_status (ACE_POSIX_Asynch_Result *asynch_result, int &error_status, size_t &transfer_count) |
int | create_result_aiocb_list (void) |
Create aiocb list. | |
int | delete_result_aiocb_list (void) |
void | create_notify_manager (void) |
void | delete_notify_manager (void) |
void | check_max_aio_num (void) |
void | set_notify_handle (ACE_HANDLE h) |
To identify requests from Notify_Pipe_Manager. | |
int | handle_events_i (u_long milli_seconds) |
int | start_deferred_aio (void) |
Start deferred AIO if necessary. | |
virtual int | cancel_aiocb (ACE_POSIX_Asynch_Result *result) |
Cancel running or deferred AIO. | |
ACE_POSIX_Asynch_Result * | find_completed_aio (int &error_status, size_t &transfer_count, size_t &index, size_t &count) |
Extract the results of aio. | |
virtual ssize_t | allocate_aio_slot (ACE_POSIX_Asynch_Result *result) |
Find free slot to store result and aiocb pointer. | |
virtual int | start_aio_i (ACE_POSIX_Asynch_Result *result) |
Initiate an aio operation. | |
virtual int | notify_completion (int sig_num) |
int | putq_result (ACE_POSIX_Asynch_Result *result) |
Put "post_completed" result into the internal queue. | |
ACE_POSIX_Asynch_Result * | getq_result (void) |
Get "post_completed" result from the internal queue. | |
int | clear_result_queue (void) |
Clear the internal results queue. | |
int | process_result_queue (void) |
Process the internal results queue. | |
Protected Attributes | |
ACE_AIOCB_Notify_Pipe_Manager * | aiocb_notify_pipe_manager_ |
aiocb ** | aiocb_list_ |
ACE_POSIX_Asynch_Result ** | result_list_ |
size_t | aiocb_list_max_size_ |
To maintain the maximum size of the array (list). | |
size_t | aiocb_list_cur_size_ |
To maintain the current size of the array (list). | |
ACE_SYNCH_MUTEX | mutex_ |
Mutex to protect work with lists. | |
ACE_HANDLE | notify_pipe_read_handle_ |
size_t | num_deferred_aiocb_ |
size_t | num_started_aio_ |
Number active,i.e. running requests. | |
ACE_Unbounded_Queue < ACE_POSIX_Asynch_Result * > | result_queue_ |
Queue which keeps "post_completed" ACE_POSIX_Asynch_Result's. | |
Friends | |
class | ACE_AIOCB_Notify_Pipe_Manager |
Handler needs to call application specific code. | |
class | ACE_POSIX_Asynch_Operation |
class | ACE_POSIX_Asynch_Accept |
class | ACE_POSIX_Asynch_Connect |
This Proactor makes use of Asynchronous I/O Control Blocks (AIOCB) to notify/get the completion status of the <aio_> operations issued.
ACE_POSIX_AIOCB_Proactor::ACE_POSIX_AIOCB_Proactor | ( | size_t | nmaxop = ACE_AIO_DEFAULT_SIZE | ) |
Constructor defines max number asynchronous operations which can be started at the same time
ACE_POSIX_AIOCB_Proactor::~ACE_POSIX_AIOCB_Proactor | ( | void | ) | [virtual] |
Destructor.
ACE_POSIX_AIOCB_Proactor::ACE_POSIX_AIOCB_Proactor | ( | size_t | nmaxop, |
ACE_POSIX_Proactor::Proactor_Type | ptype | ||
) | [protected] |
Special constructor for ACE_SUN_Proactor and ACE_POSIX_SIG_Proactor
ssize_t ACE_POSIX_AIOCB_Proactor::allocate_aio_slot | ( | ACE_POSIX_Asynch_Result * | result | ) | [protected, virtual] |
Find free slot to store result and aiocb pointer.
Reimplemented in ACE_POSIX_CB_Proactor.
int ACE_POSIX_AIOCB_Proactor::cancel_aio | ( | ACE_HANDLE | h | ) | [virtual] |
This method should be called from ACE_POSIX_Asynch_Operation::cancel() instead of usual ::aio_cancel. For all deferred AIO requests with handle "h" it removes its from the lists and notifies user. For all running AIO requests with handle "h" it calls ::aio_cancel. According to the POSIX standards we will receive ECANCELED for all ::aio_canceled AIO requests later on return from ::aio_suspend
Implements ACE_POSIX_Proactor.
int ACE_POSIX_AIOCB_Proactor::cancel_aiocb | ( | ACE_POSIX_Asynch_Result * | result | ) | [protected, virtual] |
Cancel running or deferred AIO.
void ACE_POSIX_AIOCB_Proactor::check_max_aio_num | ( | void | ) | [protected] |
Define the maximum number of asynchronous I/O requests for the current OS
int ACE_POSIX_AIOCB_Proactor::clear_result_queue | ( | void | ) | [protected] |
Clear the internal results queue.
int ACE_POSIX_AIOCB_Proactor::close | ( | void | ) | [virtual] |
Close down the Proactor.
Reimplemented from ACE_POSIX_Proactor.
void ACE_POSIX_AIOCB_Proactor::create_notify_manager | ( | void | ) | [protected] |
Call these methods from derived class when virtual table is built.
int ACE_POSIX_AIOCB_Proactor::create_result_aiocb_list | ( | void | ) | [protected] |
Create aiocb list.
void ACE_POSIX_AIOCB_Proactor::delete_notify_manager | ( | void | ) | [protected] |
int ACE_POSIX_AIOCB_Proactor::delete_result_aiocb_list | ( | void | ) | [protected] |
Call this method from derived class when virtual table is built.
ACE_POSIX_Asynch_Result * ACE_POSIX_AIOCB_Proactor::find_completed_aio | ( | int & | error_status, |
size_t & | transfer_count, | ||
size_t & | index, | ||
size_t & | count | ||
) | [protected] |
Extract the results of aio.
ACE_POSIX_Proactor::Proactor_Type ACE_POSIX_AIOCB_Proactor::get_impl_type | ( | void | ) | [virtual] |
Reimplemented from ACE_POSIX_Proactor.
Reimplemented in ACE_POSIX_CB_Proactor.
int ACE_POSIX_AIOCB_Proactor::get_result_status | ( | ACE_POSIX_Asynch_Result * | asynch_result, |
int & | error_status, | ||
size_t & | transfer_count | ||
) | [protected, virtual] |
Check AIO for completion, error and result status Return: 1 - AIO completed , 0 - not completed yet
ACE_POSIX_Asynch_Result * ACE_POSIX_AIOCB_Proactor::getq_result | ( | void | ) | [protected] |
Get "post_completed" result from the internal queue.
int ACE_POSIX_AIOCB_Proactor::handle_events | ( | ACE_Time_Value & | wait_time | ) | [virtual] |
Dispatch a single set of events. If 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.
Implements ACE_POSIX_Proactor.
Reimplemented in ACE_POSIX_CB_Proactor.
int ACE_POSIX_AIOCB_Proactor::handle_events | ( | void | ) | [virtual] |
Block indefinitely until at least one event is dispatched. Dispatch a single set of events. If 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.
Implements ACE_POSIX_Proactor.
Reimplemented in ACE_POSIX_CB_Proactor.
int ACE_POSIX_AIOCB_Proactor::handle_events_i | ( | u_long | milli_seconds | ) | [protected] |
Dispatch a single set of events. If <milli_seconds> elapses before any events occur, return 0. Return 1 if a completion dispatched. Return -1 on errors.
Reimplemented in ACE_POSIX_CB_Proactor.
int ACE_POSIX_AIOCB_Proactor::notify_completion | ( | int | sig_num | ) | [protected, virtual] |
Notify queue of "post_completed" ACE_POSIX_Asynch_Results called from post_completion method
Reimplemented in ACE_POSIX_CB_Proactor.
int ACE_POSIX_AIOCB_Proactor::post_completion | ( | ACE_POSIX_Asynch_Result * | result | ) | [virtual] |
Post a result to the completion port of the Proactor.
Implements ACE_POSIX_Proactor.
int ACE_POSIX_AIOCB_Proactor::process_result_queue | ( | void | ) | [protected] |
Process the internal results queue.
int ACE_POSIX_AIOCB_Proactor::putq_result | ( | ACE_POSIX_Asynch_Result * | result | ) | [protected] |
Put "post_completed" result into the internal queue.
void ACE_POSIX_AIOCB_Proactor::set_notify_handle | ( | ACE_HANDLE | h | ) | [protected] |
To identify requests from Notify_Pipe_Manager.
int ACE_POSIX_AIOCB_Proactor::start_aio | ( | ACE_POSIX_Asynch_Result * | result, |
ACE_POSIX_Proactor::Opcode | op | ||
) | [virtual] |
Implements ACE_POSIX_Proactor.
int ACE_POSIX_AIOCB_Proactor::start_aio_i | ( | ACE_POSIX_Asynch_Result * | result | ) | [protected, virtual] |
Initiate an aio operation.
int ACE_POSIX_AIOCB_Proactor::start_deferred_aio | ( | void | ) | [protected] |
Start deferred AIO if necessary.
friend class ACE_AIOCB_Notify_Pipe_Manager [friend] |
Handler needs to call application specific code.
friend class ACE_POSIX_Asynch_Accept [friend] |
friend class ACE_POSIX_Asynch_Connect [friend] |
friend class ACE_POSIX_Asynch_Operation [friend] |
This class does the registering of Asynch Operations with the Proactor which is necessary in the AIOCB strategy.
aiocb** ACE_POSIX_AIOCB_Proactor::aiocb_list_ [protected] |
Use a dynamically allocated array to keep track of all the aio's issued currently.
size_t ACE_POSIX_AIOCB_Proactor::aiocb_list_cur_size_ [protected] |
To maintain the current size of the array (list).
size_t ACE_POSIX_AIOCB_Proactor::aiocb_list_max_size_ [protected] |
To maintain the maximum size of the array (list).
This class takes care of doing <accept> when we use AIO_CONTROL_BLOCKS strategy.
ACE_SYNCH_MUTEX ACE_POSIX_AIOCB_Proactor::mutex_ [protected] |
Mutex to protect work with lists.
ACE_HANDLE ACE_POSIX_AIOCB_Proactor::notify_pipe_read_handle_ [protected] |
The purpose of this member is only to identify asynchronous request from NotifyManager. We will reserve for it always slot 0 in the list of aiocb's to be sure that don't lose notifications.
size_t ACE_POSIX_AIOCB_Proactor::num_deferred_aiocb_ [protected] |
Number of ACE_POSIX_Asynch_Result's waiting for start i.e. deferred AIOs
size_t ACE_POSIX_AIOCB_Proactor::num_started_aio_ [protected] |
Number active,i.e. running requests.
Queue which keeps "post_completed" ACE_POSIX_Asynch_Result's.