POSIX_Asynch_IO.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 //=============================================================================
00004 /**
00005  *  @file    POSIX_Asynch_IO.h
00006  *
00007  *  POSIX_Asynch_IO.h,v 4.50 2006/04/27 11:17:55 jwillemsen Exp
00008  *
00009  *  The implementation classes for POSIX implementation of Asynch
00010  *  Operations are defined here in this file.
00011  *
00012  *  @author Irfan Pyarali <irfan@cs.wustl.edu>
00013  *  @author Tim Harrison <harrison@cs.wustl.edu>
00014  *  @author Alexander Babu Arulanthu <alex@cs.wustl.edu>
00015  *  @author Roger Tragin <r.tragin@computer.org>
00016  *  @author Alexander Libman <alibman@baltimore.com>
00017  */
00018 //=============================================================================
00019 
00020 #ifndef ACE_POSIX_ASYNCH_IO_H
00021 #define ACE_POSIX_ASYNCH_IO_H
00022 
00023 #include "ace/config-all.h"
00024 
00025 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00026 #pragma once
00027 #endif /* ACE_LACKS_PRAGMA_ONCE */
00028 
00029 #if defined (ACE_HAS_AIO_CALLS)
00030 
00031 #include "ace/os_include/os_aio.h"
00032 
00033 #include "ace/Asynch_IO_Impl.h"
00034 #include "ace/Unbounded_Queue.h"
00035 #include "ace/Map_Manager.h"
00036 #include "ace/Event_Handler.h"
00037 #if defined(INTEGRITY)
00038 #include "ace/ACE.h"
00039 #endif
00040 
00041 #include "ace/Null_Mutex.h"
00042 
00043 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00044 
00045 // Forward declarations
00046 class ACE_POSIX_Proactor;
00047 class ACE_Proactor_Impl;
00048 class ACE_Handle_Set;
00049 
00050 /**
00051  * @class ACE_POSIX_Asynch_Result
00052  *
00053  * This class provides concrete implementation for ACE_Asynch_Result
00054  * for POSIX4 platforms. This class extends @c aiocb and makes it more
00055  * useful.
00056  */
00057 class ACE_Export ACE_POSIX_Asynch_Result : public virtual ACE_Asynch_Result_Impl,
00058                                            public aiocb
00059 {
00060 public:
00061   /// Number of bytes transferred by the operation.
00062   size_t bytes_transferred (void) const;
00063 
00064   /// ACT associated with the operation.
00065   const void *act (void) const;
00066 
00067   /// Did the operation succeed?
00068   int success (void) const;
00069 
00070   /**
00071    * This is the ACT associated with the handle on which the
00072    * Asynch_Operation takes place.
00073    *
00074    * @@ This is not implemented for POSIX4 platforms.
00075    *
00076    */
00077   const void *completion_key (void) const;
00078 
00079   /// Error value if the operation fail.
00080   u_long error (void) const;
00081 
00082   /// This returns ACE_INVALID_HANDLE on POSIX4 platforms.
00083   ACE_HANDLE event (void) const;
00084 
00085   /**
00086    * This really make sense only when doing file I/O.
00087    *
00088    * @@ On POSIX4-Unix, offset_high should be supported using
00089    *     aiocb64.
00090    *
00091    */
00092   u_long offset (void) const;
00093   u_long offset_high (void) const;
00094 
00095   /// Priority of the operation.
00096   int priority (void) const;
00097 
00098   /**
00099    * POSIX4 realtime signal number to be used for the
00100    * operation. <signal_number> ranges from SIGRTMIN to SIGRTMAX. By
00101    * default, SIGRTMIN is used to issue <aio_> calls.
00102    */
00103   int signal_number (void) const;
00104 
00105   /// Post <this> to the Proactor.
00106   int post_completion (ACE_Proactor_Impl *proactor);
00107 
00108   /// Destructor.
00109   virtual ~ACE_POSIX_Asynch_Result (void);
00110 
00111   /// Simulate error value to use in the post_completion ()
00112   void set_error (u_long errcode);
00113 
00114   /// Simulate value to use in the post_completion ()
00115   void set_bytes_transferred (size_t nbytes);
00116 
00117 protected:
00118   /// Constructor. <Event> is not used on POSIX.
00119   ACE_POSIX_Asynch_Result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00120                            const void* act,
00121                            ACE_HANDLE event,
00122                            u_long offset,
00123                            u_long offset_high,
00124                            int priority,
00125                            int signal_number);
00126 
00127   /// Handler that will be called back.
00128   ACE_Handler::Proxy_Ptr handler_proxy_;
00129 
00130   /**
00131    * ACT for this operation.
00132    * We could use <aiocb::aio_sigevent.sigev_value.sival_ptr> for
00133    * this. But it doesnot provide the constness, so this may be
00134    * better.
00135    */
00136   const void *act_;
00137 
00138   /// Bytes transferred by this operation.
00139   size_t bytes_transferred_;
00140 
00141   /// Success indicator.
00142   int success_;
00143 
00144   /// ACT associated with handle.
00145   const void *completion_key_;
00146 
00147   /// Error if operation failed.
00148   u_long error_;
00149 };
00150 
00151 /**
00152  * @class ACE_POSIX_Asynch_Operation
00153  *
00154  * @brief This class implements ACE_Asynch_Operation for all
00155  * implementations of Proactor (AIOCB, SIG, SUN)
00156  * Specific future implementations can derive from this class.
00157  */
00158 class ACE_Export ACE_POSIX_Asynch_Operation : public virtual ACE_Asynch_Operation_Impl
00159 {
00160 public:
00161   /**
00162    * Initializes the factory with information which will be used with
00163    * each asynchronous call.  If (@a handle == ACE_INVALID_HANDLE),
00164    * @c ACE_Handler::handle will be called on the handler to get the
00165    * correct handle. No need for the Proactor since the sub classes
00166    * will know the correct implementation Proactor class, since this
00167    * Operation class itself was created by the correct implementation
00168    * Proactor class.
00169    */
00170   int open (const ACE_Handler::Proxy_Ptr &handler_proxy,
00171             ACE_HANDLE handle,
00172             const void *completion_key,
00173             ACE_Proactor *proactor = 0);
00174 
00175   /// Check the documentation for ACE_Asynch_Operation::cancel.
00176   int cancel (void);
00177 
00178   // = Access methods.
00179 
00180   /// Return the underlying proactor.
00181   ACE_Proactor* proactor (void) const;
00182 
00183   /// Return the underlying Proactor implementation.
00184   ACE_POSIX_Proactor * posix_proactor (void) const;
00185 
00186 protected:
00187   /// Contructor.
00188   ACE_POSIX_Asynch_Operation (ACE_POSIX_Proactor *posix_proactor);
00189 
00190   /// Destructor.
00191   virtual ~ACE_POSIX_Asynch_Operation (void);
00192 
00193   // This call is for the POSIX implementation. This method is used by
00194   // ACE_Asynch_Operation to store some information with the
00195   // Proactor after an <aio_> call is issued, so that the Proactor can
00196   // retreve this information to do <aio_return> and <aio_error>.
00197   // Passing a '0' ptr returns the status, indicating whether there
00198   // are slots available or no. Passing a valid ptr stores the ptr
00199   // with the Proactor.
00200 
00201   /**
00202    * It is easy to get this specific implementation proactor here,
00203    * since it is the one that creates the correct POSIX_Asynch_*
00204    * objects. We can use this to get to the implementation proactor
00205    * directly.
00206    */
00207   ACE_POSIX_Proactor *posix_proactor_;
00208 
00209   /// Proactor that this Asynch IO will be registered with.
00210   ACE_Proactor *proactor_;
00211 
00212   /// Handler that will receive the callback.
00213   ACE_Handler::Proxy_Ptr handler_proxy_;
00214 
00215   /// I/O handle used for reading.
00216   ACE_HANDLE handle_;
00217 };
00218 
00219 /**
00220  * @class ACE_POSIX_Asynch_Read_Stream_Result
00221  *
00222  * @brief This class provides concrete implementation for
00223  *    <ACE_Asynch_Read_Stream::Result> class for POSIX platforms.
00224  */
00225 class ACE_Export ACE_POSIX_Asynch_Read_Stream_Result : public virtual ACE_Asynch_Read_Stream_Result_Impl,
00226                                                        public ACE_POSIX_Asynch_Result
00227 {
00228 
00229   /// Factory classes will have special permissions.
00230   friend class ACE_POSIX_Asynch_Read_Stream;
00231 
00232   /// The Proactor constructs the Result class for faking results.
00233   friend class ACE_POSIX_Proactor;
00234 
00235 public:
00236   /// The number of bytes which were requested at the start of the
00237   /// asynchronous read.
00238   size_t bytes_to_read (void) const;
00239 
00240   /// Message block which contains the read data.
00241   ACE_Message_Block &message_block (void) const;
00242 
00243   /// I/O handle used for reading.
00244   ACE_HANDLE handle (void) const;
00245 
00246 protected:
00247   ACE_POSIX_Asynch_Read_Stream_Result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00248                                        ACE_HANDLE handle,
00249                                        ACE_Message_Block &message_block,
00250                                        size_t bytes_to_read,
00251                                        const void* act,
00252                                        ACE_HANDLE event,
00253                                        int priority,
00254                                        int signal_number);
00255   // Constructor is protected since creation is limited to
00256   // ACE_Asynch_Read_Stream factory.
00257 
00258   /// Get the data copied to this class, before calling application
00259   /// handler.
00260   virtual void complete (size_t bytes_transferred,
00261                          int success,
00262                          const void *completion_key,
00263                          u_long error);
00264 
00265   /// Destructor.
00266   virtual ~ACE_POSIX_Asynch_Read_Stream_Result (void);
00267 
00268   // aiocb::aio_nbytes
00269   // Bytes requested when the asynchronous read was initiated.
00270 
00271   /// Message block for reading the data into.
00272   ACE_Message_Block &message_block_;
00273 
00274   // aiocb::aio_filedes
00275   // I/O handle used for reading.
00276 };
00277 
00278 /**
00279  * @class ACE_POSIX_Asynch_Read_Stream
00280  *
00281  * This class implements <ACE_Asynch_Read_Stream> for all POSIX
00282  * based implementation of Proactor.
00283  *
00284  */
00285 class ACE_Export ACE_POSIX_Asynch_Read_Stream : public virtual ACE_Asynch_Read_Stream_Impl,
00286                                                 public ACE_POSIX_Asynch_Operation
00287 {
00288 public:
00289   /// Constructor.
00290   ACE_POSIX_Asynch_Read_Stream (ACE_POSIX_Proactor *posix_proactor);
00291 
00292   /// This starts off an asynchronous read.  Upto <bytes_to_read> will
00293   /// be read and stored in the <message_block>.
00294   int read (ACE_Message_Block &message_block,
00295             size_t bytes_to_read,
00296             const void *act,
00297             int priority,
00298             int signal_number = 0);
00299 
00300   /// Destructor.
00301   virtual ~ACE_POSIX_Asynch_Read_Stream (void);
00302 };
00303 
00304 
00305 /**
00306  * @class ACE_POSIX_Asynch_Write_Stream_Result
00307  *
00308  * @brief This class provides concrete implementation for
00309  *     <ACE_Asynch_Write_Stream::Result> on POSIX platforms.
00310  *
00311  *
00312  *     This class has all the information necessary for the
00313  *     <handler> to uniquiely identify the completion of the
00314  *     asynchronous write.
00315  */
00316 class ACE_Export ACE_POSIX_Asynch_Write_Stream_Result : public virtual ACE_Asynch_Write_Stream_Result_Impl,
00317                                                         public ACE_POSIX_Asynch_Result
00318 {
00319   /// Factory classes will have special privilages.
00320   friend class ACE_POSIX_Asynch_Write_Stream;
00321 
00322   /// The Proactor constructs the Result class for faking results.
00323   friend class ACE_POSIX_Proactor;
00324 
00325 public:
00326   /// The number of bytes which were requested at the start of the
00327   /// asynchronous write.
00328   size_t bytes_to_write (void) const;
00329 
00330   /// Message block that contains the data to be written.
00331   ACE_Message_Block &message_block (void) const;
00332 
00333   /// I/O handle used for writing.
00334   ACE_HANDLE handle (void) const;
00335 
00336 protected:
00337   /// Constructor is protected since creation is limited to
00338   /// ACE_Asynch_Write_Stream factory.
00339   ACE_POSIX_Asynch_Write_Stream_Result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00340                                         ACE_HANDLE handle,
00341                                         ACE_Message_Block &message_block,
00342                                         size_t bytes_to_write,
00343                                         const void* act,
00344                                         ACE_HANDLE event,
00345                                         int priority,
00346                                         int signal_number);
00347 
00348   /// ACE_Proactor will call this method when the write completes.
00349   virtual void complete (size_t bytes_transferred,
00350                          int success,
00351                          const void *completion_key,
00352                          u_long error);
00353 
00354   /// Destructor.
00355   virtual ~ACE_POSIX_Asynch_Write_Stream_Result (void);
00356 
00357 protected:
00358   // aiocb::aio_nbytes
00359   // The number of bytes which were requested at the start of the
00360   // asynchronous write.
00361 
00362   /// Message block that contains the data to be written.
00363   ACE_Message_Block &message_block_;
00364 
00365   // aiocb::aio_filedes
00366   // I/O handle used for writing.
00367 };
00368 
00369 /**
00370  * @class ACE_POSIX_Asynch_Write_Stream
00371  *
00372  * @brief This class implements <ACE_Asynch_Write_Stream> for
00373  *  all POSIX implementations of ACE_Proactor.
00374  */
00375 class ACE_Export ACE_POSIX_Asynch_Write_Stream : public virtual ACE_Asynch_Write_Stream_Impl,
00376                                                  public ACE_POSIX_Asynch_Operation
00377 {
00378 public:
00379   /// Constructor.
00380   ACE_POSIX_Asynch_Write_Stream (ACE_POSIX_Proactor *posix_proactor);
00381 
00382   /// This starts off an asynchronous write.  Upto <bytes_to_write>
00383   /// will be written from the <message_block>.
00384   int write (ACE_Message_Block &message_block,
00385              size_t bytes_to_write,
00386              const void *act,
00387              int priority,
00388              int signal_number = 0);
00389 
00390   /// Destructor.
00391   virtual ~ACE_POSIX_Asynch_Write_Stream (void);
00392 };
00393 
00394 /**
00395  * @class ACE_POSIX_Asynch_Read_File_Result
00396  *
00397  * @brief This class provides concrete implementation for
00398  *     <ACE_Asynch_Read_File::Result> class for POSIX platforms.
00399  */
00400 class ACE_Export ACE_POSIX_Asynch_Read_File_Result : public virtual ACE_Asynch_Read_File_Result_Impl,
00401                                                      public ACE_POSIX_Asynch_Read_Stream_Result
00402 {
00403   /// Factory classes will have special permissions.
00404   friend class ACE_POSIX_Asynch_Read_File;
00405 
00406   /// The Proactor constructs the Result class for faking results.
00407   friend class ACE_POSIX_Proactor;
00408 
00409 public:
00410 
00411 protected:
00412   /// Constructor is protected since creation is limited to
00413   /// ACE_Asynch_Read_File factory.
00414   ACE_POSIX_Asynch_Read_File_Result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00415                                      ACE_HANDLE handle,
00416                                      ACE_Message_Block &message_block,
00417                                      size_t bytes_to_read,
00418                                      const void* act,
00419                                      u_long offset,
00420                                      u_long offset_high,
00421                                      ACE_HANDLE event,
00422                                      int priority,
00423                                      int signal_number);
00424 
00425   /// ACE_Proactor will call this method when the read completes.
00426   virtual void complete (size_t bytes_transferred,
00427                          int success,
00428                          const void *completion_key,
00429                          u_long error);
00430 
00431   /// Destructor.
00432   virtual ~ACE_POSIX_Asynch_Read_File_Result (void);
00433 };
00434 
00435 /**
00436  * @class ACE_POSIX_Asynch_Read_File
00437  *
00438  * @brief This class is a factory for starting off asynchronous reads
00439  *     on a file. This class implements <ACE_Asynch_Read_File> for
00440  *     all POSIX implementations of Proactor.
00441  *
00442  *     Once <open> is called, multiple asynchronous <read>s can
00443  *     started using this class.  A <ACE_Asynch_Read_File::Result>
00444  *     will be passed back to the <handler> when the asynchronous
00445  *     reads completes through the <ACE_Handler::handle_read_file>
00446  *     callback.
00447  *
00448  *     This class differs slightly from <ACE_Asynch_Read_Stream> as it
00449  *     allows the user to specify an offset for the read.
00450  */
00451 class ACE_Export ACE_POSIX_Asynch_Read_File : public virtual ACE_Asynch_Read_File_Impl,
00452                                               public ACE_POSIX_Asynch_Read_Stream
00453 {
00454 
00455 public:
00456   /// Constructor.
00457   ACE_POSIX_Asynch_Read_File (ACE_POSIX_Proactor *posix_proactor);
00458 
00459   /**
00460    * This starts off an asynchronous read.  Upto <bytes_to_read> will
00461    * be read and stored in the <message_block>.  The read will start
00462    * at <offset> from the beginning of the file.
00463    */
00464   int read (ACE_Message_Block &message_block,
00465             size_t bytes_to_read,
00466             u_long offset,
00467             u_long offset_high,
00468             const void *act,
00469             int priority,
00470             int signal_number = 0);
00471 
00472   /// Destructor.
00473   virtual ~ACE_POSIX_Asynch_Read_File (void);
00474 
00475 private:
00476   /**
00477    * This belongs to ACE_POSIX_Asynch_Read_Stream. We have
00478    * defined this here to avoid compiler warnings and forward the
00479    * method to <ACE_POSIX_Asynch_Read_Stream::read>.
00480    */
00481   int read (ACE_Message_Block &message_block,
00482             size_t bytes_to_read,
00483             const void *act,
00484             int priority,
00485             int signal_number = 0);
00486 };
00487 
00488 
00489 /**
00490  * @class ACE_POSIX_Asynch_Write_File_Result
00491  *
00492  * @brief This class provides implementation for
00493  *     <ACE_Asynch_Write_File_Result> for POSIX platforms.
00494  *
00495  *     This class has all the information necessary for the
00496  *     <handler> to uniquiely identify the completion of the
00497  *     asynchronous write.
00498  *
00499  *     This class differs slightly from
00500  *     <ACE_Asynch_Write_Stream::Result> as it calls back
00501  *     <ACE_Handler::handle_write_file> on the <handler> instead of
00502  *     <ACE_Handler::handle_write_stream>.  No additional state is
00503  *     required by this class as <ACE_Asynch_Result> can store the
00504  *     <offset>.
00505  */
00506 class ACE_Export ACE_POSIX_Asynch_Write_File_Result : public virtual ACE_Asynch_Write_File_Result_Impl,
00507                                                       public ACE_POSIX_Asynch_Write_Stream_Result
00508 {
00509   /// Factory classes will have special permissions.
00510   friend class ACE_POSIX_Asynch_Write_File;
00511 
00512   /// The Proactor constructs the Result class for faking results.
00513   friend class ACE_POSIX_Proactor;
00514 
00515 protected:
00516   /// Constructor is protected since creation is limited to
00517   /// ACE_Asynch_Write_File factory.
00518   ACE_POSIX_Asynch_Write_File_Result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00519                                       ACE_HANDLE handle,
00520                                       ACE_Message_Block &message_block,
00521                                       size_t bytes_to_write,
00522                                       const void* act,
00523                                       u_long offset,
00524                                       u_long offset_high,
00525                                       ACE_HANDLE event,
00526                                       int priority,
00527                                       int signal_number);
00528 
00529   /// ACE_Proactor will call this method when the write completes.
00530   virtual void complete (size_t bytes_transferred,
00531                          int success,
00532                          const void *completion_key,
00533                          u_long error);
00534 
00535   /// Destructor.
00536   virtual ~ACE_POSIX_Asynch_Write_File_Result (void);
00537 };
00538 
00539 /**
00540  * @class ACE_POSIX_Asynch_Write_File
00541  *
00542  *     This class provides concrete implementation for
00543  *     <ACE_Asynch_Write_File> for POSIX platforms where the
00544  *     completion strategy for Proactor is based on AIOCB (AIO
00545  *     Control Blocks).
00546  *
00547  */
00548 class ACE_Export ACE_POSIX_Asynch_Write_File : public virtual ACE_Asynch_Write_File_Impl,
00549                                                public ACE_POSIX_Asynch_Write_Stream
00550 {
00551 public:
00552   /// Constructor.
00553   ACE_POSIX_Asynch_Write_File (ACE_POSIX_Proactor *posix_proactor);
00554 
00555   /**
00556    * This starts off an asynchronous write.  Upto <bytes_to_write>
00557    * will be written and stored in the <message_block>.  The write will
00558    * start at <offset> from the beginning of the file.
00559    */
00560   int write (ACE_Message_Block &message_block,
00561              size_t bytes_to_write,
00562              u_long offset,
00563              u_long offset_high,
00564              const void *act,
00565              int priority,
00566              int signal_number = 0);
00567 
00568   /// Destructor.
00569   virtual ~ACE_POSIX_Asynch_Write_File (void);
00570 
00571 private:
00572   /**
00573    * This <write> belongs to ACE_POSIX_Asynch_Write_Stream. We
00574    * have put this here to avoid compiler warnings. We forward this
00575    * method call to the <ACE_POSIX_Asynch_Write_Stream::write>
00576    * one.
00577    */
00578   int write (ACE_Message_Block &message_block,
00579              size_t bytes_to_write,
00580              const void *act,
00581              int priority,
00582              int signal_number = 0);
00583 };
00584 
00585 /**
00586  * @class ACE_POSIX_Asynch_Accept_Result
00587  *
00588  * @brief This is that class which will be passed back to the
00589  *     handler when the asynchronous accept completes.
00590  *
00591  *
00592  *     This class has all the information necessary for the
00593  *     handler to uniquiely identify the completion of the
00594  *     asynchronous accept.
00595  */
00596 class ACE_Export ACE_POSIX_Asynch_Accept_Result : public virtual ACE_Asynch_Accept_Result_Impl,
00597                                                   public ACE_POSIX_Asynch_Result
00598 {
00599   /// Factory classes will have special permissions.
00600   friend class ACE_POSIX_Asynch_Accept;
00601 
00602   /// The Proactor constructs the Result class for faking results.
00603   friend class ACE_POSIX_Proactor;
00604 
00605 public:
00606   /// The number of bytes which were requested at the start of the
00607   /// asynchronous accept.
00608   size_t bytes_to_read (void) const;
00609 
00610   /// Message block which contains the read data.
00611   ACE_Message_Block &message_block (void) const;
00612 
00613   /// I/O handle used for accepting new connections.
00614   ACE_HANDLE listen_handle (void) const;
00615 
00616   /// I/O handle for the new connection.
00617   ACE_HANDLE accept_handle (void) const;
00618 
00619 protected:
00620   /// Constructor is protected since creation is limited to
00621   /// ACE_Asynch_Accept factory.
00622   ACE_POSIX_Asynch_Accept_Result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00623                                   ACE_HANDLE listen_handle,
00624                                   ACE_HANDLE accept_handle,
00625                                   ACE_Message_Block &message_block,
00626                                   size_t bytes_to_read,
00627                                   const void* act,
00628                                   ACE_HANDLE event,
00629                                   int priority,
00630                                   int signal_number);
00631 
00632   /// ACE_Proactor will call this method when the accept completes.
00633   virtual void complete (size_t bytes_transferred,
00634                          int success,
00635                          const void *completion_key,
00636                          u_long error);
00637 
00638   /// Destructor.
00639   virtual ~ACE_POSIX_Asynch_Accept_Result (void);
00640 
00641   // aiocb::aio_nbytes
00642   // Bytes requested when the asynchronous read was initiated.
00643   // Actually, on POSIX implementation, we dont read any intial data.
00644 
00645   /// Message block for reading the data into.
00646   ACE_Message_Block &message_block_;
00647 
00648   /// I/O handle used for accepting new connections.
00649   ACE_HANDLE listen_handle_;
00650 
00651   // aiocb::aio_filedes
00652   // I/O handle for the new connection.
00653 };
00654 
00655 
00656 /**
00657  * @class ACE_POSIX_Asynch_Accept
00658  *
00659  * @brief For the POSIX implementation this class is common for all Proactors
00660  * (AIOCB/SIG/SUN)
00661  */
00662 class ACE_Export ACE_POSIX_Asynch_Accept :
00663   public virtual ACE_Asynch_Accept_Impl,
00664   public ACE_POSIX_Asynch_Operation,
00665   public ACE_Event_Handler
00666 {
00667 public:
00668 
00669   /// Constructor.
00670   ACE_POSIX_Asynch_Accept (ACE_POSIX_Proactor * posix_proactor);
00671 
00672   /// Destructor.
00673   virtual ~ACE_POSIX_Asynch_Accept (void);
00674 
00675  /**
00676    * This <open> belongs to ACE_POSIX_Asynch_Operation. We forward
00677    * this call to that method. We have put this here to avoid the
00678    * compiler warnings.
00679    */
00680   int open (const ACE_Handler::Proxy_Ptr &handler_proxy,
00681             ACE_HANDLE handle,
00682             const void *completion_key,
00683             ACE_Proactor *proactor = 0);
00684 
00685   /**
00686    * This starts off an asynchronous accept.  The asynchronous accept
00687    * call also allows any initial data to be returned to the
00688    * <handler>.  Upto <bytes_to_read> will be read and stored in the
00689    * <message_block>.  The <accept_handle> will be used for the
00690    * <accept> call.  If (<accept_handle> == INVALID_HANDLE), a new
00691    * handle will be created.
00692    *
00693    * <message_block> must be specified. This is because the address of
00694    * the new connection is placed at the end of this buffer.
00695    */
00696   int accept (ACE_Message_Block &message_block,
00697               size_t bytes_to_read,
00698               ACE_HANDLE accept_handle,
00699               const void *act,
00700               int priority,
00701               int signal_number = 0,
00702               int addr_family = AF_INET);
00703 
00704   /**
00705    *  Cancel all pending pseudo-asynchronus requests
00706    *  Behavior as usual AIO request
00707    */
00708   int cancel (void);
00709 
00710   /**
00711    *  Close performs cancellation of all pending requests
00712    *  and closure the listen handle
00713    */
00714   int close ();
00715 
00716   /// virtual from ACE_Event_Handler
00717   ACE_HANDLE get_handle (void) const;
00718 
00719   /// virtual from ACE_Event_Handler
00720   void set_handle (ACE_HANDLE handle);
00721 
00722   /// virtual from ACE_Event_Handler
00723   /// Called when accept event comes up on <listen_handle>
00724   int handle_input (ACE_HANDLE handle);
00725 
00726   /// virtual from ACE_Event_Handler
00727   int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask);
00728 
00729 private:
00730   /// flg_notify points whether or not we should send notification about
00731   /// canceled accepts
00732   ///  Parameter flg_notify can be
00733   ///    0  - don't send notifications about canceled accepts
00734   ///    1  - notify user about canceled accepts
00735   ///         according POSIX standards we should receive notifications
00736   ///         on canceled AIO requests
00737   int cancel_uncompleted (int flg_notify);
00738 
00739   /// true  - Accept is registered in ACE_Asynch_Pseudo_Task
00740   /// false - Accept is deregisted in ACE_Asynch_Pseudo_Task
00741   bool flg_open_ ;
00742 
00743   /// Queue of Result pointers that correspond to all the pending
00744   /// accept operations.
00745   ACE_Unbounded_Queue<ACE_POSIX_Asynch_Accept_Result*> result_queue_;
00746 
00747   /// The lock to protect the result queue which is shared. The queue
00748   /// is updated by main thread in the register function call and
00749   /// through the auxillary thread in the deregister fun. So let us
00750   /// mutex it.
00751   ACE_SYNCH_MUTEX lock_;
00752 };
00753 
00754 /**
00755  * @class ACE_POSIX_Asynch_Connect_Result
00756  *
00757  * @brief This is that class which will be passed back to the
00758  *     completion handler when the asynchronous connect completes.
00759  *
00760  *     This class has all the information necessary for a
00761  *     completion handler to uniquely identify the completion of the
00762  *     asynchronous connect.
00763  */
00764 class ACE_Export ACE_POSIX_Asynch_Connect_Result : public virtual ACE_Asynch_Connect_Result_Impl,
00765                                                   public ACE_POSIX_Asynch_Result
00766 {
00767   /// Factory classes will have special permissions.
00768   friend class ACE_POSIX_Asynch_Connect;
00769 
00770   /// The Proactor constructs the Result class for faking results.
00771   friend class ACE_POSIX_Proactor;
00772 
00773 public:
00774 
00775   /// I/O handle for the  connection.
00776   ACE_HANDLE connect_handle (void) const;
00777 
00778 protected:
00779   /// Constructor is protected since creation is limited to
00780   /// ACE_Asynch_Connect factory.
00781   ACE_POSIX_Asynch_Connect_Result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00782                                    ACE_HANDLE  connect_handle,
00783                                    const void* act,
00784                                    ACE_HANDLE  event,
00785                                    int priority,
00786                                    int signal_number);
00787 
00788   /// ACE_Proactor will call this method when the accept completes.
00789   virtual void complete (size_t bytes_transferred,
00790                          int success,
00791                          const void *completion_key,
00792                          u_long error);
00793 
00794   /// Destructor.
00795   virtual ~ACE_POSIX_Asynch_Connect_Result (void);
00796 
00797   // aiocb::aio_filedes
00798   // I/O handle for the new connection.
00799   void connect_handle (ACE_HANDLE handle);
00800 };
00801 
00802 
00803 /**
00804  * @class ACE_POSIX_Asynch_Connect
00805  *
00806  */
00807 class ACE_Export ACE_POSIX_Asynch_Connect :
00808   public virtual ACE_Asynch_Connect_Impl,
00809   public ACE_POSIX_Asynch_Operation,
00810   public ACE_Event_Handler
00811 {
00812 public:
00813 
00814   /// Constructor.
00815   ACE_POSIX_Asynch_Connect (ACE_POSIX_Proactor * posix_proactor);
00816 
00817   /// Destructor.
00818   virtual ~ACE_POSIX_Asynch_Connect (void);
00819 
00820  /**
00821    * This belongs to ACE_POSIX_Asynch_Operation. We forward
00822    * this call to that method. We have put this here to avoid the
00823    * compiler warnings.
00824    */
00825   int open (const ACE_Handler::Proxy_Ptr &handler_proxy,
00826             ACE_HANDLE handle,
00827             const void *completion_key,
00828             ACE_Proactor *proactor = 0);
00829 
00830   /**
00831    * This starts off an asynchronous connect.
00832    *
00833    * @arg connect_handle   will be used for the connect call.  If
00834    *                       ACE_INVALID_HANDLE is specified, a new
00835    *                       handle will be created.
00836    */
00837   int connect (ACE_HANDLE connect_handle,
00838                const ACE_Addr &remote_sap,
00839                const ACE_Addr &local_sap,
00840                int reuse_addr,
00841                const void *act,
00842                int priority,
00843                int signal_number = 0);
00844 
00845   /**
00846    *  Cancel all pending pseudo-asynchronus requests
00847    *  Behavior as usual AIO request
00848    */
00849   int cancel (void);
00850 
00851   /**
00852    *  Close performs cancellation of all pending requests.
00853    */
00854   int close (void);
00855 
00856   /// virtual from ACE_Event_Handler
00857   ACE_HANDLE get_handle (void) const;
00858 
00859   /// virtual from ACE_Event_Handler
00860   void set_handle (ACE_HANDLE handle);
00861 
00862   /// virtual from ACE_Event_Handler
00863   /// The default action on handle_input() and handle_exception is to
00864   /// return -1. Since that's what we want to do, just reuse them.
00865   /// handle_output(), however, is where successful connects are reported.
00866   int handle_output (ACE_HANDLE handle);
00867 
00868   /// virtual from ACE_Event_Handler
00869   int handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask) ;
00870 
00871 private:
00872   int connect_i (ACE_POSIX_Asynch_Connect_Result *result,
00873                  const ACE_Addr & remote_sap,
00874                  const ACE_Addr & local_sap,
00875                  int reuse_addr);
00876 
00877   int post_result (ACE_POSIX_Asynch_Connect_Result *result, bool flg_post);
00878 
00879   /// Cancel uncompleted connect operations.
00880   /**
00881    *  @arg flg_notify  Indicates whether or not we should send notification
00882    *                   about canceled accepts.  If this is false, don't send
00883    *                   notifications about canceled connects.  If true, notify
00884    *                   user about canceled connects according POSIX
00885    *                   standards we should receive notifications on canceled
00886    *                   AIO requests.
00887    */
00888   int cancel_uncompleted (bool flg_notify, ACE_Handle_Set &set);
00889 
00890   bool flg_open_ ;
00891   /// true  - Connect is registered in ACE_Asynch_Pseudo_Task
00892   /// false - Aceept is deregisted in ACE_Asynch_Pseudo_Task
00893 
00894   typedef ACE_Map_Manager<ACE_HANDLE, ACE_POSIX_Asynch_Connect_Result *, ACE_SYNCH_NULL_MUTEX>
00895           MAP_MANAGER;
00896 
00897   /// @deprecated (Two) Deprecated typedefs.  Use the map traits instead.
00898   typedef MAP_MANAGER::ITERATOR MAP_ITERATOR;
00899   typedef MAP_MANAGER::ENTRY MAP_ENTRY;
00900 
00901   /// Map of Result pointers that correspond to all the pending connects.
00902   MAP_MANAGER result_map_;
00903 
00904   /// The lock to protect the result map which is shared. The queue
00905   /// is updated by main thread in the register function call and
00906   /// through the auxillary thread  in the asynch pseudo task.
00907   ACE_SYNCH_MUTEX lock_;
00908 };
00909 
00910 
00911 /**
00912  * @class ACE_POSIX_Asynch_Transmit_File_Result
00913  *
00914  * @brief This is that class which will be passed back to the
00915  *     <handler> when the asynchronous transmit file completes.
00916  *
00917  *     This class has all the information necessary for the
00918  *     <handler> to uniquiely identify the completion of the
00919  *     asynchronous transmit file.
00920  */
00921 class ACE_Export ACE_POSIX_Asynch_Transmit_File_Result : public virtual ACE_Asynch_Transmit_File_Result_Impl,
00922                                                          public ACE_POSIX_Asynch_Result
00923 {
00924   /// Factory classes will have special permissions.
00925   friend class ACE_POSIX_Asynch_Transmit_File;
00926 
00927   /// Handlers do all the job.
00928   friend class ACE_POSIX_Asynch_Transmit_Handler;
00929 
00930   /// The Proactor constructs the Result class for faking results.
00931   friend class ACE_POSIX_Proactor;
00932 
00933 public:
00934   /// Socket used for transmitting the file.
00935   ACE_HANDLE socket (void) const;
00936 
00937   /// File from which the data is read.
00938   ACE_HANDLE file (void) const;
00939 
00940   /// Header and trailer data associated with this transmit file.
00941   ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer (void) const;
00942 
00943   /// The number of bytes which were requested at the start of the
00944   /// asynchronous transmit file.
00945   size_t bytes_to_write (void) const;
00946 
00947   /// Number of bytes per send requested at the start of the transmit
00948   /// file.
00949   size_t bytes_per_send (void) const;
00950 
00951   /// Flags which were passed into transmit file.
00952   u_long flags (void) const;
00953 
00954 protected:
00955   ACE_POSIX_Asynch_Transmit_File_Result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00956                                          ACE_HANDLE socket,
00957                                          ACE_HANDLE file,
00958                                          ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer,
00959                                          size_t bytes_to_write,
00960                                          u_long offset,
00961                                          u_long offset_high,
00962                                          size_t bytes_per_send,
00963                                          u_long flags,
00964                                          const void *act,
00965                                          ACE_HANDLE event,
00966                                          int priority,
00967                                          int signal_number);
00968   // Constructor is protected since creation is limited to
00969   // ACE_Asynch_Transmit_File factory.
00970 
00971   /// ACE_Proactor will call this method when the write completes.
00972   virtual void complete (size_t bytes_transferred,
00973                          int success,
00974                          const void *completion_key,
00975                          u_long error);
00976 
00977   /// Destructor.
00978   virtual ~ACE_POSIX_Asynch_Transmit_File_Result (void);
00979 
00980   /// Network I/O handle.
00981   ACE_HANDLE socket_;
00982 
00983   // aiocb::aio_filedes
00984   // File I/O handle.
00985 
00986   /// Header and trailer data associated with this transmit file.
00987   ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer_;
00988 
00989   // aiocb::aio_nbytes
00990   // The number of bytes which were requested at the start of the
00991   // asynchronous transmit file.
00992 
00993   /// Number of bytes per send requested at the start of the transmit
00994   /// file.
00995   size_t bytes_per_send_;
00996 
00997   /// Flags which were passed into transmit file.
00998   u_long flags_;
00999 };
01000 
01001 /**
01002  * @class ACE_POSIX_Asynch_Transmit_File
01003  *
01004  * @brief Implementation for transmit_file will make use of
01005  *     POSIX_Asynch_Transmit_Handler.
01006  */
01007 class ACE_Export ACE_POSIX_Asynch_Transmit_File : public virtual ACE_Asynch_Transmit_File_Impl,
01008                                                   public ACE_POSIX_Asynch_Operation
01009 {
01010 public:
01011   /// Constructor.
01012   ACE_POSIX_Asynch_Transmit_File (ACE_POSIX_Proactor *posix_proactor);
01013 
01014   /**
01015    * This starts off an asynchronous transmit file. The <file> is a
01016    * handle to an open file.  <header_and_trailer> is a pointer to a
01017    * data structure that contains pointers to data to send before and
01018    * after the file data is sent.  Set this parameter to 0 if you only
01019    * want to transmit the file data.  Upto <bytes_to_write> will be
01020    * written to the <socket>.  If you want to send the entire file,
01021    * let <bytes_to_write> = 0.  <bytes_per_send> is the size of each
01022    * block of data sent per send operation. Please read the POSIX
01023    * documentation on what the flags should be.
01024    */
01025   int transmit_file (ACE_HANDLE file,
01026                      ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer,
01027                      size_t bytes_to_write,
01028                      u_long offset,
01029                      u_long offset_high,
01030                      size_t bytes_per_send,
01031                      u_long flags,
01032                      const void *act,
01033                      int priority,
01034                      int signal_number = 0);
01035 
01036   /// Destructor.
01037   virtual ~ACE_POSIX_Asynch_Transmit_File (void);
01038 };
01039 
01040 
01041 /**
01042  * @class ACE_POSIX_Asynch_Read_Dgram
01043  *
01044  * @brief This class is a factory for starting off asynchronous reads
01045  *     on a UDP socket.
01046  *
01047  *     Once <open> is called, multiple asynchronous <read>s can be
01048  *     started using this class.  An ACE_Asynch_Read_Dgram::Result
01049  *     will be passed back to the <handler> when the asynchronous
01050  *     reads completes through the <ACE_Handler::handle_read_stream>
01051  *     callback.
01052  *
01053  */
01054 class ACE_Export ACE_POSIX_Asynch_Read_Dgram : public virtual ACE_Asynch_Read_Dgram_Impl,
01055                                                public ACE_POSIX_Asynch_Operation
01056 {
01057 public:
01058   /// Constructor.
01059   ACE_POSIX_Asynch_Read_Dgram (ACE_POSIX_Proactor *posix_proactor);
01060   virtual ~ACE_POSIX_Asynch_Read_Dgram (void);
01061 
01062   /** This method queues an asynchronous read.  Up to
01063    * @a message_block->total_size() bytes will be read and stored in the
01064    * @a message_block beginning at its write pointer. The @a message_block
01065    * write pointer will be updated to reflect any added bytes if the read
01066    * operation is successful completed.
01067    * Priority of the operation is specified by <priority>. On POSIX4-Unix,
01068    * this is supported. Works like <nice> in Unix. Negative values are not
01069    * allowed. 0 means priority of the operation same as the process
01070    * priority. 1 means priority of the operation is one less than
01071    * process.  <signal_number> argument is a no-op on non-POSIX4 systems.
01072    *
01073    * @note Unlike the Windows version of this facility, no indication of
01074    * immediate success can be returned, and @a number_of_bytes_read is
01075    * never used.
01076    *
01077    * @arg flags Not used.
01078    * @arg protocol_family Not used.
01079    * @retval 0  The IO will complete asynchronously.
01080    * @retval -1 There was an error; see @c errno to get the error code.
01081    *
01082    */
01083   virtual ssize_t recv (ACE_Message_Block *message_block,
01084                         size_t &number_of_bytes_recvd,
01085                         int flags,
01086                         int protocol_family,
01087                         const void *act,
01088                         int priority,
01089                         int signal_number);
01090 
01091 protected:
01092   /// Do-nothing constructor.
01093   ACE_POSIX_Asynch_Read_Dgram (void);
01094 };
01095 
01096 /**
01097  * @class ACE_POSIX__Asynch_Write_Dgram_Result
01098  *
01099  * @brief This is class provides concrete implementation for
01100  *        ACE_Asynch_Write_Dgram::Result class.
01101  */
01102 class ACE_Export ACE_POSIX_Asynch_Write_Dgram_Result : public virtual ACE_Asynch_Write_Dgram_Result_Impl,
01103                                                        public ACE_POSIX_Asynch_Result
01104 {
01105   /// Factory classes will have special permissions.
01106   friend class ACE_POSIX_Asynch_Write_Dgram;
01107 
01108   /// Proactor class has special permission.
01109   friend class ACE_POSIX_Proactor;
01110 
01111 public:
01112   /// The number of bytes which were requested at the start of the
01113   /// asynchronous write.
01114   size_t bytes_to_write (void) const;
01115 
01116   /// Message block which contains the sent data
01117   ACE_Message_Block *message_block (void) const;
01118 
01119   /// The flags using in the write
01120   int flags (void) const;
01121 
01122   /// I/O handle used for writing.
01123   ACE_HANDLE handle (void) const;
01124 
01125 protected:
01126   /// Constructor is protected since creation is limited to
01127   /// ACE_Asynch_Write_Stream factory.
01128   ACE_POSIX_Asynch_Write_Dgram_Result (const ACE_Handler::Proxy_Ptr &handler_proxy,
01129                                        ACE_HANDLE handle,
01130                                        ACE_Message_Block *message_block,
01131                                        size_t bytes_to_write,
01132                                        int flags,
01133                                        const void* act,
01134                                        ACE_HANDLE event,
01135                                        int priority,
01136                                        int signal_number);
01137 
01138   /// ACE_Proactor will call this method when the write completes.
01139   virtual void complete (size_t bytes_transferred,
01140                          int success,
01141                          const void *completion_key,
01142                          u_long error);
01143 
01144   /// Destructor.
01145   virtual ~ACE_POSIX_Asynch_Write_Dgram_Result (void);
01146 
01147   /// The number of bytes which were requested at the start of the
01148   /// asynchronous write.
01149   size_t bytes_to_write_;
01150 
01151   /// Message block used for the send.
01152   ACE_Message_Block *message_block_;
01153 
01154   /// The flags using in the write
01155   int flags_;
01156 
01157   /// I/O handle used for writing.
01158   ACE_HANDLE handle_;
01159 
01160   };
01161 
01162 /**
01163  * @class ACE_POSIX_Asynch_Write_Dgram
01164  *
01165  * @brief This class is a factory for starting off asynchronous writes
01166  *    on a UDP socket. The UDP socket must be "connected", as there is
01167  *    no facility for specifying the destination address on each send
01168  *    operation.
01169  *
01170  *     Once @c open() is called, multiple asynchronous writes can
01171  *     started using this class.  A ACE_Asynch_Write_Stream::Result
01172  *     will be passed back to the associated completion handler when the
01173  *     asynchronous write completes through the
01174  *     ACE_Handler::handle_write_stream() callback.
01175  */
01176 class ACE_Export ACE_POSIX_Asynch_Write_Dgram : public virtual ACE_Asynch_Write_Dgram_Impl,
01177                                                 public ACE_POSIX_Asynch_Operation
01178 {
01179 public:
01180   /// Constructor.
01181   ACE_POSIX_Asynch_Write_Dgram (ACE_POSIX_Proactor *posix_proactor);
01182 
01183   /// Destructor
01184   virtual ~ACE_POSIX_Asynch_Write_Dgram (void);
01185 
01186   /** This method queues an asynchronous send.  Up to
01187    * @a message_block->total_length bytes will be sent, beginning at the
01188    * read pointer. The @a message_block read pointer will be updated to
01189    * reflect the sent bytes if the send operation is successful completed.
01190    *
01191    * Priority of the operation is specified by @a priority. On POSIX,
01192    * this is supported. Works like @c nice in Unix. Negative values are not
01193    * allowed. 0 means priority of the operation same as the process
01194    * priority. 1 means priority of the operation is one less than
01195    * process, etc.
01196    * @a signal_number is a no-op on non-POSIX4 systems.
01197    *
01198    * @note Unlike the Windows version of this facility, no indication of
01199    * immediate success can be returned, and @a number_of_bytes_sent is
01200    * never used.
01201    *
01202    * @arg flags Not used.
01203    * @arg addr Not used.
01204    * @retval 0  The IO will complete asynchronously.
01205    * @retval -1 There was an error; see @c errno to get the error code.
01206    */
01207   virtual ssize_t send (ACE_Message_Block *message_block,
01208                         size_t &number_of_bytes_sent,
01209                         int flags,
01210                         const ACE_Addr &addr,
01211                         const void *act,
01212                         int priority,
01213                         int signal_number);
01214 
01215 protected:
01216   /// Do-nothing constructor.
01217   ACE_POSIX_Asynch_Write_Dgram (void);
01218 };
01219 
01220 
01221 /*****************************************************/
01222 
01223 /**
01224  * @class ACE_POSIX_Asynch_Read_Dgram_Result
01225  *
01226  * @brief This is class provides concrete implementation for
01227  *        ACE_Asynch_Read_Dgram::Result class.
01228  */
01229 class ACE_Export ACE_POSIX_Asynch_Read_Dgram_Result : public virtual ACE_Asynch_Read_Dgram_Result_Impl,
01230                                                       public virtual ACE_POSIX_Asynch_Result
01231 {
01232 
01233   /// Factory classes will have special permissions.
01234   friend class ACE_POSIX_Asynch_Read_Dgram;
01235 
01236   /// Proactor class has special permission.
01237   friend class ACE_POSIX_Proactor;
01238 
01239 public:
01240   /// The number of bytes which were requested at the start of the
01241   /// asynchronous read.
01242   size_t bytes_to_read (void) const;
01243 
01244   /// Message block which contains the read data
01245   ACE_Message_Block *message_block (void) const;
01246 
01247   /// The address of where the packet came from
01248   int remote_address (ACE_Addr& addr) const;
01249 
01250   sockaddr *saddr (void) const;
01251 
01252   /// The flags used in the read
01253   int flags (void) const;
01254 
01255   /// I/O handle used for reading.
01256   ACE_HANDLE handle (void) const;
01257 
01258 protected:
01259   /// Constructor is protected since creation is limited to
01260   /// ACE_Asynch_Read_Dgram factory.
01261   ACE_POSIX_Asynch_Read_Dgram_Result (const ACE_Handler::Proxy_Ptr &handler_proxy,
01262                                       ACE_HANDLE handle,
01263                                       ACE_Message_Block *message_block,
01264                                       size_t bytes_to_read,
01265                                       int flags,
01266                                       int protocol_family,
01267                                       const void* act,
01268                                       ACE_HANDLE event,
01269                                       int priority,
01270                                       int signal_number = 0);
01271 
01272   /// Proactor will call this method when the read completes.
01273   virtual void complete (size_t bytes_transferred,
01274                          int success,
01275                          const void *completion_key,
01276                          u_long error);
01277 
01278   /// Destructor.
01279   virtual ~ACE_POSIX_Asynch_Read_Dgram_Result (void);
01280 
01281   /// Bytes requested when the asynchronous read was initiated.
01282   size_t bytes_to_read_;
01283 
01284   /// Message block for reading the data into.
01285   ACE_Message_Block *message_block_;
01286 
01287   /// The address of where the packet came from
01288   ACE_Addr *remote_address_;
01289 
01290   int addr_len_;
01291 
01292   /// The flags used in the read
01293   int flags_;
01294 
01295   /// I/O handle used for reading.
01296   ACE_HANDLE handle_;
01297 
01298 };
01299 
01300 ACE_END_VERSIONED_NAMESPACE_DECL
01301 
01302 #endif /* ACE_HAS_AIO_CALLS */
01303 #endif /* ACE_POSIX_ASYNCH_IO_H */

Generated on Thu Nov 9 09:41:59 2006 for ACE by doxygen 1.3.6