diff options
author | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-04-07 15:15:30 +0000 |
---|---|---|
committer | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-04-07 15:15:30 +0000 |
commit | bba0a877208338c9d9d6ba5034d54071be0376ee (patch) | |
tree | 341a30609e2e2c5b4b2abb3bbaf2e375bbc9bb59 /ace/Asynch_IO.h | |
parent | 6f17a44988bf74e0f5550e3ab044b91f5d9ed7e4 (diff) | |
download | ATCD-bba0a877208338c9d9d6ba5034d54071be0376ee.tar.gz |
added Asynch_Acceptor.{h,cpp} and Asynch_IO.{h,cpp}
Diffstat (limited to 'ace/Asynch_IO.h')
-rw-r--r-- | ace/Asynch_IO.h | 885 |
1 files changed, 885 insertions, 0 deletions
diff --git a/ace/Asynch_IO.h b/ace/Asynch_IO.h new file mode 100644 index 00000000000..69c735e253d --- /dev/null +++ b/ace/Asynch_IO.h @@ -0,0 +1,885 @@ +/* -*- C++ -*- */ +// $Id: Asynch_IO.h,v + +// ============================================================================ +// +// = LIBRARY +// ace +// +// = FILENAME +// Asynch_IO.h +// +// = AUTHOR +// Irfan Pyarali (irfan@cs.wustl.edu) +// Tim Harrison (harrison@cs.wustl.edu) +// +// ============================================================================ + +#if !defined (ACE_ASYNCH_IO_H) +#define ACE_ASYNCH_IO_H + +#include "ace/OS.h" + +#if defined (ACE_WIN32) +// This only works on Win32 platforms + +// Forward declarations +class ACE_Proactor; +class ACE_Handler; +class ACE_Message_Block; +class ACE_INET_Addr; + +class ACE_Export ACE_Asynch_Result : protected OVERLAPPED + // + // = TITLE + // + // An abstract class which adds information to the OVERLAPPED + // structure to make it more useful. + // + // = DESCRIPTION + // + // An abstract base class from which you can obtain some basic + // information like the number of bytes transferred, the ACT + // associated with the asynchronous operation, indication of + // success or failure, etc. Subclasses may want to store more + // information that is particular to the asynchronous operation + // it represents. +{ + + // Proactor is the only class which is allowed to call the + // <complete> method. + friend class ACE_Proactor; + +public: + u_long bytes_transferred (void) const; + // Number of bytes transferred by the operation. + + const void *act (void) const; + // ACT associated with the operation. + + int success (void) const; + // Did the operation succeed? + + const void *completion_key (void) const; + // This returns the ACT associated with the handle when it was + // registered with the I/O completion port. This ACT is not the + // same as the ACT associated with the asynchronous operation. + + u_long error (void) const; + // Error value if the operation fail. + + ACE_HANDLE event (void) const; + // Event associated with the OVERLAPPED structure + + u_long offset (void) const; + u_long offset_high (void) const; + // Offset associated with the OVERLAPPED structure. This really + // make sense only when doing file I/O. + + ACE_Asynch_Result (ACE_Handler &handler, + const void* act, + ACE_HANDLE event = 0, + u_long offset = 0, + u_long offset_high = 0); + // Constructor + +protected: + virtual void complete (u_long bytes_transferred, + int success, + const void *completion_key, + u_long error = 0) = 0; + // This is the key method. Subclasses will override this method to + // call the correct callback on the handler. + + ACE_Handler &handler_; + // Handler that will be called back. + + const void *act_; + // ACT for this operation. + + u_long bytes_transferred_; + // Bytes transferred by this operation. + + int success_; + // Success indicator. + + const void *completion_key_; + // ACT associated with handle. + + u_long error_; + // Error if operation failed. +}; + +// ************************************************************ + +class ACE_Export ACE_Asynch_Operation + // + // = TITLE + // + // This is a base class for all asynch operations. + // + // = DESCRIPTION + // + // There are some attributes and functionality which is common + // to all asychronous operations. This abstract class will + // factor out this code. +{ +protected: + ACE_Asynch_Operation (void); + // A do nothing constructor. + +public: + int open (ACE_Handler &handler, + ACE_HANDLE handle = ACE_INVALID_HANDLE, + const void *completion_key = 0); + // Initializes the factory with information which will be used with + // each asynchronous call. If (<handle> == ACE_INVALID_HANDLE), + // <ACE_Handler::handle> will be called on the <handler> to get the + // correct handle. + + int cancel (void); + // This cancels all pending accepts operations that were issued by + // the calling thread. The function does not cancel asynchronous + // operations issued by other threads. + +protected: + ACE_Handler *handler_; + // Handler that will receive the callback. + + ACE_HANDLE handle_; + // I/O handle used for reading. +}; + +// ************************************************************ + +class ACE_Export ACE_Asynch_Read_Stream : public ACE_Asynch_Operation + // + // = TITLE + // + // This class is a factory for starting off asynchronous reads + // on a stream. + // + // = DESCRIPTION + // + // Once <open> is called, multiple asynchronous <read>s can + // started using this class. An ACE_Asynch_Read_Stream::Result + // will be passed back to the <handler> when the asynchronous + // reads completes through the <ACE_Handler::handle_read_stream> + // callback. +{ +public: + class Result; + // Forward declaration of the Result class. + + ACE_Asynch_Read_Stream (void); + // A do nothing constructor. + + int read (ACE_Message_Block &message_block, + u_long bytes_to_read, + const void *act = 0); + // This starts off an asynchronous read. Upto <bytes_to_read> will + // be read and stored in the <message_block>. + +protected: + int shared_read (Result *result, + ACE_Message_Block &message_block, + u_long bytes_to_read, + const void *act = 0); + // This is the method which does the real work and is there so that + // the ACE_Asynch_Read_File class can use it too. + +public: + class ACE_Export Result : public ACE_Asynch_Result + // + // = TITLE + // + // This is that class which will be passed back to the + // <handler> when the asynchronous read completes. + // + // = DESCRIPTION + // + // This class has all the information necessary for the + // <handler> to uniquiely identify the completion of the + // asynchronous read. + { + friend class ACE_Asynch_Read_Stream; + // The factory has special privileges. + + public: + u_long bytes_to_read (void) const; + // The number of bytes which were requested at the start of the + // asynchronous read. + + ACE_Message_Block &message_block (void) const; + // Message block which contains the read data. + + ACE_HANDLE handle (void) const; + // I/O handle used for reading. + + protected: + Result (ACE_Handler &handler, + ACE_HANDLE handle, + ACE_Message_Block &message_block, + u_long bytes_to_read, + const void* act); + // Constructor is protected since creation is limited to + // ACE_Asynch_Read_Stream factory. + + virtual void complete (u_long bytes_transferred, + int success, + const void *completion_key, + u_long error = 0); + // ACE_Proactor will call this method when the read completes. + + u_long bytes_to_read_; + // Bytes requested when the asynchronous read was initiated. + + ACE_Message_Block &message_block_; + // Message block for reading the data into. + + ACE_HANDLE handle_; + // I/O handle used for reading. + }; +}; + +// ************************************************************ + +class ACE_Export ACE_Asynch_Write_Stream : public ACE_Asynch_Operation + // + // = TITLE + // + // This class is a factory for starting off asynchronous writes + // on a stream. + // + // = DESCRIPTION + // + // Once <open> is called, multiple asynchronous <writes>s can + // started using this class. A ACE_Asynch_Write_Stream::Result + // will be passed back to the <handler> when the asynchronous + // write completes through the + // <ACE_Handler::handle_write_stream> callback. +{ +public: + class Result; + // Forward declaration of the Result class. + + ACE_Asynch_Write_Stream (void); + // A do nothing constructor. + + int write (ACE_Message_Block &message_block, + u_long bytes_to_write, + const void *act = 0); + // This starts off an asynchronous write. Upto <bytes_to_write> + // will be written from the <message_block>. + +protected: + int shared_write (Result *result, + ACE_Message_Block &message_block, + u_long bytes_to_write, + const void *act = 0); + // This is the method which does the real work and is there so that + // the ACE_Asynch_Write_File class can use it too. + +public: + class ACE_Export Result : public ACE_Asynch_Result + // + // = TITLE + // + // This is that class which will be passed back to the + // <handler> when the asynchronous write completes. + // + // = DESCRIPTION + // + // This class has all the information necessary for the + // <handler> to uniquiely identify the completion of the + // asynchronous write. + { + friend class ACE_Asynch_Write_Stream; + // The factory has special privileges. + + public: + u_long bytes_to_write (void) const; + // The number of bytes which were requested at the start of the + // asynchronous write. + + ACE_Message_Block &message_block (void) const; + // Message block that contains the data to be written. + + ACE_HANDLE handle (void) const; + // I/O handle used for writing. + + protected: + Result (ACE_Handler &handler, + ACE_HANDLE handle, + ACE_Message_Block &message_block, + u_long bytes_to_write, + const void* act); + // Constructor is protected since creation is limited to + // ACE_Asynch_Write_Stream factory. + + virtual void complete (u_long bytes_transferred, + int success, + const void *completion_key, + u_long error = 0); + // ACE_Proactor will call this method when the write completes. + + u_long bytes_to_write_; + // The number of bytes which were requested at the start of the + // asynchronous write. + + ACE_Message_Block &message_block_; + // Message block that contains the data to be written. + + ACE_HANDLE handle_; + // I/O handle used for writing. + }; +}; + +// ************************************************************ + +class ACE_Export ACE_Asynch_Read_File : public ACE_Asynch_Read_Stream + // + // = TITLE + // + // This class is a factory for starting off asynchronous reads + // on a file. + // + // = DESCRIPTION + // + // Once <open> is called, multiple asynchronous <read>s can + // started using this class. A ACE_Asynch_Read_File::Result + // will be passed back to the <handler> when the asynchronous + // reads completes through the <ACE_Handler::handle_read_file> + // callback. + // + // This class differs slightly from ACE_Asynch_Read_Stream as it + // allows the user to specify an offset for the read. +{ +public: + int read (ACE_Message_Block &message_block, + u_long bytes_to_read, + u_long offset = 0, + u_long offset_high = 0, + const void *act = 0); + // This starts off an asynchronous read. Upto <bytes_to_read> will + // be read and stored in the <message_block>. The read will start + // at <offset> from the beginning of the file. + +public: + class ACE_Export Result : public ACE_Asynch_Read_Stream::Result + // + // = TITLE + // + // This is that class which will be passed back to the + // <handler> when the asynchronous read completes. + // + // = DESCRIPTION + // + // This class has all the information necessary for the + // <handler> to uniquiely identify the completion of the + // asynchronous read. + // + // This class differs slightly from + // ACE_Asynch_Read_Stream::Result as it calls back + // <ACE_Handler::handle_read_file> on the <handler> instead of + // <ACE_Handler::handle_read_stream>. No additional state is + // required by this class as ACE_Asynch_Result can store the + // <offset>. + { + friend class ACE_Asynch_Read_File; + // The factory has special privileges. + + protected: + 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); + // Constructor is protected since creation is limited to + // ACE_Asynch_Read_File factory. + + virtual void complete (u_long bytes_transferred, + int success, + const void *completion_key, + u_long error = 0); + // ACE_Proactor will call this method when the read completes. + }; +}; + +// ************************************************************ + +class ACE_Export ACE_Asynch_Write_File : public ACE_Asynch_Write_Stream + // + // = TITLE + // + // This class is a factory for starting off asynchronous writes + // on a file. + // + // = DESCRIPTION + // + // Once <open> is called, multiple asynchronous <write>s can + // started using this class. A ACE_Asynch_Write_File::Result + // will be passed back to the <handler> when the asynchronous + // writes completes through the <ACE_Handler::handle_write_file> + // callback. + // + // This class differs slightly from ACE_Asynch_Write_Stream as + // it allows the user to specify an offset for the write. +{ +public: + int write (ACE_Message_Block &message_block, + u_long bytes_to_write, + u_long offset = 0, + u_long offset_high = 0, + const void *act = 0); + // This starts off an asynchronous write. Upto <bytes_to_write> + // will be write and stored in the <message_block>. The write will + // start at <offset> from the beginning of the file. + +public: + class ACE_Export Result : public ACE_Asynch_Write_Stream::Result + // + // = TITLE + // + // This is that class which will be passed back to the + // <handler> when the asynchronous write completes. + // + // = DESCRIPTION + // + // This class has all the information necessary for the + // <handler> to uniquiely identify the completion of the + // asynchronous write. + // + // This class differs slightly from + // ACE_Asynch_Write_Stream::Result as it calls back + // <ACE_Handler::handle_write_file> on the <handler> instead + // of <ACE_Handler::handle_write_stream>. No additional state + // is required by this class as ACE_Asynch_Result can store + // the <offset>. + { + friend class ACE_Asynch_Write_File; + // The factory has special privileges. + + protected: + 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); + // Constructor is protected since creation is limited to + // ACE_Asynch_Write_File factory. + + virtual void complete (u_long bytes_transferred, + int success, + const void *completion_key, + u_long error = 0); + // ACE_Proactor will call this method when the write completes. + }; +}; + +// ************************************************************ + +class ACE_Export ACE_Asynch_Accept : public ACE_Asynch_Operation + // + // = TITLE + // + // This class is a factory for starting off asynchronous accepts + // on a listen handle. + // + // = DESCRIPTION + // + // Once <open> is called, multiple asynchronous <accept>s can + // started using this class. A ACE_Asynch_Accept::Result will + // be passed back to the <handler> when the asynchronous accept + // completes through the <ACE_Handler::handle_accept> + // callback. +{ +public: + ACE_Asynch_Accept (void); + // A do nothing constructor. + + int accept (ACE_Message_Block &message_block, + u_long bytes_to_read, + ACE_HANDLE accept_handle = ACE_INVALID_HANDLE, + const void *act = 0); + // This starts off an asynchronous accept. The asynchronous accept + // call also allows any initial data to be returned to the + // <handler>. Upto <bytes_to_read> will be read and stored in the + // <message_block>. The <accept_handle> will be used for the + // <accept> call. If (<accept_handle> == INVALID_HANDLE), a new + // handle will be created. + // + // <message_block> must be specified. This is because the address of + // the new connection is placed at the end of this buffer. + +public: + class ACE_Export Result : public ACE_Asynch_Result + // + // = TITLE + // + // This is that class which will be passed back to the + // <handler> when the asynchronous accept completes. + // + // = DESCRIPTION + // + // This class has all the information necessary for the + // <handler> to uniquiely identify the completion of the + // asynchronous accept. + { + friend class ACE_Asynch_Accept; + // The factory has special privileges. + + public: + u_long bytes_to_read (void) const; + // The number of bytes which were requested at the start of the + // asynchronous accept. + + ACE_Message_Block &message_block (void) const; + // Message block which contains the read data. + + ACE_HANDLE listen_handle (void) const; + // I/O handle used for accepting new connections. + + ACE_HANDLE accept_handle (void) const; + // I/O handle for the new connection. + + protected: + 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); + // Constructor is protected since creation is limited to + // ACE_Asynch_Accept factory. + + virtual void complete (u_long bytes_transferred, + int success, + const void *completion_key, + u_long error = 0); + // ACE_Proactor will call this method when the accept completes. + + u_long bytes_to_read_; + // Bytes requested when the asynchronous read was initiated. + + ACE_Message_Block &message_block_; + // Message block for reading the data into. + + ACE_HANDLE listen_handle_; + // I/O handle used for accepting new connections. + + ACE_HANDLE accept_handle_; + // I/O handle for the new connection. + }; +}; + +// ************************************************************ + +class ACE_Export ACE_Asynch_Transmit_File : public ACE_Asynch_Operation + // + // = TITLE + // + // This class is a factory for starting off asynchronous + // transmit files on a stream. + // + // = DESCRIPTION + // + // Once <open> is called, multiple asynchronous <transmit_file>s + // can started using this class. A + // ACE_Asynch_Transmit_File::Result will be passed back to the + // <handler> when the asynchronous transmit file completes + // through the <ACE_Handler::handle_transmit_file> callback. + // + // The transmit_file function transmits file data over a + // connected network connection. The function uses the operating + // system's cache manager to retrieve the file data. This + // function provides high-performance file data transfer over + // network connections. This function would be of great use in + // a Web Server, Image Server, etc. +{ +public: + class Header_And_Trailer; + // Forward declaration. + + ACE_Asynch_Transmit_File (void); + // A do nothing constructor. + + int transmit_file (ACE_HANDLE file, + Header_And_Trailer *header_and_trailer = 0, + u_long bytes_to_write = 0, + u_long offset = 0, + u_long offset_high = 0, + u_long bytes_per_send = 0, + u_long flags = 0, + const void *act = 0); + // This starts off an asynchronous transmit file. The <file> is a + // handle to an open file. <header_and_trailer> is a pointer to a + // data structure that contains pointers to data to send before and + // after the file data is sent. Set this parameter to 0 if you only + // want to transmit the file data. Upto <bytes_to_write> will be + // written to the <socket>. If you want to send the entire file, + // let <bytes_to_write> = 0. <bytes_per_send> is the size of each + // block of data sent per send operation. Please read the Win32 + // documentation on what the flags should be. + +public: + class ACE_Export Result : public ACE_Asynch_Result + // + // = TITLE + // + // This is that class which will be passed back to the + // <handler> when the asynchronous transmit file completes. + // + // = DESCRIPTION + // + // This class has all the information necessary for the + // <handler> to uniquiely identify the completion of the + // asynchronous transmit file. + { + friend class ACE_Asynch_Transmit_File; + // The factory has special privileges. + + public: + ACE_HANDLE socket (void) const; + // Socket used for transmitting the file. + + ACE_HANDLE file (void) const; + // File from which the data is read. + + Header_And_Trailer *header_and_trailer (void) const; + // Header and trailer data associated with this transmit file. + + u_long bytes_to_write (void) const; + // The number of bytes which were requested at the start of the + // asynchronous transmit file. + + u_long bytes_per_send (void) const; + // Number of bytes per send requested at the start of the transmit + // file. + + u_long flags (void) const; + // Flags which were passed into transmit file. + + protected: + Result (ACE_Handler &handler, + ACE_HANDLE socket, + ACE_HANDLE 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); + // Constructor is protected since creation is limited to + // ACE_Asynch_Transmit_File factory. + + virtual void complete (u_long bytes_transferred, + int success, + const void *completion_key, + u_long error = 0); + // ACE_Proactor will call this method when the write completes. + + ACE_HANDLE socket_; + // Network I/O handle. + + ACE_HANDLE file_; + // File I/O handle. + + Header_And_Trailer *header_and_trailer_; + // Header and trailer data associated with this transmit file. + + u_long bytes_to_write_; + // The number of bytes which were requested at the start of the + // asynchronous transmit file. + + u_long bytes_per_send_; + // Number of bytes per send requested at the start of the transmit + // file. + + u_long flags_; + // Flags which were passed into transmit file. + }; + + class ACE_Export Header_And_Trailer + // + // = TITLE + // + // The class defines a data structure that contains pointers + // to data to send before and after the file data is sent. + // + // = DESCRIPTION + // + // This class provides a wrapper over TRANSMIT_FILE_BUFFERS + // and provided a consistent use of ACE_Message_Blocks. + { + public: + Header_And_Trailer (ACE_Message_Block *header = 0, + u_long header_bytes = 0, + ACE_Message_Block *trailer = 0, + u_long trailer_bytes = 0); + // Constructor + + void header_and_trailer (ACE_Message_Block *header = 0, + u_long header_bytes = 0, + ACE_Message_Block *trailer = 0, + u_long trailer_bytes = 0); + // This method allows all the member to be set in one fell swoop. + + ACE_Message_Block *header (void) const; + void header (ACE_Message_Block *message_block); + // Header which goes before the file data. + + u_long header_bytes (void) const; + void header_bytes (u_long bytes); + // Size of the header data. + + ACE_Message_Block *trailer (void) const; + void trailer (ACE_Message_Block *message_block); + // Trailer which goes after the file data. + + u_long trailer_bytes (void) const; + void trailer_bytes (u_long bytes); + // Size of the trailer data. + + LPTRANSMIT_FILE_BUFFERS transmit_buffers (void); + // Conversion routine. + + protected: + ACE_Message_Block *header_; + // Header data. + + u_long header_bytes_; + // Size of header data. + + ACE_Message_Block *trailer_; + // Trailer data. + + u_long trailer_bytes_; + // Size of trailer data. + + TRANSMIT_FILE_BUFFERS transmit_buffers_; + // Target data structure. + }; +}; + +// ************************************************************ + +class ACE_Export ACE_Handler + // + // = TITLE + // + // This base class defines the interface for receiving the + // results of asynchronous operations. + // + // = DESCRIPTION + // + // Subclasses of this class will fill in appropriate methods. +{ +public: + ACE_Handler (void); + // A do nothing constructor. + + ACE_Handler (ACE_Proactor *p); + // A do nothing constructor which allows proactor to be set to <d>. + + virtual ~ACE_Handler (void); + // Virtual destruction. + + virtual void handle_read_stream (const ACE_Asynch_Read_Stream::Result &result); + // This method will be called when an asynchronous read completes on a stream. + + virtual void handle_write_stream (const ACE_Asynch_Write_Stream::Result &result); + // This method will be called when an asynchronous write completes on a stream. + + virtual void handle_read_file (const ACE_Asynch_Read_File::Result &result); + // This method will be called when an asynchronous read completes on a file. + + virtual void handle_write_file (const ACE_Asynch_Write_File::Result &result); + // This method will be called when an asynchronous write completes on a file. + + virtual void handle_accept (const ACE_Asynch_Accept::Result &result); + // This method will be called when an asynchronous accept completes. + + virtual void handle_transmit_file (const ACE_Asynch_Transmit_File::Result &result); + // This method will be called when an asynchronous transmit file completes. + + /* + virtual void handle_notify (const ACE_Asynch_Notify::Result &result); + virtual void handle_timeout (const ACE_Asynch_Timeout::Result &result); + */ + + ACE_Proactor *proactor (void); + // Get the proactor associated with this handler. + + void proactor (ACE_Proactor *p); + // Set the proactor. + + virtual ACE_HANDLE handle (void) const; + // Get the I/O handle used by this <handler>. This method will be + // called by the ACE_Asynch_* classes when an ACE_INVALID_HANDLE is + // passed to <open>. + +protected: + ACE_Proactor *proactor_; + // The proactor associated with this handler. +}; + +// ************************************************************ + +// Forward declartion +template <class HANDLER> +class ACE_Asynch_Acceptor; + +class ACE_Export ACE_Service_Handler : public ACE_Handler + // + // = TITLE + // + // This base class defines the interface for the + // ACE_Asynch_Acceptor to call into when new connection are + // accepted. + // + // = DESCRIPTION + // + // Subclasses of this class will fill in appropriate methods to + // define application specific behavior. +{ + friend class ACE_Asynch_Acceptor<ACE_Service_Handler>; + // The Acceptor is the factory and therefore should have special + // privileges. + +public: + ACE_Service_Handler (void); + // A do nothing constructor. + + virtual ~ACE_Service_Handler (void); + // Virtual destruction. + + virtual void open (ACE_HANDLE new_handle, + ACE_Message_Block &message_block) = 0; + // <open> is called by ACE_Asynch_Acceptor to initialize a new + // instance of ACE_Service_Handler that has been created after the a + // new connection is accepted. The handle for the new connection is + // passed along with an initial data that may have shown up. + + // protected: + // This should be corrected after the correct semantics of the + // friend has been figured out. + + virtual void addresses (const ACE_INET_Addr &remote_address, + const ACE_INET_Addr &local_address); + // Called by ACE_Asynch_Acceptor to pass the addresses of the new + // connections. +}; + +#if defined (__ACE_INLINE__) +#include "ace/Asynch_IO.i" +#endif /* __ACE_INLINE__ */ + +#endif /* ACE_WIN32 */ +#endif /* ACE_ASYNCH_IO_H */ + |