summaryrefslogtreecommitdiff
path: root/ace/Asynch_IO.h
diff options
context:
space:
mode:
Diffstat (limited to 'ace/Asynch_IO.h')
-rw-r--r--ace/Asynch_IO.h873
1 files changed, 354 insertions, 519 deletions
diff --git a/ace/Asynch_IO.h b/ace/Asynch_IO.h
index fb555a90610..0667f1bdb22 100644
--- a/ace/Asynch_IO.h
+++ b/ace/Asynch_IO.h
@@ -4,42 +4,40 @@
// ============================================================================
//
// = LIBRARY
-//
// ace
//
// = FILENAME
-//
// Asynch_IO.h
//
// = DESCRIPTION
+// This only works on Win32 platforms or on POSIX platforms with
+// aio_ routines.
//
-// This works on Win32 (#if defined (ACE_WIN32) && !defined
-// (ACE_HAS_WINCE)) platforms and on POSIX4 platforms with <aio_*>
-// routines (#if defined (ACE_HAS_AIO_CALLS))
-//
-// On Win32 platforms, the implementation of
-// <ACE_Asynch_Transmit_File> and <ACE_Asynch_Accept> are only
-// supported if ACE_HAS_WINSOCK2 is defined or you are on WinNT 4.0
-// or higher.
+// The implementation of <ACE_Asynch_Transmit_File> and
+// <ACE_Asynch_Accept> are only supported if ACE_HAS_WINSOCK2 is
+// defined or you are on WinNT 4.0 or higher.
//
// = AUTHOR
-//
-// Irfan Pyarali <irfan@cs.wustl.edu>,
-// Tim Harrison <harrison@cs.wustl.edu> and
+// Irfan Pyarali (irfan@cs.wustl.edu),
+// Tim Harrison (harrison@cs.wustl.edu) and
// Alexander Babu Arulanthu <alex@cs.wustl.edu>
//
// ============================================================================
-#if !defined (ACE_ASYNCH_IO_H)
+#ifndef ACE_ASYNCH_IO_H
#define ACE_ASYNCH_IO_H
#include "ace/OS.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
-#pragma once
+# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
-#if (defined (ACE_WIN32) && !defined (ACE_HAS_WINCE)) || (defined (ACE_HAS_AIO_CALLS))
+#if (defined (ACE_WIN32) && !defined (ACE_HAS_WINCE)) || \
+ (defined (ACE_HAS_AIO_CALLS))
+
+#include "ace/Task.h"
+#include "ace/Reactor.h"
// Forward declarations
class ACE_Proactor;
@@ -47,26 +45,24 @@ class ACE_Handler;
class ACE_Message_Block;
class ACE_INET_Addr;
-// Forward declarations
-class ACE_Asynch_Result_Impl;
-
-class ACE_Export ACE_Asynch_Result
+class ACE_Export ACE_Asynch_Result : public ACE_OVERLAPPED
{
// = TITLE
- //
- // An interface base class which allows users access to common
- // information related to an asynchronous operation.
+ // An abstract class which adds information to the OVERLAPPED
+ // structure to make it more useful.
//
// = DESCRIPTION
- //
- // An interface base class from which you can obtain some basic
+ // 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
+ // success or failure, etc. Subclasses may want to store more
// information that is particular to the asynchronous operation
// it represents.
-
public:
+ // Proactor is the only class which is allowed to call the
+ // <complete> method.
+ friend class ACE_Proactor;
+
u_long bytes_transferred (void) const;
// Number of bytes transferred by the operation.
@@ -77,205 +73,167 @@ public:
// Did the operation succeed?
const void *completion_key (void) const;
- // This is the ACT associated with the handle on which the
- // Asynch_Operation takes place.
- //
- // On WIN32, this returns the ACT associated with the handle when it
- // was registered with the I/O completion port.
- //
- // @@ This is not implemented for POSIX4 platforms. Returns 0.
+ // This returns the ACT associated with the handle when it was
+ // registered with the I/O completion port. This ACT is not the
+ // same as the ACT associated with the asynchronous operation.
u_long error (void) const;
- // Error value if the operation fails.
+ // Error value if the operation fail.
ACE_HANDLE event (void) const;
- // On WIN32, this returns the event associated with the OVERLAPPED
- // structure.
- //
- // This returns ACE_INVALID_HANDLE on POSIX4-Unix platforms.
+ // Event associated with the OVERLAPPED structure
u_long offset (void) const;
u_long offset_high (void) const;
- // This really make sense only when doing file I/O.
- //
- // On WIN32, these are represented in the OVERLAPPED datastructure.
- //
- // @@ On POSIX4-Unix, offset_high should be supported using aiocb64.
+ // Offset associated with the OVERLAPPED structure. This really
+ // make sense only when doing file I/O.
- int priority (void) const;
- // Priority of the operation.
- //
- // On POSIX4-Unix, this is supported. Works like <nice> in
- // Unix. Negative values are not allowed. 0 means priority of the
- // operation same as the process priority. 1 means priority of the
- // operation is one less than process. And so forth.
- //
- // On Win32, this is a no-op.
-
- int signal_number (void) const;
- // POSIX4 real-time signal number to be used for the
- // operation. <signal_number> ranges from ACE_SIGRTMIN to ACE_SIGRTMAX. By
- // default, ACE_SIGRTMIN is used to issue <aio_> calls. This is a no-op
- // on non-POSIX4 systems and returns 0.
+ ACE_Asynch_Result (ACE_Handler &handler,
+ const void* act,
+ ACE_HANDLE event,
+ u_long offset = 0,
+ u_long offset_high = 0);
+ // Constructor.
+#if defined (ACE_HAS_AIO_CALLS)
+ aiocb* aiocb_ptr (void);
+ // Returns the underlying <aio control block> used to issue the aio
+ // call.
+#endif /* ACE_HAS_AIO_CALLS */
virtual ~ACE_Asynch_Result (void);
// Destructor.
protected:
- ACE_Asynch_Result (ACE_Asynch_Result_Impl *implementation);
- // Constructor. This implementation will not be deleted. The
- // implementation will be deleted by the Proactor.
-
- ACE_Asynch_Result_Impl *implementation (void) const;
- // Get the implementation class.
-
- ACE_Asynch_Result_Impl *implementation_;
- // Implementation class.
+ virtual void complete (u_long bytes_transferred,
+ int success,
+ const void *completion_key,
+ u_long error = 0) = 0;
+ // This is the key method. Subclasses will override this method to
+ // call the correct callback on the handler.
+
+ ACE_Handler &handler_;
+ // Handler that will be called back.
+
+ const void *act_;
+ // ACT for this operation.
+
+ u_long bytes_transferred_;
+ // Bytes transferred by this operation.
+
+ int success_;
+ // Success indicator.
+
+ const void *completion_key_;
+ // ACT associated with handle.
+
+ u_long error_;
+ // Error if operation failed.
+
+#if defined (ACE_HAS_AIO_CALLS)
+ aiocb *aiocb_ptr_;
+ // This is the <aio control block> used to issue the <aio_>
+ // call. Let us give this to the OS along with the result, so that
+ // on completion we can take this and use it for <aio_error> and
+ // <aio_return>.
+#endif /* ACE_HAS_AIO_CALLS */
};
-// Forward declarations
-class ACE_Asynch_Operation_Impl;
-
class ACE_Export ACE_Asynch_Operation
{
// = TITLE
- //
- // This is an interface base class for all asynch
- // operations. The resposiblility of this class is to forward
- // all methods to its delegation/implementation class, e.g.,
- // <ACE_WIN32_Asynch_Operation> or <ACE_POSIX_Asynch_Operation>.
+ // This is a base class for all asynch operations.
//
// = DESCRIPTION
- //
// There are some attributes and functionality which is common
- // to all asychronous operations. The delegation classes of this
- // class will factor out this code.
-
+ // to all asychronous operations. This abstract class will
+ // factor out this code.
public:
int open (ACE_Handler &handler,
- ACE_HANDLE handle,
- const void *completion_key,
- ACE_Proactor *proactor);
+ ACE_HANDLE handle = ACE_INVALID_HANDLE,
+ const void *completion_key = 0,
+ ACE_Proactor *proactor = 0);
// Initializes the factory with information which will be used with
// each asynchronous call. If (<handle> == ACE_INVALID_HANDLE),
// <ACE_Handler::handle> will be called on the <handler> to get the
// correct handle.
int cancel (void);
- // On Win32, this cancels all pending accepts operations that were
- // issued by the calling thread. The function does not cancel
- // asynchronous operations issued by other threads.
- //
- // @@ POSIX: please implement me.
-
- // = Access methods.
+ // This cancels all pending accepts operations that were issued by
+ // the calling thread. The function does not cancel asynchronous
+ // operations issued by other threads.
- ACE_Proactor* proactor (void) const;
+ // Access methods.
+ ACE_Proactor* proactor (void);
// Return the underlying proactor.
-
- virtual ~ACE_Asynch_Operation (void);
- // Destructor.
-
protected:
+#if defined (ACE_HAS_AIO_CALLS)
+ int register_aio_with_proactor (aiocb *aiocb_ptr);
+ // This call is for the POSIX implementation. This method is used by
+ // <ACE_Asynch_Operation> to store some information with the
+ // Proactor after an <aio_> call is issued, so that the Proactor can
+ // retrive this information to do <aio_return> and <aio_error>.
+ // Passing a '0' ptr returns the status, indicating whether there
+ // are slots available or no. Passing a valid ptr stores the ptr
+ // with the Proactor.
+#endif /* ACE_HAS_AIO_CALLS */
+
ACE_Asynch_Operation (void);
- // Constructor.
+ // A no-op constructor.
- ACE_Asynch_Operation_Impl *implementation (void) const;
- // Return the underlying implementation class.
+ ACE_Proactor *proactor_;
+ // Proactor that this Asynch IO will be registered with.
- void implementation (ACE_Asynch_Operation_Impl *implementation);
- // Set the implementation class.
-
- ACE_Proactor *get_proactor (ACE_Proactor *user_proactor,
- ACE_Handler &handler) const;
- // Get a proactor for/from the user
+ ACE_Handler *handler_;
+ // Handler that will receive the callback.
- ACE_Asynch_Operation_Impl *implementation_;
- // Implementation class.
+ ACE_HANDLE handle_;
+ // I/O handle used for reading.
};
-// Forward declarations
-class ACE_Asynch_Read_Stream_Result_Impl;
-class ACE_Asynch_Read_Stream_Impl;
-
class ACE_Export ACE_Asynch_Read_Stream : public ACE_Asynch_Operation
{
// = TITLE
- //
// This class is a factory for starting off asynchronous reads
- // on a stream. This class forwards all methods to its
- // implementation class.
+ // on a stream.
//
// = DESCRIPTION
- //
// Once <open> is called, multiple asynchronous <read>s can
// started using this class. An ACE_Asynch_Read_Stream::Result
// will be passed back to the <handler> when the asynchronous
// reads completes through the <ACE_Handler::handle_read_stream>
// callback.
-
public:
+ class Result;
+ // Forward declaration of the Result class.
+
ACE_Asynch_Read_Stream (void);
// A do nothing constructor.
- virtual ~ACE_Asynch_Read_Stream (void);
- // Destructor
-
- int open (ACE_Handler &handler,
- ACE_HANDLE handle = ACE_INVALID_HANDLE,
- const void *completion_key = 0,
- ACE_Proactor *proactor = 0);
- // Initializes the factory with information which will be used with
- // each asynchronous call. If (<handle> == ACE_INVALID_HANDLE),
- // <ACE_Handler::handle> will be called on the <handler> to get the
- // correct handle.
-
int read (ACE_Message_Block &message_block,
u_long bytes_to_read,
- const void *act = 0,
- int priority = 0,
- int signal_number = ACE_SIGRTMIN);
+ const void *act = 0);
// This starts off an asynchronous read. Upto <bytes_to_read> will
- // be read and stored in the <message_block>. Priority of the
- // operation is specified by <priority>. On POSIX4-Unix, this is
- // supported. Works like <nice> in Unix. Negative values are not
- // allowed. 0 means priority of the operation same as the process
- // priority. 1 means priority of the operation is one less than
- // process. And so forth. On Win32, this is a no-op.
- // <signal_number> is the POSIX4 real-time signal number to be used
- // for the operation. <signal_number> ranges from ACE_SIGRTMIN to
- // ACE_SIGRTMAX. This argument is a no-op on non-POSIX4 systems.
-
- ACE_Asynch_Read_Stream_Impl *implementation (void) const;
- // Return the underlying implementation class.
+ // be read and stored in the <message_block>.
protected:
- void implementation (ACE_Asynch_Read_Stream_Impl *implementation);
- // Set the implementation class.
-
- ACE_Asynch_Read_Stream_Impl *implementation_;
- // Implementation class that all methods will be forwarded to.
+ int shared_read (Result *result);
+ // This is the method which does the real work and is there so that
+ // the ACE_Asynch_Read_File class can use it too.
public:
class ACE_Export Result : public ACE_Asynch_Result
{
// = TITLE
- //
- // This is the class which will be passed back to the
- // <handler> when the asynchronous read completes. This class
- // forwards all the methods to the implementation classes.
+ // This is that class which will be passed back to the
+ // <handler> when the asynchronous read completes.
//
// = DESCRIPTION
- //
// This class has all the information necessary for the
// <handler> to uniquiely identify the completion of the
// asynchronous read.
-
- friend class ACE_POSIX_Asynch_Read_Stream_Result;
- friend class ACE_WIN32_Asynch_Read_Stream_Result;
- // The concrete implementation result classes only construct this
- // class.
+ friend class ACE_Asynch_Read_Stream;
+ // The factory has special privileges.
public:
u_long bytes_to_read (void) const;
@@ -288,104 +246,82 @@ public:
ACE_HANDLE handle (void) const;
// I/O handle used for reading.
- ACE_Asynch_Read_Stream_Result_Impl *implementation (void) const;
- // Get the implementation class.
-
+ // protected:
+ //
+ // These two should really be protected. But sometimes it
+ // simplifies code to be able to "fake" a result. Use carefully.
+ Result (ACE_Handler &handler,
+ ACE_HANDLE handle,
+ ACE_Message_Block &message_block,
+ u_long bytes_to_read,
+ const void* act,
+ ACE_HANDLE event);
+ // Constructor is protected since creation is limited to
+ // ACE_Asynch_Read_Stream factory.
+
+ virtual void complete (u_long bytes_transferred,
+ int success,
+ const void *completion_key,
+ u_long error = 0);
+ // ACE_Proactor will call this method when the read completes.
+
protected:
- Result (ACE_Asynch_Read_Stream_Result_Impl *implementation);
- // Constructor.
-
- virtual ~Result (void);
- // Destructor.
+ u_long bytes_to_read_;
+ // Bytes requested when the asynchronous read was initiated.
+
+ ACE_Message_Block &message_block_;
+ // Message block for reading the data into.
- ACE_Asynch_Read_Stream_Result_Impl *implementation_;
- // The implementation class.
+ ACE_HANDLE handle_;
+ // I/O handle used for reading.
};
};
-// Forward declarations
-class ACE_Asynch_Write_Stream_Impl;
-class ACE_Asynch_Write_Stream_Result_Impl;
-
class ACE_Export ACE_Asynch_Write_Stream : public ACE_Asynch_Operation
{
// = TITLE
- //
// This class is a factory for starting off asynchronous writes
- // on a stream. This class forwards all methods to its
- // implementation class.
+ // on a stream.
//
// = DESCRIPTION
- //
// Once <open> is called, multiple asynchronous <writes>s can
- // started using this class. An ACE_Asynch_Write_Stream::Result
+ // started using this class. A ACE_Asynch_Write_Stream::Result
// will be passed back to the <handler> when the asynchronous
// write completes through the
// <ACE_Handler::handle_write_stream> callback.
-
public:
+ class Result;
+ // Forward declaration of the Result class.
+
ACE_Asynch_Write_Stream (void);
// A do nothing constructor.
- virtual ~ACE_Asynch_Write_Stream (void);
- // Destructor.
-
- int open (ACE_Handler &handler,
- ACE_HANDLE handle = ACE_INVALID_HANDLE,
- const void *completion_key = 0,
- ACE_Proactor *proactor = 0);
- // Initializes the factory with information which will be used with
- // each asynchronous call. If (<handle> == ACE_INVALID_HANDLE),
- // <ACE_Handler::handle> will be called on the <handler> to get the
- // correct handle.
-
int write (ACE_Message_Block &message_block,
u_long bytes_to_write,
- const void *act = 0,
- int priority = 0,
- int signal_number = ACE_SIGRTMIN);
+ const void *act = 0);
// This starts off an asynchronous write. Upto <bytes_to_write>
- // will be written from the <message_block>. Priority of the
- // operation is specified by <priority>. On POSIX4-Unix, this is
- // supported. Works like <nice> in Unix. Negative values are not
- // allowed. 0 means priority of the operation same as the process
- // priority. 1 means priority of the operation is one less than
- // process. And so forth. On Win32, this is a no-op.
- // <signal_number> is the POSIX4 real-time signal number to be used
- // for the operation. <signal_number> ranges from ACE_SIGRTMIN to
- // ACE_SIGRTMAX. This argument is a no-op on non-POSIX4 systems.
-
- ACE_Asynch_Write_Stream_Impl *implementation (void) const;
- // Return the underlying implementation class.
+ // will be written from the <message_block>.
protected:
- void implementation (ACE_Asynch_Write_Stream_Impl *implementation);
- // Set the implementation class.
-
- ACE_Asynch_Write_Stream_Impl *implementation_;
- // Implementation class that all methods will be forwarded to.
+ int shared_write (Result *result);
+ // This is the method which does the real work and is there so that
+ // the ACE_Asynch_Write_File class can use it too.
public:
- class ACE_Export Result : public ACE_Asynch_Result
+ class ACE_Export Result : public ACE_Asynch_Result
{
// = TITLE
- //
// This is that class which will be passed back to the
- // <handler> when the asynchronous write completes. This class
- // forwards all the methods to the implementation class.
+ // <handler> when the asynchronous write completes.
//
// = DESCRIPTION
- //
// This class has all the information necessary for the
// <handler> to uniquiely identify the completion of the
// asynchronous write.
-
- friend class ACE_POSIX_Asynch_Write_Stream_Result;
- friend class ACE_WIN32_Asynch_Write_Stream_Result;
- // The concrete implementation result classes only construct this
- // class.
-
public:
+ friend class ACE_Asynch_Write_Stream;
+ // The factory has special privileges.
+
u_long bytes_to_write (void) const;
// The number of bytes which were requested at the start of the
// asynchronous write.
@@ -396,101 +332,70 @@ public:
ACE_HANDLE handle (void) const;
// I/O handle used for writing.
- ACE_Asynch_Write_Stream_Result_Impl *implementation (void) const;
- // Get the implementation class.
-
+ // protected:
+ //
+ // These two should really be protected. But sometimes it
+ // simplifies code to be able to "fake" a result. Use carefully.
+ Result (ACE_Handler &handler,
+ ACE_HANDLE handle,
+ ACE_Message_Block &message_block,
+ u_long bytes_to_write,
+ const void* act,
+ ACE_HANDLE event);
+ // Constructor is protected since creation is limited to
+ // ACE_Asynch_Write_Stream factory.
+
+ virtual void complete (u_long bytes_transferred,
+ int success,
+ const void *completion_key,
+ u_long error = 0);
+ // ACE_Proactor will call this method when the write completes.
+
protected:
- Result (ACE_Asynch_Write_Stream_Result_Impl *implementation);
- // Constrcutor.
-
- virtual ~Result (void);
- // Destructor.
-
- ACE_Asynch_Write_Stream_Result_Impl *implementation_;
- // Implementation class.
- };
-};
+ u_long bytes_to_write_;
+ // The number of bytes which were requested at the start of the
+ // asynchronous write.
-// Forward declarations
-class ACE_Asynch_Read_File_Impl;
-class ACE_Asynch_Read_File_Result_Impl;
+ ACE_Message_Block &message_block_;
+ // Message block that contains the data to be written.
+
+ ACE_HANDLE handle_;
+ // I/O handle used for writing.
+ };
+};
class ACE_Export ACE_Asynch_Read_File : public ACE_Asynch_Read_Stream
{
// = TITLE
- //
// This class is a factory for starting off asynchronous reads
- // on a file. This class forwards all methods to its
- // implementation class.
+ // on a file.
//
// = DESCRIPTION
- //
// Once <open> is called, multiple asynchronous <read>s can
- // started using this class. An ACE_Asynch_Read_File::Result
+ // started using this class. A ACE_Asynch_Read_File::Result
// will be passed back to the <handler> when the asynchronous
// reads completes through the <ACE_Handler::handle_read_file>
// callback.
//
// This class differs slightly from ACE_Asynch_Read_Stream as it
// allows the user to specify an offset for the read.
-
public:
- ACE_Asynch_Read_File (void);
- // A do nothing constructor.
-
- virtual ~ACE_Asynch_Read_File (void);
- // Destructor.
-
- int open (ACE_Handler &handler,
- ACE_HANDLE handle = ACE_INVALID_HANDLE,
- const void *completion_key = 0,
- ACE_Proactor *proactor = 0);
- // Initializes the factory with information which will be used with
- // each asynchronous call. If (<handle> == ACE_INVALID_HANDLE),
- // <ACE_Handler::handle> will be called on the <handler> to get the
- // correct handle.
-
int read (ACE_Message_Block &message_block,
u_long bytes_to_read,
u_long offset = 0,
u_long offset_high = 0,
- const void *act = 0,
- int priority = 0,
- int signal_number = ACE_SIGRTMIN);
+ const void *act = 0);
// This starts off an asynchronous read. Upto <bytes_to_read> will
// be read and stored in the <message_block>. The read will start
- // at <offset> from the beginning of the file. Priority of the
- // operation is specified by <priority>. On POSIX4-Unix, this is
- // supported. Works like <nice> in Unix. Negative values are not
- // allowed. 0 means priority of the operation same as the process
- // priority. 1 means priority of the operation is one less than
- // process. And so forth. On Win32, this is a no-op.
- // <signal_number> is the POSIX4 real-time signal number to be used
- // for the operation. <signal_number> ranges from ACE_SIGRTMIN to
- // ACE_SIGRTMAX. This argument is a no-op on non-POSIX4 systems.
-
- ACE_Asynch_Read_File_Impl *implementation (void) const;
- // Return the underlying implementation class.
-
-protected:
- void implementation (ACE_Asynch_Read_File_Impl *implementation);
- // Set the implementation class.
-
- ACE_Asynch_Read_File_Impl *implementation_;
- // Delegation/implementation class that all methods will be
- // forwarded to.
-
+ // at <offset> from the beginning of the file.
public:
class ACE_Export Result : public ACE_Asynch_Read_Stream::Result
{
// = TITLE
- //
// This is that class which will be passed back to the
- // <handler> when the asynchronous read completes. This class
- // forwards all the methods to the implementation class.
+ // <handler> when the asynchronous read completes.
//
// = DESCRIPTION
- //
// This class has all the information necessary for the
// <handler> to uniquiely identify the completion of the
// asynchronous read.
@@ -502,41 +407,40 @@ public:
// required by this class as ACE_Asynch_Result can store the
// <offset>.
- friend class ACE_POSIX_Asynch_Read_File_Result;
- friend class ACE_WIN32_Asynch_Read_File_Result;
- // The concrete implementation result classes only construct this
- // class.
-
- public:
- ACE_Asynch_Read_File_Result_Impl *implementation (void) const;
- // Get the implementation class.
+ friend class ACE_Asynch_Read_File;
+ // The factory has special privileges.
- protected:
- Result (ACE_Asynch_Read_File_Result_Impl *implementation);
- // Constructor. This implementation will not be deleted.
-
- virtual ~Result (void);
- // Destructor.
-
- ACE_Asynch_Read_File_Result_Impl *implementation_;
- // The implementation class.
+ // protected:
+ //
+ // These two should really be protected. But sometimes it
+ // simplifies code to be able to "fake" a result. Use carefully.
+ Result (ACE_Handler &handler,
+ ACE_HANDLE handle,
+ ACE_Message_Block &message_block,
+ u_long bytes_to_read,
+ const void* act,
+ u_long offset,
+ u_long offset_high,
+ ACE_HANDLE event);
+ // Constructor is protected since creation is limited to
+ // ACE_Asynch_Read_File factory.
+
+ virtual void complete (u_long bytes_transferred,
+ int success,
+ const void *completion_key,
+ u_long error = 0);
+ // ACE_Proactor will call this method when the read completes.
};
};
-// Forward declarations
-class ACE_Asynch_Write_File_Impl;
-class ACE_Asynch_Write_File_Result_Impl;
-
class ACE_Export ACE_Asynch_Write_File : public ACE_Asynch_Write_Stream
{
+public:
// = TITLE
- //
// This class is a factory for starting off asynchronous writes
- // on a file. This class forwards all methods to its
- // implementation class.
+ // on a file.
//
// = DESCRIPTION
- //
// Once <open> is called, multiple asynchronous <write>s can be
// started using this class. A ACE_Asynch_Write_File::Result
// will be passed back to the <handler> when the asynchronous
@@ -545,63 +449,23 @@ class ACE_Export ACE_Asynch_Write_File : public ACE_Asynch_Write_Stream
//
// This class differs slightly from ACE_Asynch_Write_Stream as
// it allows the user to specify an offset for the write.
-
-public:
- ACE_Asynch_Write_File (void);
- // A do nothing constructor.
-
- virtual ~ACE_Asynch_Write_File (void);
- // Destructor.
-
- int open (ACE_Handler &handler,
- ACE_HANDLE handle = ACE_INVALID_HANDLE,
- const void *completion_key = 0,
- ACE_Proactor *proactor = 0);
- // Initializes the factory with information which will be used with
- // each asynchronous call. If (<handle> == ACE_INVALID_HANDLE),
- // <ACE_Handler::handle> will be called on the <handler> to get the
- // correct handle.
-
int write (ACE_Message_Block &message_block,
u_long bytes_to_write,
u_long offset = 0,
u_long offset_high = 0,
- const void *act = 0,
- int priority = 0,
- int signal_number = ACE_SIGRTMIN);
+ const void *act = 0);
// This starts off an asynchronous write. Upto <bytes_to_write>
// will be write and stored in the <message_block>. The write will
- // start at <offset> from the beginning of the file. Priority of the
- // operation is specified by <priority>. On POSIX4-Unix, this is
- // supported. Works like <nice> in Unix. Negative values are not
- // allowed. 0 means priority of the operation same as the process
- // priority. 1 means priority of the operation is one less than
- // process. And so forth. On Win32, this is a no-op.
- // <signal_number> is the POSIX4 real-time signal number to be used
- // for the operation. <signal_number> ranges from ACE_SIGRTMIN to
- // ACE_SIGRTMAX. This argument is a no-op on non-POSIX4 systems.
-
- ACE_Asynch_Write_File_Impl *implementation (void) const;
- // Return the underlying implementation class.
-
-protected:
- void implementation (ACE_Asynch_Write_File_Impl *implementation);
- // Set the implementation.
-
- ACE_Asynch_Write_File_Impl *implementation_;
- // Implementation object.
+ // start at <offset> from the beginning of the file.
public:
class ACE_Export Result : public ACE_Asynch_Write_Stream::Result
{
// = TITLE
- //
// This is that class which will be passed back to the
- // <handler> when the asynchronous write completes. This class
- // forwards all the methods to the implementation class.
+ // <handler> when the asynchronous write completes.
//
// = DESCRIPTION
- //
// This class has all the information necessary for the
// <handler> to uniquiely identify the completion of the
// asynchronous write.
@@ -612,119 +476,91 @@ public:
// of <ACE_Handler::handle_write_stream>. No additional state
// is required by this class as ACE_Asynch_Result can store
// the <offset>.
-
- friend class ACE_POSIX_Asynch_Write_File_Result;
- friend class ACE_WIN32_Asynch_Write_File_Result;
- // The concrete implementation result classes only construct this
- // class.
-
- public:
- ACE_Asynch_Write_File_Result_Impl *implementation (void) const;
- // Get the implementation class.
-
- protected:
- Result (ACE_Asynch_Write_File_Result_Impl *implementation);
- // Constructor. This implementation will not be deleted.
- virtual ~Result (void);
- // Destructor.
+ friend class ACE_Asynch_Write_File;
+ // The factory has special privileges.
- ACE_Asynch_Write_File_Result_Impl *implementation_;
- // The implementation class.
+ // protected:
+ //
+ // These two should really be protected. But sometimes it
+ // simplifies code to be able to "fake" a result. Use carefully.
+ Result (ACE_Handler &handler,
+ ACE_HANDLE handle,
+ ACE_Message_Block &message_block,
+ u_long bytes_to_write,
+ const void* act,
+ u_long offset,
+ u_long offset_high,
+ ACE_HANDLE event);
+ // Constructor is protected since creation is limited to
+ // ACE_Asynch_Write_File factory.
+
+ virtual void complete (u_long bytes_transferred,
+ int success,
+ const void *completion_key,
+ u_long error = 0);
+ // ACE_Proactor will call this method when the write completes.
};
};
-// Forward declarations
-class ACE_Asynch_Accept_Result_Impl;
-class ACE_Asynch_Accept_Impl;
-
class ACE_Export ACE_Asynch_Accept : public ACE_Asynch_Operation
{
// = TITLE
- //
// This class is a factory for starting off asynchronous accepts
- // on a listen handle. This class forwards all methods to its
- // implementation class.
+ // on a listen handle.
//
// = DESCRIPTION
- //
// Once <open> is called, multiple asynchronous <accept>s can
// started using this class. A ACE_Asynch_Accept::Result will
// be passed back to the <handler> when the asynchronous accept
// completes through the <ACE_Handler::handle_accept>
// callback.
-
public:
ACE_Asynch_Accept (void);
// A do nothing constructor.
- virtual ~ACE_Asynch_Accept (void);
- // Destructor.
-
+#if defined (ACE_HAS_AIO_CALLS)
int open (ACE_Handler &handler,
ACE_HANDLE handle = ACE_INVALID_HANDLE,
const void *completion_key = 0,
ACE_Proactor *proactor = 0);
- // Initializes the factory with information which will be used with
- // each asynchronous call. If (<handle> == ACE_INVALID_HANDLE),
- // <ACE_Handler::handle> will be called on the <handler> to get the
- // correct handle.
-
+ // (We will also call base class's <open> from here).
+#endif /* ACE_HAS_AIO_CALLS */
+
int accept (ACE_Message_Block &message_block,
u_long bytes_to_read,
ACE_HANDLE accept_handle = ACE_INVALID_HANDLE,
- const void *act = 0,
- int priority = 0,
- int signal_number = ACE_SIGRTMIN);
+ const void *act = 0);
// This starts off an asynchronous accept. The asynchronous accept
// call also allows any initial data to be returned to the
// <handler>. Upto <bytes_to_read> will be read and stored in the
// <message_block>. The <accept_handle> will be used for the
// <accept> call. If (<accept_handle> == INVALID_HANDLE), a new
- // handle will be created. Priority of the
- // operation is specified by <priority>. On POSIX4-Unix, this is
- // supported. Works like <nice> in Unix. Negative values are not
- // allowed. 0 means priority of the operation same as the process
- // priority. 1 means priority of the operation is one less than
- // process. And so forth. On Win32, this is a no-op.
+ // handle will be created.
//
// <message_block> must be specified. This is because the address of
// the new connection is placed at the end of this buffer.
- // <signal_number> is the POSIX4 real-time signal number to be used
- // for the operation. <signal_number> ranges from ACE_SIGRTMIN to
- // ACE_SIGRTMAX. This argument is a no-op on non-POSIX4 systems.
-
- ACE_Asynch_Accept_Impl *implementation (void) const;
- // Return the underlying implementation class.
-
-protected:
- void implementation (ACE_Asynch_Accept_Impl *implementation);
- // Set the implementation class.
-
- ACE_Asynch_Accept_Impl *implementation_;
- // Delegation/implementation class that all methods will be
- // forwarded to.
public:
class ACE_Export Result : public ACE_Asynch_Result
{
// = TITLE
- //
// This is that class which will be passed back to the
// <handler> when the asynchronous accept completes.
//
// = DESCRIPTION
- //
// This class has all the information necessary for the
// <handler> to uniquiely identify the completion of the
// asynchronous accept.
-
- friend class ACE_POSIX_Asynch_Accept_Result;
- friend class ACE_WIN32_Asynch_Accept_Result;
- // The concrete implementation result classes only construct this
- // class.
-
public:
+ friend class ACE_Asynch_Accept;
+ // The factory has special privileges.
+
+#if defined (ACE_HAS_AIO_CALLS)
+ friend class ACE_Asynch_Accept_Handler;
+ // This factory does it all, so it needs spl privileges.
+#endif /* ACE_HAS_AIO_CALLS */
+
u_long bytes_to_read (void) const;
// The number of bytes which were requested at the start of the
// asynchronous accept.
@@ -738,34 +574,60 @@ public:
ACE_HANDLE accept_handle (void) const;
// I/O handle for the new connection.
- ACE_Asynch_Accept_Result_Impl *implementation (void) const;
- // Get the implementation.
-
+ // protected:
+ //
+ // These two should really be protected. But sometimes it
+ // simplifies code to be able to "fake" a result. Use carefully.
+ Result (ACE_Handler &handler,
+ ACE_HANDLE listen_handle,
+ ACE_HANDLE accept_handle,
+ ACE_Message_Block &message_block,
+ u_long bytes_to_read,
+ const void* act,
+ ACE_HANDLE event);
+ // Constructor is protected since creation is limited to
+ // ACE_Asynch_Accept factory.
+
+ virtual void complete (u_long bytes_transferred,
+ int success,
+ const void *completion_key,
+ u_long error = 0);
+ // ACE_Proactor will call this method when the accept completes.
+
protected:
- Result (ACE_Asynch_Accept_Result_Impl *implementation);
- // Contructor. Implementation will not be deleted.
-
- virtual ~Result (void);
- // Destructor.
-
- ACE_Asynch_Accept_Result_Impl *implementation_;
- // Impelmentation class.
+ u_long bytes_to_read_;
+ // Bytes requested when the asynchronous read was initiated.
+
+ ACE_Message_Block &message_block_;
+ // Message block for reading the data into.
+
+ ACE_HANDLE listen_handle_;
+ // I/O handle used for accepting new connections.
+
+ ACE_HANDLE accept_handle_;
+ // I/O handle for the new connection.
};
-};
-// Forward declarations
-class ACE_Asynch_Transmit_File_Result_Impl;
-class ACE_Asynch_Transmit_File_Impl;
+private:
+#if defined (ACE_HAS_AIO_CALLS)
+ static void* thread_function (void* reactor);
+ // The thread function that does handle events
+
+ ACE_Reactor reactor_;
+ // Reactor to wait on the <listen_handle>.
+
+ ACE_Asynch_Accept_Handler* accept_handler_;
+ // The Event Handler to do handle_input.
+#endif /* ACE_HAS_AIO_CALLS */
+};
class ACE_Export ACE_Asynch_Transmit_File : public ACE_Asynch_Operation
{
// = TITLE
- //
// This class is a factory for starting off asynchronous
// transmit files on a stream.
//
// = DESCRIPTION
- //
// Once <open> is called, multiple asynchronous <transmit_file>s
// can started using this class. A
// ACE_Asynch_Transmit_File::Result will be passed back to the
@@ -778,26 +640,13 @@ class ACE_Export ACE_Asynch_Transmit_File : public ACE_Asynch_Operation
// function provides high-performance file data transfer over
// network connections. This function would be of great use in
// a Web Server, Image Server, etc.
-
public:
- // Forward declarations
class Header_And_Trailer;
-
- ACE_Asynch_Transmit_File (void);
- // A do nothing constructor.
+ // Forward declaration.
- virtual ~ACE_Asynch_Transmit_File (void);
- // Destructor.
+ ACE_Asynch_Transmit_File (void);
+ // A "do-nothing" constructor.
- int open (ACE_Handler &handler,
- ACE_HANDLE handle = ACE_INVALID_HANDLE,
- const void *completion_key = 0,
- ACE_Proactor *proactor = 0);
- // Initializes the factory with information which will be used with
- // each asynchronous call. If (<handle> == ACE_INVALID_HANDLE),
- // <ACE_Handler::handle> will be called on the <handler> to get the
- // correct handle.
-
int transmit_file (ACE_HANDLE file,
Header_And_Trailer *header_and_trailer = 0,
u_long bytes_to_write = 0,
@@ -805,9 +654,7 @@ public:
u_long offset_high = 0,
u_long bytes_per_send = 0,
u_long flags = 0,
- const void *act = 0,
- int priority = 0,
- int signal_number = ACE_SIGRTMIN);
+ const void *act = 0);
// This starts off an asynchronous transmit file. The <file> is a
// handle to an open file. <header_and_trailer> is a pointer to a
// data structure that contains pointers to data to send before and
@@ -816,46 +663,23 @@ public:
// written to the <socket>. If you want to send the entire file,
// let <bytes_to_write> = 0. <bytes_per_send> is the size of each
// block of data sent per send operation. Please read the Win32
- // documentation on what the flags should be. Priority of the
- // operation is specified by <priority>. On POSIX4-Unix, this is
- // supported. Works like <nice> in Unix. Negative values are not
- // allowed. 0 means priority of the operation same as the process
- // priority. 1 means priority of the operation is one less than
- // process. And so forth. On Win32, this is a no-op.
- // <signal_number> is the POSIX4 real-time signal number to be used
- // for the operation. <signal_number> ranges from ACE_SIGRTMIN to
- // ACE_SIGRTMAX. This argument is a no-op on non-POSIX4 systems.
-
- ACE_Asynch_Transmit_File_Impl *implementation (void) const;
- // Return the underlying implementation class.
-
-protected:
- void implementation (ACE_Asynch_Transmit_File_Impl *);
- // Set the implementation.
-
- ACE_Asynch_Transmit_File_Impl *implementation_;
- // The implementation class.
+ // documentation on what the flags should be.
public:
class ACE_Export Result : public ACE_Asynch_Result
{
// = TITLE
- //
// This is that class which will be passed back to the
// <handler> when the asynchronous transmit file completes.
//
// = DESCRIPTION
- //
// This class has all the information necessary for the
// <handler> to uniquiely identify the completion of the
// asynchronous transmit file.
-
- friend class ACE_POSIX_Asynch_Transmit_File_Result;
- friend class ACE_WIN32_Asynch_Transmit_File_Result;
- // The concrete implementation result classes only construct this
- // class.
-
public:
+ friend class ACE_Asynch_Transmit_File;
+ // The factory has special privileges.
+
ACE_HANDLE socket (void) const;
// Socket used for transmitting the file.
@@ -864,53 +688,79 @@ public:
Header_And_Trailer *header_and_trailer (void) const;
// Header and trailer data associated with this transmit file.
-
+
u_long bytes_to_write (void) const;
// The number of bytes which were requested at the start of the
// asynchronous transmit file.
-
+
u_long bytes_per_send (void) const;
// Number of bytes per send requested at the start of the transmit
// file.
-
+
u_long flags (void) const;
// Flags which were passed into transmit file.
- ACE_Asynch_Transmit_File_Result_Impl *implementation (void) const;
- // Get the implementation class.
-
+ // protected:
+ //
+ // These two should really be protected. But sometimes it
+ // simplifies code to be able to "fake" a result. Use carefully.
+ Result (ACE_Handler &handler,
+ ACE_HANDLE socket,
+ ACE_HANDLE file,
+ Header_And_Trailer *header_and_trailer,
+ u_long bytes_to_write,
+ u_long offset,
+ u_long offset_high,
+ u_long bytes_per_send,
+ u_long flags,
+ const void *act,
+ ACE_HANDLE event);
+ // Constructor is protected since creation is limited to
+ // ACE_Asynch_Transmit_File factory.
+
+ virtual void complete (u_long bytes_transferred,
+ int success,
+ const void *completion_key,
+ u_long error = 0);
+ // ACE_Proactor will call this method when the write completes.
+
protected:
- Result (ACE_Asynch_Transmit_File_Result_Impl *implementation);
- // Constructor.
+ ACE_HANDLE socket_;
+ // Network I/O handle.
+
+ ACE_HANDLE file_;
+ // File I/O handle.
+
+ Header_And_Trailer *header_and_trailer_;
+ // Header and trailer data associated with this transmit file.
+
+ u_long bytes_to_write_;
+ // The number of bytes which were requested at the start of the
+ // asynchronous transmit file.
- virtual ~Result (void);
- // Destructor.
-
- ACE_Asynch_Transmit_File_Result_Impl *implementation_;
- // The implementation class.
+ u_long bytes_per_send_;
+ // Number of bytes per send requested at the start of the transmit
+ // file.
+
+ u_long flags_;
+ // Flags which were passed into transmit file.
};
class ACE_Export Header_And_Trailer
{
// = TITLE
- //
// The class defines a data structure that contains pointers
// to data to send before and after the file data is sent.
//
// = DESCRIPTION
- //
// This class provides a wrapper over TRANSMIT_FILE_BUFFERS
// and provided a consistent use of ACE_Message_Blocks.
-
public:
Header_And_Trailer (ACE_Message_Block *header = 0,
u_long header_bytes = 0,
ACE_Message_Block *trailer = 0,
u_long trailer_bytes = 0);
// Constructor.
-
- virtual ~Header_And_Trailer (void);
- // Destructor
void header_and_trailer (ACE_Message_Block *header = 0,
u_long header_bytes = 0,
@@ -958,14 +808,11 @@ public:
class ACE_Export ACE_Handler
{
// = TITLE
- //
// This base class defines the interface for receiving the
// results of asynchronous operations.
//
// = DESCRIPTION
- //
// Subclasses of this class will fill in appropriate methods.
-
public:
ACE_Handler (void);
// A do nothing constructor.
@@ -1002,12 +849,7 @@ public:
virtual void handle_time_out (const ACE_Time_Value &tv,
const void *act = 0);
// Called when timer expires. <tv> was the requested time value and
- // <act> is the ACT passed when scheduling the timer.
-
- virtual void handle_wakeup (void);
- // This is method works with the <run_event_loop> of the
- // ACE_Proactor. A special <Wake_Up_Completion> is used to wake up
- // all the threads that are blocking for completions.
+ // <act> is the ACT passed when scheduling the timer
ACE_Proactor *proactor (void);
// Get the proactor associated with this handler.
@@ -1019,37 +861,30 @@ public:
// Get the I/O handle used by this <handler>. This method will be
// called by the ACE_Asynch_* classes when an ACE_INVALID_HANDLE is
// passed to <open>.
-
protected:
ACE_Proactor *proactor_;
// The proactor associated with this handler.
};
-// Forward declarations
-class ACE_INET_Addr;
-
-// Forward declarations
+// Forward declartion
template <class HANDLER>
class ACE_Asynch_Acceptor;
class ACE_Export ACE_Service_Handler : public ACE_Handler
{
// = TITLE
- //
// This base class defines the interface for the
// ACE_Asynch_Acceptor to call into when new connection are
// accepted.
//
// = DESCRIPTION
- //
// Subclasses of this class will fill in appropriate methods to
// define application specific behavior.
-
+public:
friend class ACE_Asynch_Acceptor<ACE_Service_Handler>;
// The Acceptor is the factory and therefore should have special
// privileges.
-
-public:
+
ACE_Service_Handler (void);
// A do nothing constructor.