// -*- C++ -*- //============================================================================= /** * @file WIN32_Asynch_IO.h * * These classes only works on Win32 platforms. * * The implementation of ACE_Asynch_Transmit_File, * ACE_Asynch_Accept, and ACE_Asynch_Connect are only supported if * ACE_HAS_WINSOCK2 is defined or you are on WinNT 4.0 or higher. * * @author Irfan Pyarali * @author Tim Harrison * @author Alexander Babu Arulanthu * @author Roger Tragin * @author Alexander Libman */ //============================================================================= #ifndef ACE_WIN32_ASYNCH_IO_H #define ACE_WIN32_ASYNCH_IO_H #include /**/ "ace/pre.h" #include /**/ "ace/config-all.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) #pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ #if defined (ACE_HAS_WIN32_OVERLAPPED_IO) && \ (defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 == 1)) #include "ace/Asynch_IO_Impl.h" #include "ace/Addr.h" #include "ace/Event_Handler.h" #include "ace/Handle_Set.h" #include "ace/Map_Manager.h" #include "ace/Null_Mutex.h" ACE_BEGIN_VERSIONED_NAMESPACE_DECL // Forward declaration class ACE_WIN32_Proactor; /** * @class ACE_WIN32_Asynch_Result * * @brief An abstract class which adds information to the OVERLAPPED * structure to make it more useful. * * 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. */ class ACE_Export ACE_WIN32_Asynch_Result : public virtual ACE_Asynch_Result_Impl, public OVERLAPPED { /// Factory class has special permissions. friend class ACE_WIN32_Asynch_Accept; /// Proactor class has special permission. friend class ACE_WIN32_Proactor; public: /// Number of bytes transferred by the operation. size_t bytes_transferred () const; /// ACT associated with the operation. const void *act () const; /// Did the operation succeed? int success () 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. */ const void *completion_key () const; /// Error value if the operation fail. u_long error () const; /// Event associated with the OVERLAPPED structure. ACE_HANDLE event () const; /// This really make sense only when doing file I/O. u_long offset () const; /// Offset_high associated with the OVERLAPPED structure. u_long offset_high () const; /// The priority of the asynchronous operation. Currently, this is /// not supported on Win32. int priority () const; /// Returns 0. int signal_number () const; /// Post @c this to the Proactor's completion port. int post_completion (ACE_Proactor_Impl *proactor); /// Destructor. virtual ~ACE_WIN32_Asynch_Result (); /// Simulate error value to use in the post_completion() void set_error (u_long errcode); /// Simulate value to use in the post_completion() void set_bytes_transferred (size_t nbytes); protected: /// Constructor. ACE_WIN32_Asynch_Result (const ACE_Handler::Proxy_Ptr &handler_proxy, const void* act, ACE_HANDLE event, u_long offset, u_long offset_high, int priority, int signal_number = 0); /// Proxy for the ACE_Handler that will be called back. ACE_Handler::Proxy_Ptr handler_proxy_; /// ACT for this operation. const void *act_; /// Bytes transferred by this operation. size_t bytes_transferred_; /// Success indicator. int success_; /// ACT associated with handle. const void *completion_key_; /// Error if operation failed. u_long error_; }; /** * @class ACE_WIN32_Asynch_Operation * * @brief This class abstracts out the common things needed for * implementing Asynch_Operation for WIN32 platform. */ class ACE_Export ACE_WIN32_Asynch_Operation : public virtual ACE_Asynch_Operation_Impl { public: /** * Initializes the factory with information which will be used with * each asynchronous call. If (@a handle == ACE_INVALID_HANDLE), * ACE_Handler::handle() will be called on the @a handler to get the * correct handle. */ int open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor); /** * This cancels all pending accepts operations that were issued by * the calling thread. The function does not cancel asynchronous * operations issued by other threads. */ int cancel (); // = Access methods. /// Return the underlying proactor. ACE_Proactor* proactor () const; protected: /// Constructor. ACE_WIN32_Asynch_Operation (ACE_WIN32_Proactor *win32_proactor); /// Destructor. virtual ~ACE_WIN32_Asynch_Operation (); /// Win32 Proactor. ACE_WIN32_Proactor *win32_proactor_; /// Proactor that this asynch IO is registered with. ACE_Proactor *proactor_; /// Handler that will receive the callback. ACE_Handler::Proxy_Ptr handler_proxy_; /// I/O handle used for reading. ACE_HANDLE handle_; }; /** * @class ACE_WIN32_Asynch_Read_Stream_Result * * @brief This class provides concrete implementation for * ACE_Asynch_Read_Stream::Result class. */ class ACE_Export ACE_WIN32_Asynch_Read_Stream_Result : public virtual ACE_Asynch_Read_Stream_Result_Impl, public ACE_WIN32_Asynch_Result { /// Factory class will have special permissions. friend class ACE_WIN32_Asynch_Read_Stream; /// Proactor class has special permission. friend class ACE_WIN32_Proactor; public: /// The number of bytes which were requested at the start of the /// asynchronous read. size_t bytes_to_read () const; /// Message block which contains the read data. ACE_Message_Block &message_block () const; /// I/O handle used for reading. ACE_HANDLE handle () const; // Base class operations. These operations are here to kill // dominance warnings. These methods call the base class methods. /// Number of bytes transferred by the operation. size_t bytes_transferred () const; /// ACT associated with the operation. const void *act () const; /// Did the operation succeed? int success () 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. */ const void *completion_key () const; /// Error value if the operation fail. u_long error () const; /// Event associated with the OVERLAPPED structure. ACE_HANDLE event () const; /// This really make sense only when doing file I/O. u_long offset () const; /// Offset_high associated with the OVERLAPPED structure. u_long offset_high () const; /// The priority of the asynchronous operation. Currently, this is /// not supported on Win32. int priority () const; /// No-op. Returns 0. int signal_number () const; /// Post @c this to the Proactor's completion port. int post_completion (ACE_Proactor_Impl *proactor); /// Accessor for the scatter read flag int scatter_enabled () const; protected: /// Constructor is protected since creation is limited to /// ACE_Asynch_Read_Stream factory. ACE_WIN32_Asynch_Read_Stream_Result (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, ACE_Message_Block &message_block, size_t bytes_to_read, const void* act, ACE_HANDLE event, int priority, int signal_number = 0, int scatter_enabled = 0); /// Proactor will call this method when the read completes. virtual void complete (size_t bytes_transferred, int success, const void *completion_key, u_long error); /// Destructor. virtual ~ACE_WIN32_Asynch_Read_Stream_Result (); /// Bytes requested when the asynchronous read was initiated. size_t bytes_to_read_; /// Message block for reading the data into. ACE_Message_Block &message_block_; /// I/O handle used for reading. ACE_HANDLE handle_; /// Flag for scatter read int scatter_enabled_; }; /** * @class ACE_WIN32_Asynch_Read_Stream * * @brief This class is a factory for starting off asynchronous reads * on a stream. * * 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 @a handler when the asynchronous * reads completes through the * callback. */ class ACE_Export ACE_WIN32_Asynch_Read_Stream : public virtual ACE_Asynch_Read_Stream_Impl, public ACE_WIN32_Asynch_Operation { public: /// Constructor. ACE_WIN32_Asynch_Read_Stream (ACE_WIN32_Proactor *win32_proactor); /// This starts off an asynchronous read. Upto @a bytes_to_read will /// be read and stored in the @a message_block. int read (ACE_Message_Block &message_block, size_t bytes_to_read, const void *act, int priority, int signal_number = 0); /** * Same as above but with scatter support, through chaining of composite * message blocks using the continuation field. */ int readv (ACE_Message_Block &message_block, size_t bytes_to_read, const void *act, int priority, int signal_number = 0); /// Destructor. virtual ~ACE_WIN32_Asynch_Read_Stream (); // Methods belong to ACE_WIN32_Asynch_Operation base class. These // methods are defined here to avoid VC++ warnings. They route the // call to the ACE_WIN32_Asynch_Operation base class. /** * Initializes the factory with information which will be used with * each asynchronous call. If (@a handle == ACE_INVALID_HANDLE), * ACE_Handler::handle() will be called on the @a handler to get the * correct handle. */ int open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor); /** * This cancels all pending accepts operations that were issued by * the calling thread. The function does not cancel asynchronous * operations issued by other threads. */ int cancel (); /// Return the underlying proactor. ACE_Proactor* proactor () const; protected: /// This is the method which does the real work and is there so that /// the ACE_Asynch_Read_File class can use it too. int shared_read (ACE_WIN32_Asynch_Read_Stream_Result *result); }; /** * @class ACE_WIN32_Asynch_Write_Stream_Result * * @brief This class provides concrete implementation for * ACE_Asynch_Write_Stream::Result class. */ class ACE_Export ACE_WIN32_Asynch_Write_Stream_Result : public virtual ACE_Asynch_Write_Stream_Result_Impl, public ACE_WIN32_Asynch_Result { /// Factory class willl have special permissions. friend class ACE_WIN32_Asynch_Write_Stream; /// Proactor class has special permission. friend class ACE_WIN32_Proactor; public: /// The number of bytes which were requested at the start of the /// asynchronous write. size_t bytes_to_write () const; /// Message block that contains the data to be written. ACE_Message_Block &message_block () const; /// I/O handle used for writing. ACE_HANDLE handle () const; // = Base class operations. These operations are here to kill some // warnings. These methods call the base class methods. /// Number of bytes transferred by the operation. size_t bytes_transferred () const; /// ACT associated with the operation. const void *act () const; /// Did the operation succeed? int success () 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. */ const void *completion_key () const; /// Error value if the operation fail. u_long error () const; /// Event associated with the OVERLAPPED structure. ACE_HANDLE event () const; /// This really make sense only when doing file I/O. u_long offset () const; /// Offset_high associated with the OVERLAPPED structure. u_long offset_high () const; /// The priority of the asynchronous operation. Currently, this is /// not supported on Win32. int priority () const; /// No-op. Returns 0. int signal_number () const; /// Post @c this to the Proactor's completion port. int post_completion (ACE_Proactor_Impl *proactor); /// Accessor for the gather write flag int gather_enabled () const; protected: /// Constructor is protected since creation is limited to /// ACE_Asynch_Write_Stream factory. ACE_WIN32_Asynch_Write_Stream_Result (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, ACE_Message_Block &message_block, size_t bytes_to_write, const void* act, ACE_HANDLE event, int priority, int signal_number = 0, int gather_enabled = 0); /// ACE_Proactor will call this method when the write completes. virtual void complete (size_t bytes_transferred, int success, const void *completion_key, u_long error); /// Destructor. virtual ~ACE_WIN32_Asynch_Write_Stream_Result (); /// The number of bytes which were requested at the start of the /// asynchronous write. size_t bytes_to_write_; /// Message block that contains the data to be written. ACE_Message_Block &message_block_; /// I/O handle used for writing. ACE_HANDLE handle_; /// Flag for gather write int gather_enabled_; }; /** * @class ACE_WIN32_Asynch_Write_Stream * * @brief This class is a factory for starting off asynchronous writes * on a stream. * * Once open() is called, multiple asynchronous s can * started using this class. A ACE_Asynch_Write_Stream::Result * will be passed back to the @a handler when the asynchronous * write completes through the * ACE_Handler::handle_write_stream() callback. */ class ACE_Export ACE_WIN32_Asynch_Write_Stream : public virtual ACE_Asynch_Write_Stream_Impl, public ACE_WIN32_Asynch_Operation { public: /// Constructor. ACE_WIN32_Asynch_Write_Stream (ACE_WIN32_Proactor *win32_proactor); /// This starts off an asynchronous write. Upto @a bytes_to_write /// will be written from the @a message_block. int write (ACE_Message_Block &message_block, size_t bytes_to_write, const void *act, int priority, int signal_number = 0); /** * Same as above but with gather support, through chaining of composite * message blocks using the continuation field. */ int writev (ACE_Message_Block &message_block, size_t bytes_to_write, const void *act, int priority, int signal_number = 0); /// Destructor. virtual ~ACE_WIN32_Asynch_Write_Stream (); // = Methods belonging to base class. // These methods are defined here to avoid VC++ warnings. They route // the call to the base class. /** * Initializes the factory with information which will be used with * each asynchronous call. If (@a handle == ACE_INVALID_HANDLE), * ACE_Handler::handle() will be called on the @a handler to get the * correct handle. */ int open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor); /** * This cancels all pending accepts operations that were issued by * the calling thread. The function does not cancel asynchronous * operations issued by other threads. */ int cancel (); /// Return the underlying proactor. ACE_Proactor* proactor () const; }; /** * @class ACE_WIN32_Asynch_Read_File_Result * * @brief This class provides concrete implementation for * ACE_Asynch_Read_File::Result class. */ class ACE_Export ACE_WIN32_Asynch_Read_File_Result : public virtual ACE_Asynch_Read_File_Result_Impl, public ACE_WIN32_Asynch_Read_Stream_Result { /// Factory class will have special permissions. friend class ACE_WIN32_Asynch_Read_File; /// Proactor class has special permission. friend class ACE_WIN32_Proactor; public: // = These methods belong to ACE_WIN32_Asynch_Result class base // class. These operations are here to kill some warnings. These // methods call the base class methods. /// Number of bytes transferred by the operation. size_t bytes_transferred () const; /// ACT associated with the operation. const void *act () const; /// Did the operation succeed? int success () 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. */ const void *completion_key () const; /// Error value if the operation fail. u_long error () const; /// Event associated with the OVERLAPPED structure. ACE_HANDLE event () const; /// This really make sense only when doing file I/O. u_long offset () const; /// Offset_high associated with the OVERLAPPED structure. u_long offset_high () const; /// The priority of the asynchronous operation. Currently, this is /// not supported on Win32. int priority () const; /// No-op. Returns 0. int signal_number () const; // The following methods belong to // ACE_WIN32_Asynch_Read_Stream_Result. They are here to avoid VC++ // dominance warnings. These methods route their call to the // ACE_WIN32_Asynch_Read_Stream_Result base class. /// The number of bytes which were requested at the start of the /// asynchronous read. size_t bytes_to_read () const; /// Message block which contains the read data. ACE_Message_Block &message_block () const; /// I/O handle used for reading. ACE_HANDLE handle () const; /// Post @c this to the Proactor's completion port. int post_completion (ACE_Proactor_Impl *proactor); protected: /// Constructor is protected since creation is limited to /// ACE_Asynch_Read_File factory. ACE_WIN32_Asynch_Read_File_Result (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, ACE_Message_Block &message_block, size_t bytes_to_read, const void* act, u_long offset, u_long offset_high, ACE_HANDLE event, int priority, int signal_number = 0, int scatter_enabled = 0); /// ACE_Proactor will call this method when the read completes. virtual void complete (size_t bytes_transferred, int success, const void *completion_key, u_long error); /// Destructor. virtual ~ACE_WIN32_Asynch_Read_File_Result (); }; /** * @class ACE_WIN32_Asynch_Read_File * * @brief This class is a factory for starting off asynchronous reads * on a file. * * Once is called, multiple asynchronous s can * started using this class. A ACE_Asynch_Read_File::Result * will be passed back to the @a handler when the asynchronous * reads completes through the * callback. * * This class differs slightly from ACE_Asynch_Read_Stream as it * allows the user to specify an offset for the read. */ class ACE_Export ACE_WIN32_Asynch_Read_File : public virtual ACE_Asynch_Read_File_Impl, public ACE_WIN32_Asynch_Read_Stream { public: /// Constructor. ACE_WIN32_Asynch_Read_File (ACE_WIN32_Proactor *win32_proactor); /** * This starts off an asynchronous read. Upto @a bytes_to_read will * be read and stored in the @a message_block. The read will start * at @a offset from the beginning of the file. */ int read (ACE_Message_Block &message_block, size_t bytes_to_read, u_long offset, u_long offset_high, const void *act, int priority, int signal_number = 0); /** * Same as above but with scatter support, through chaining of * composite message blocks using the continuation field. * @note Each data block payload must be at least the size of a * system memory page and must be aligned on a system memory page * size boundary */ int readv (ACE_Message_Block &message_block, size_t bytes_to_read, u_long offset, u_long offset_high, const void *act, int priority, int signal_number = 0); /// Destructor. virtual ~ACE_WIN32_Asynch_Read_File (); // = Methods belong to ACE_WIN32_Asynch_Operation base class. These // methods are defined here to avoid VC++ warnings. They route the // call to the ACE_WIN32_Asynch_Operation base class. /** * Initializes the factory with information which will be used with * each asynchronous call. If ( == ACE_INVALID_HANDLE), * will be called on the @a handler to get the * correct handle. */ int open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor); /** * This cancels all pending accepts operations that were issued by * the calling thread. The function does not cancel asynchronous * operations issued by other threads. */ int cancel (); /// Return the underlying proactor. ACE_Proactor* proactor () const; private: /** * This method belongs to ACE_WIN32_Asynch_Read_Stream. It is here * to avoid the compiler warnings. We forward this call to the * ACE_WIN32_Asynch_Read_Stream class. */ int read (ACE_Message_Block &message_block, size_t bytes_to_read, const void *act, int priority, int signal_number = 0); /** * Same as above but with scatter support, through chaining of composite * message blocks using the continuation field. */ int readv (ACE_Message_Block &message_block, size_t bytes_to_read, const void *act, int priority, int signal_number = 0); }; /** * @class ACE_WIN32_Asynch_Write_File_Result * * @brief This class provides implementation for * ACE_Asynch_Write_File_Result for WIN32 platforms. * * This class has all the information necessary for the * @a handler to uniquiely identify the completion of the * asynchronous write. * * This class differs slightly from * ACE_Asynch_Write_Stream::Result as it calls back * on the @a handler instead * of . No additional state * is required by this class as ACE_Asynch_Result can store * the @a offset. */ class ACE_Export ACE_WIN32_Asynch_Write_File_Result : public virtual ACE_Asynch_Write_File_Result_Impl, public ACE_WIN32_Asynch_Write_Stream_Result { /// Factory class will have special permission. friend class ACE_WIN32_Asynch_Write_File; /// Proactor class has special permission. friend class ACE_WIN32_Proactor; public: // = Base class operations. These operations are here to kill some // warnings. These methods call the base class methods. /// Number of bytes transferred by the operation. size_t bytes_transferred () const; /// ACT associated with the operation. const void *act () const; /// Did the operation succeed? int success () 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. */ const void *completion_key () const; /// Error value if the operation fail. u_long error () const; /// Event associated with the OVERLAPPED structure. ACE_HANDLE event () const; /// This really make sense only when doing file I/O. u_long offset () const; /// Offset_high associated with the OVERLAPPED structure. u_long offset_high () const; /// The priority of the asynchronous operation. Currently, this is /// not supported on Win32. int priority () const; /// No-op. Returns 0. int signal_number () const; // The following methods belong to // ACE_WIN32_Asynch_Read_Stream_Result. They are here to avoid VC++ // warnings. These methods route their call to the // ACE_WIN32_Asynch_Read_Stream_Result base class. /// The number of bytes which were requested at the start of the /// asynchronous write. size_t bytes_to_write () const; /// Message block that contains the data to be written. ACE_Message_Block &message_block () const; /// I/O handle used for writing. ACE_HANDLE handle () const; /// Post @c this to the Proactor's completion port. int post_completion (ACE_Proactor_Impl *proactor); protected: /// Constructor is protected since creation is limited to /// ACE_Asynch_Write_File factory. ACE_WIN32_Asynch_Write_File_Result (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, ACE_Message_Block &message_block, size_t bytes_to_write, const void* act, u_long offset, u_long offset_high, ACE_HANDLE event, int priority, int signal_number = 0, int gather_enabled = 0); /// ACE_Proactor will call this method when the write completes. virtual void complete (size_t bytes_transferred, int success, const void *completion_key, u_long error); /// Destructor. virtual ~ACE_WIN32_Asynch_Write_File_Result (); }; /** * @class ACE_WIN32_Asynch_Write_File * * @brief This class is a factory for starting off asynchronous writes * on a file. * * Once is called, multiple asynchronous s can be * started using this class. A ACE_Asynch_Write_File::Result * will be passed back to the @a handler when the asynchronous * writes completes through the * callback. */ class ACE_Export ACE_WIN32_Asynch_Write_File : public virtual ACE_Asynch_Write_File_Impl, public ACE_WIN32_Asynch_Write_Stream { public: /// Constructor. ACE_WIN32_Asynch_Write_File (ACE_WIN32_Proactor *win32_proactor); /** * This starts off an asynchronous write. Upto @a bytes_to_write * will be write and stored in the @a message_block. The write will * start at @a offset from the beginning of the file. */ int write (ACE_Message_Block &message_block, size_t bytes_to_write, u_long offset, u_long offset_high, const void *act, int priority, int signal_number = 0); /** * Same as above but with gather support, through chaining of * composite message blocks using the continuation field. * @note Each data block payload must be at least the size of a * system memory page and must be aligned on a system memory page * size boundary */ int writev (ACE_Message_Block &message_block, size_t bytes_to_write, u_long offset, u_long offset_high, const void *act, int priority, int signal_number = 0); /// Destrcutor. virtual ~ACE_WIN32_Asynch_Write_File (); // = Methods belong to ACE_WIN32_Asynch_Operation base class. These // methods are defined here to avoid VC++ warnings. They route the // call to the ACE_WIN32_Asynch_Operation base class. /** * Initializes the factory with information which will be used with * each asynchronous call. If ( == ACE_INVALID_HANDLE), * will be called on the @a handler to get the * correct handle. */ int open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor); /** * This cancels all pending accepts operations that were issued by * the calling thread. The function does not cancel asynchronous * operations issued by other threads. */ int cancel (); /// Return the underlying proactor. ACE_Proactor* proactor () const; private: /** * This method belongs to ACE_WIN32_Asynch_Write_Stream. It is here * to avoid compiler warnings. This method is forwarded to the * Write_File specific method with 0 offset values. */ int write (ACE_Message_Block &message_block, size_t bytes_to_write, const void *act, int priority, int signal_number = 0); /** * Same as above but with gather support, through chaining of composite * message blocks using the continuation field. */ int writev (ACE_Message_Block &message_block, size_t bytes_to_write, const void *act, int priority, int signal_number = 0); }; /** * @class ACE_WIN32_Asynch_Accept_Result * * @brief This class implements ACE_Asynch_Accept::Result for WIN32 * platform. * * This class has all the information necessary for the * @a handler to uniquiely identify the completion of the * asynchronous accept. */ class ACE_Export ACE_WIN32_Asynch_Accept_Result : public virtual ACE_Asynch_Accept_Result_Impl, public ACE_WIN32_Asynch_Result { /// Factory will have special permission. friend class ACE_WIN32_Asynch_Accept; /// Proactor class has special permission. friend class ACE_WIN32_Proactor; public: /// The number of bytes which were requested at the start of the /// asynchronous accept. size_t bytes_to_read () const; /// Message block which contains the read data. ACE_Message_Block &message_block () const; /// I/O handle used for accepting new connections. ACE_HANDLE listen_handle () const; /// I/O handle for the new connection. ACE_HANDLE accept_handle () const; // = Base class operations. These operations are here to kill some // warnings. These methods call the base class methods. /// Number of bytes transferred by the operation. size_t bytes_transferred () const; /// ACT associated with the operation. const void *act () const; /// Did the operation succeed? int success () 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. */ const void *completion_key () const; /// Error value if the operation fail. u_long error () const; /// Event associated with the OVERLAPPED structure. ACE_HANDLE event () const; /// This really make sense only when doing file I/O. u_long offset () const; /// Offset_high associated with the OVERLAPPED structure. u_long offset_high () const; /// The priority of the asynchronous operation. Currently, this is /// not supported on Win32. int priority () const; /// No-op. Returns 0. int signal_number () const; /// Post @c this to the Proactor's completion port. int post_completion (ACE_Proactor_Impl *proactor); protected: /// Constructor is protected since creation is limited to /// ACE_Asynch_Accept factory. ACE_WIN32_Asynch_Accept_Result (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE listen_handle, ACE_HANDLE accept_handle, ACE_Message_Block &message_block, size_t bytes_to_read, const void* act, ACE_HANDLE event, int priority, int signal_number = 0); /// ACE_Proactor will call this method when the accept completes. virtual void complete (size_t bytes_transferred, int success, const void *completion_key, u_long error); /// Destructor. virtual ~ACE_WIN32_Asynch_Accept_Result (); /// Bytes requested when the asynchronous read was initiated. size_t bytes_to_read_; /// Message block for reading the data into. ACE_Message_Block &message_block_; /// I/O handle used for accepting new connections. ACE_HANDLE listen_handle_; /// I/O handle for the new connection. ACE_HANDLE accept_handle_; }; /** * @class ACE_WIN32_Asynch_Accept * * @brief This class is a factory for starting off asynchronous accepts * on a listen handle. * * Once is called, multiple asynchronous s can * started using this class. A ACE_Asynch_Accept::Result will * be passed back to the @a handler when the asynchronous accept * completes through the * callback. */ class ACE_Export ACE_WIN32_Asynch_Accept : public virtual ACE_Asynch_Accept_Impl, public ACE_WIN32_Asynch_Operation { public: /// Constructor. ACE_WIN32_Asynch_Accept (ACE_WIN32_Proactor *win32_proactor); /** * This starts off an asynchronous accept. The asynchronous accept * call also allows any initial data to be returned to the * @a handler. Upto @a bytes_to_read will be read and stored in the * @a message_block. The will be used for the * call. If ( == INVALID_HANDLE), a new * handle will be created. * * @a message_block must be specified. This is because the address of * the new connection is placed at the end of this buffer. */ int accept (ACE_Message_Block &message_block, size_t bytes_to_read, ACE_HANDLE accept_handle, const void *act, int priority, int signal_number = 0, int addr_family = AF_INET); /// Destructor. ~ACE_WIN32_Asynch_Accept (); // Methods belong to ACE_WIN32_Asynch_Operation base class. These // methods are defined here to avoid VC++ warnings. They route the // call to the ACE_WIN32_Asynch_Operation base class. /** * Initializes the factory with information which will be used with * each asynchronous call. If ( == ACE_INVALID_HANDLE), * will be called on the @a handler to get the * correct handle. */ int open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor); /** * This cancels all pending accepts operations that were issued by * the calling thread. The function does not cancel asynchronous * operations issued by other threads. */ int cancel (); /// Return the underlying proactor. ACE_Proactor* proactor () const; }; /** * @class ACE_WIN32_Asynch_Connect_Result * * @brief This is that class which will be passed back to the * completion handler when the asynchronous connect completes. * * This class has all the information necessary for the * completion handler to uniquiely identify the completion of the * asynchronous connect. */ class ACE_Export ACE_WIN32_Asynch_Connect_Result : public virtual ACE_Asynch_Connect_Result_Impl, public ACE_WIN32_Asynch_Result { /// Factory classes will have special permissions. friend class ACE_WIN32_Asynch_Connect; /// The Proactor constructs the Result class for faking results. friend class ACE_WIN32_Proactor; public: /// I/O handle for the connection. ACE_HANDLE connect_handle () const; // = Base class operations. These operations are here to kill some // warnings. These methods call the base class methods. /// Number of bytes transferred by the operation. size_t bytes_transferred () const; /// ACT associated with the operation. const void *act () const; /// Did the operation succeed? int success () const; /** * 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. */ const void *completion_key () const; /// Error value if the operation fail. u_long error () const; /// Event associated with the OVERLAPPED structure. ACE_HANDLE event () const; /// This really make sense only when doing file I/O. u_long offset () const; /// Offset_high associated with the OVERLAPPED structure. u_long offset_high () const; /// The priority of the asynchronous operation. Currently, this is /// not supported on Win32. int priority () const; /// No-op. Returns 0. int signal_number () const; /// Post this object to the Proactor's completion port. int post_completion (ACE_Proactor_Impl *proactor); protected: /// Constructor is protected since creation is limited to /// ACE_Asynch_Connect factory. ACE_WIN32_Asynch_Connect_Result (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE connect_handle, const void* act, ACE_HANDLE event, int priority, int signal_number); /// ACE_Proactor will call this method when the accept completes. virtual void complete (size_t bytes_transferred, int success, const void *completion_key, u_long error); /// Destructor. virtual ~ACE_WIN32_Asynch_Connect_Result (); /// Set the I/O handle for the new connection. void connect_handle (ACE_HANDLE handle); ACE_HANDLE connect_handle_; }; /** * @class ACE_WIN32_Asynch_Connect */ class ACE_Export ACE_WIN32_Asynch_Connect : public virtual ACE_Asynch_Connect_Impl, public ACE_WIN32_Asynch_Operation, public ACE_Event_Handler { public: /// Constructor. ACE_WIN32_Asynch_Connect (ACE_WIN32_Proactor * win32_proactor); /// Destructor. virtual ~ACE_WIN32_Asynch_Connect (); /** * This open belongs to ACE_WIN32_Asynch_Operation. We forward * this call to that method. We have put this here to avoid the * compiler warnings. */ int open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor = 0); /** * Start an asynchronous connect. * * @param connect_handle Handle to use for the connect. If the value * ACE_INVALID_HANDLE, a new handle will be created. * * @retval 0 Success * @retval -1 Error */ int connect (ACE_HANDLE connect_handle, const ACE_Addr &remote_sap, const ACE_Addr &local_sap, int reuse_addr, const void *act, int priority, int signal_number = 0); /** * Cancel all pending pseudo-asynchronus requests * Behavior as usual AIO request */ int cancel (); /** * Close performs cancellation of all pending requests * and close the connect handle */ int close (); /// Virtual from ACE_Event_Handler ACE_HANDLE get_handle () const; /// Virtual from ACE_Event_Handler void set_handle (ACE_HANDLE handle); /// Virtual from ACE_Event_Handler int handle_input ( ACE_HANDLE handle); int handle_output ( ACE_HANDLE handle); int handle_exception ( ACE_HANDLE handle); /// Virtual from ACE_Event_Handler int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask) ; // = Methods belong to ACE_WIN32_Asynch_Operation base class. These // methods are defined here to avoid dominace warnings. They route // the call to the ACE_WIN32_Asynch_Operation base class. /// Return the underlying proactor. ACE_Proactor* proactor () const; private: int connect_i (ACE_WIN32_Asynch_Connect_Result *result, const ACE_Addr &remote_sap, const ACE_Addr &local_sap, int reuse_addr); int post_result (ACE_WIN32_Asynch_Connect_Result *result, bool flg_post); /// Cancel uncompleted connect operations. /** * @param flg_notify Indicates whether or not to send notification about * canceled connect operations. If false, don't send * notifications. If true, notify user about canceled * connects. * According WIN32 standards we should receive * notifications on canceled AIO requests. * * @param set Receives the set of I/O handles on which asynchronous * connect requests were canceled as a result of this * method. The contents of @a set are completely * replaced. */ int cancel_uncompleted (bool flg_notify, ACE_Handle_Set &set); /// true - Connect is registered in ACE_Asynch_Pseudo_Task /// false - Accept is deregisted in ACE_Asynch_Pseudo_Task bool flg_open_ ; typedef ACE_Map_Manager MAP_MANAGER; /// Map of Result pointers that correspond to all the 's /// pending. MAP_MANAGER result_map_; /// The lock to protect the result map which is shared. The queue /// is updated by main thread in the register function call and /// through the auxillary thread in the asynch pseudo task. ACE_SYNCH_MUTEX lock_; }; /** * @class ACE_WIN32_Asynch_Transmit_File_Result * * @brief This class implements ACE_Asynch_Transmit_File::Result for * WIN32 platforms. * * This class has all the information necessary for the * @a handler to uniquiely identify the completion of the * asynchronous transmit file. */ class ACE_Export ACE_WIN32_Asynch_Transmit_File_Result : public virtual ACE_Asynch_Transmit_File_Result_Impl, public ACE_WIN32_Asynch_Result { /// Factory class will have special permission. friend class ACE_WIN32_Asynch_Transmit_File; /// Proactor class has special permission. friend class ACE_WIN32_Proactor; public: /// Socket used for transmitting the file. ACE_HANDLE socket () const; /// File from which the data is read. ACE_HANDLE file () const; /// Header and trailer data associated with this transmit file. ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer () const; /// The number of bytes which were requested at the start of the /// asynchronous transmit file. size_t bytes_to_write () const; /// Number of bytes per send requested at the start of the transmit /// file. size_t bytes_per_send () const; /// Flags which were passed into transmit file. u_long flags () const; // Base class operations. These operations are here to kill some // warnings. These methods call the base class methods. /// Number of bytes transferred by the operation. size_t bytes_transferred () const; /// ACT associated with the operation. const void *act () const; /// Did the operation succeed? int success () 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. */ const void *completion_key () const; /// Error value if the operation fail. u_long error () const; /// Event associated with the OVERLAPPED structure. ACE_HANDLE event () const; /// This really make sense only when doing file I/O. u_long offset () const; /// Offset_high associated with the OVERLAPPED structure. u_long offset_high () const; /// The priority of the asynchronous operation. Currently, this is /// not supported on Win32. int priority () const; /// No-op. Returns 0. int signal_number () const; /// Post @c this to the Proactor's completion port. int post_completion (ACE_Proactor_Impl *proactor); protected: /// Constructor is protected since creation is limited to /// ACE_Asynch_Transmit_File factory. ACE_WIN32_Asynch_Transmit_File_Result (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE socket, ACE_HANDLE file, ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer, size_t bytes_to_write, u_long offset, u_long offset_high, size_t bytes_per_send, u_long flags, const void *act, ACE_HANDLE event, int priority, int signal_number = 0); /// Proactor will call this method when the write completes. virtual void complete (size_t bytes_transferred, int success, const void *completion_key, u_long error); /// Destructor. virtual ~ACE_WIN32_Asynch_Transmit_File_Result (); /// Network I/O handle. ACE_HANDLE socket_; /// File I/O handle. ACE_HANDLE file_; /// Header and trailer data associated with this transmit file. ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer_; /// The number of bytes which were requested at the start of the /// asynchronous transmit file. size_t bytes_to_write_; /// Number of bytes per send requested at the start of the transmit /// file. size_t bytes_per_send_; /// Flags which were passed into transmit file. u_long flags_; }; /** * @class ACE_WIN32_Asynch_Transmit_File * * @brief This class is a factory for starting off asynchronous * transmit files on a stream. * * Once is called, multiple asynchronous s * can started using this class. A * ACE_Asynch_Transmit_File::Result will be passed back to the * @a handler when the asynchronous transmit file completes * through the 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. */ class ACE_Export ACE_WIN32_Asynch_Transmit_File : public virtual ACE_Asynch_Transmit_File_Impl, public ACE_WIN32_Asynch_Operation { public: /// Constructor. ACE_WIN32_Asynch_Transmit_File (ACE_WIN32_Proactor *win32_proactor); /** * This starts off an asynchronous transmit file. The is a * handle to an open file. 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 @a bytes_to_write will be * written to the . If you want to send the entire file, * let @a bytes_to_write = 0. @a 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. */ int transmit_file (ACE_HANDLE file, ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer, size_t bytes_to_write, u_long offset, u_long offset_high, size_t bytes_per_send, u_long flags, const void *act, int priority, int signal_number = 0); /// Destructor. ~ACE_WIN32_Asynch_Transmit_File (); // Methods belong to ACE_WIN32_Asynch_Operation base class. These // methods are defined here to avoid VC++ warnings. They route the // call to the ACE_WIN32_Asynch_Operation base class. /** * Initializes the factory with information which will be used with * each asynchronous call. If ( == ACE_INVALID_HANDLE), * will be called on the @a handler to get the * correct handle. */ int open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor); /** * This cancels all pending accepts operations that were issued by * the calling thread. The function does not cancel asynchronous * operations issued by other threads. */ int cancel (); /// Return the underlying proactor. ACE_Proactor* proactor () const; }; /** * @class ACE_WIN32_Asynch_Read_Dgram_Result * * @brief This class provides concrete implementation for * ACE_Asynch_Read_Dgram::Result class. */ class ACE_Export ACE_WIN32_Asynch_Read_Dgram_Result : public virtual ACE_Asynch_Read_Dgram_Result_Impl, public ACE_WIN32_Asynch_Result { /// Factory class will have special permissions. friend class ACE_WIN32_Asynch_Read_Dgram; /// Proactor class has special permission. friend class ACE_WIN32_Proactor; public: /// The number of bytes which were requested at the start of the /// asynchronous read. size_t bytes_to_read () const; /// Message block which contains the read data ACE_Message_Block *message_block () const; /// The address of where the packet came from int remote_address (ACE_Addr& addr) const; sockaddr *saddr () const; /// The flags used in the read int flags () const; /// I/O handle used for reading. ACE_HANDLE handle () const; // Base class operations. These operations are here to kill // dominance warnings. These methods call the base class methods. /// Number of bytes transferred by the operation. size_t bytes_transferred () const; /// ACT associated with the operation. const void *act () const; /// Did the operation succeed? int success () 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. */ const void *completion_key () const; /// Error value if the operation fail. u_long error () const; /// Event associated with the OVERLAPPED structure. ACE_HANDLE event () const; /// This really make sense only when doing file I/O. u_long offset () const; /// Offset_high associated with the OVERLAPPED structure. u_long offset_high () const; /// The priority of the asynchronous operation. Currently, this is /// not supported on Win32. int priority () const; /// No-op. Returns 0. int signal_number () const; /// Post @c this to the Proactor's completion port. int post_completion (ACE_Proactor_Impl *proactor); protected: /// Constructor is protected since creation is limited to /// ACE_Asynch_Read_Dgram factory. ACE_WIN32_Asynch_Read_Dgram_Result (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, ACE_Message_Block *message_block, size_t bytes_to_read, int flags, int protocol_family, const void* act, ACE_HANDLE event, int priority, int signal_number = 0); /// Proactor will call this method when the read completes. virtual void complete (size_t bytes_transferred, int success, const void *completion_key, u_long error); /// Destructor. virtual ~ACE_WIN32_Asynch_Read_Dgram_Result (); /// Bytes requested when the asynchronous read was initiated. size_t bytes_to_read_; /// Message block for reading the data into. ACE_Message_Block *message_block_; /// The address of where the packet came from ACE_Addr *remote_address_; int addr_len_; /// The flags used in the read int flags_; /// I/O handle used for reading. ACE_HANDLE handle_; }; /** * @class ACE_WIN32_Asynch_Read_Dgram * * @brief This class is a factory for starting off asynchronous reads * on a UDP socket. * * Once is called, multiple asynchronous s can be * started using this class. An ACE_Asynch_Read_Dgram::Result * will be passed back to the @a handler when the asynchronous * reads completes through the * callback. */ class ACE_Export ACE_WIN32_Asynch_Read_Dgram : public virtual ACE_Asynch_Read_Dgram_Impl, public ACE_WIN32_Asynch_Operation { public: /// Constructor. ACE_WIN32_Asynch_Read_Dgram (ACE_WIN32_Proactor *win32_proactor); /// Destructor. virtual ~ACE_WIN32_Asynch_Read_Dgram (); /** This starts off an asynchronous read. Upto * total_size()> will be read and stored in the * @a message_block. @a message_block's will be updated to reflect * the added bytes if the read operation is successfully completed. * Return code of 1 means immediate success and * will contain number of bytes read. The * method will still be called. Return code of 0 means the IO will * complete proactively. Return code of -1 means there was an error, use * errno to get the error code. * * Scatter/gather is supported on WIN32 by using the cont()> * method. Up to ACE_IOV_MAX @a message_block's are supported. Upto * size()> bytes will be read into each for * a total of total_size()> bytes. All @a message_block's * 's will be updated to reflect the added bytes for each * @a message_block */ virtual ssize_t recv (ACE_Message_Block *message_block, size_t &number_of_bytes_recvd, int flags, int protocol_family, const void *act, int priority, int signal_number); // Methods belong to ACE_WIN32_Asynch_Operation base class. These // methods are defined here to avoid VC++ warnings. They route the // call to the ACE_WIN32_Asynch_Operation base class. /** * Initializes the factory with information which will be used with * each asynchronous call. If ( == ACE_INVALID_HANDLE), * will be called on the @a handler to get the * correct handle. */ int open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor); /** * This cancels all pending accepts operations that were issued by * the calling thread. The function does not cancel asynchronous * operations issued by other threads. */ int cancel (); /// Return the underlying proactor. ACE_Proactor* proactor () const; protected: /// Do-nothing constructor. ACE_WIN32_Asynch_Read_Dgram (); }; /** * @class ACE_WIN32_Asynch_Write_Dgram_Result * * @brief This class provides concrete implementation for * ACE_Asynch_Write_Dgram::Result class. */ class ACE_Export ACE_WIN32_Asynch_Write_Dgram_Result : public virtual ACE_Asynch_Write_Dgram_Result_Impl, public ACE_WIN32_Asynch_Result { /// Factory class willl have special permissions. friend class ACE_WIN32_Asynch_Write_Dgram; /// Proactor class has special permission. friend class ACE_WIN32_Proactor; public: /// The number of bytes which were requested at the start of the /// asynchronous write. size_t bytes_to_write () const; /// Message block which contains the sent data ACE_Message_Block *message_block () const; /// The flags using in the write int flags () const; /// I/O handle used for writing. ACE_HANDLE handle () const; // = Base class operations. These operations are here to kill some // warnings. These methods call the base class methods. /// Number of bytes transferred by the operation. size_t bytes_transferred () const; /// ACT associated with the operation. const void *act () const; /// Did the operation succeed? int success () 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. */ const void *completion_key () const; /// Error value if the operation fail. u_long error () const; /// Event associated with the OVERLAPPED structure. ACE_HANDLE event () const; /// This really make sense only when doing file I/O. u_long offset () const; /// Offset_high associated with the OVERLAPPED structure. u_long offset_high () const; /// The priority of the asynchronous operation. Currently, this is /// not supported on Win32. int priority () const; /// No-op. Returns 0. int signal_number () const; /// Post @c this to the Proactor's completion port. int post_completion (ACE_Proactor_Impl *proactor); protected: /// Constructor is protected since creation is limited to /// ACE_Asynch_Write_Stream factory. ACE_WIN32_Asynch_Write_Dgram_Result (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, ACE_Message_Block *message_block, size_t bytes_to_write, int flags, const void* act, ACE_HANDLE event, int priority, int signal_number = 0); /// ACE_Proactor will call this method when the write completes. virtual void complete (size_t bytes_transferred, int success, const void *completion_key, u_long error); /// Destructor. virtual ~ACE_WIN32_Asynch_Write_Dgram_Result (); /// The number of bytes which were requested at the start of the /// asynchronous write. size_t bytes_to_write_; /// Message block used for the send. ACE_Message_Block *message_block_; /// The flags using in the write int flags_; /// I/O handle used for writing. ACE_HANDLE handle_; }; /** * @class ACE_WIN32_Asynch_Write_Dgram * * @brief This class is a factory for starting off asynchronous writes * on a UDP socket. * * Once is called, multiple asynchronous s can * started using this class. A ACE_Asynch_Write_Stream::Result * will be passed back to the @a handler when the asynchronous * write completes through the * callback. */ class ACE_Export ACE_WIN32_Asynch_Write_Dgram : public virtual ACE_Asynch_Write_Dgram_Impl, public ACE_WIN32_Asynch_Operation { public: /// Constructor. ACE_WIN32_Asynch_Write_Dgram (ACE_WIN32_Proactor *win32_proactor); /// Destructor. virtual ~ACE_WIN32_Asynch_Write_Dgram (); /** This starts off an asynchronous send. Upto * total_length()> will be sent. @a message_block's * will be updated to reflect the sent bytes if the send operation * is successfully completed. * Return code of 1 means immediate success and * is updated to number of bytes sent. The * method will still be called. Return code of 0 means the IO will * complete proactively. Return code of -1 means there was an error, use * errno to get the error code. * * Scatter/gather is supported on WIN32 by using the cont()> * method. Up to ACE_IOV_MAX @a message_block's are supported. Upto * length()> bytes will be sent from each * for a total of total_length()> bytes. All * @a message_block's 's will be updated to reflect the bytes sent * from each @a message_block. */ virtual ssize_t send (ACE_Message_Block *message_block, size_t &number_of_bytes_sent, int flags, const ACE_Addr &addr, const void *act, int priority, int signal_number); // = Methods belonging to base class. // These methods are defined here to avoid VC++ warnings. They route // the call to the base class. /** * Initializes the factory with information which will be used with * each asynchronous call. If ( == ACE_INVALID_HANDLE), * will be called on the @a handler to get the * correct handle. */ int open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor); /** * This cancels all pending accepts operations that were issued by * the calling thread. The function does not cancel asynchronous * operations issued by other threads. */ int cancel (); /// Return the underlying proactor. ACE_Proactor* proactor () const; protected: /// Do-nothing constructor. ACE_WIN32_Asynch_Write_Dgram (); }; ACE_END_VERSIONED_NAMESPACE_DECL #endif /* ACE_HAS_WIN32_OVERLAPPED_IO && ACE_HAS_WINSOCK2 */ #include /**/ "ace/post.h" #endif /* ACE_WIN32_ASYNCH_IO_H */