#include <Pipe.h>
Public Member Functions | |
| ACE_Pipe (void) | |
| Default constructor (does nothing...). | |
| ACE_Pipe (ACE_HANDLE handles[2]) | |
| Open the pipe and initialize the handles. | |
| ACE_Pipe (ACE_HANDLE read, ACE_HANDLE write) | |
| Initialize the ACE_Pipe from the read and write handles. | |
| ~ACE_Pipe (void) | |
| Default dtor. It doesn't close the handles for you. | |
| int | open (ACE_HANDLE handles[2]) |
| Open the pipe and initialize the handles. | |
| int | open (int buffer_size=ACE_DEFAULT_MAX_SOCKET_BUFSIZ) |
| Open the pipe, setting the buffer size to the maximum. | |
| int | close (void) |
| Close down the pipe HANDLEs;. | |
| ACE_HANDLE | read_handle (void) const |
| ACE_HANDLE | write_handle (void) const |
| void | dump (void) const |
| Dump the state of the object. | |
| ssize_t | send (const void *buf, size_t n) const |
| send upto bytes in . | |
| ssize_t | recv (void *buf, size_t n) const |
| Recv upto bytes in . | |
| ssize_t | send_n (const void *buf, size_t n) const |
| Send n bytes, keep trying until n are sent. | |
| ssize_t | send_n (const ACE_Message_Block *message_block, const ACE_Time_Value *timeout=0, size_t *bytes_transferred=0) |
| ssize_t | recv_n (void *buf, size_t n) const |
| Recv n bytes, keep trying until n are received. | |
| ssize_t | send (const iovec iov[], int n) const |
| Send iovecs via <::writev>. | |
| ssize_t | recv (iovec iov[], int n) const |
| Recv iovecs via <::readv>. | |
| ssize_t | send (size_t n,...) const |
| ssize_t | recv (size_t n,...) const |
| ssize_t | send (const void *buf, size_t n, ACE_OVERLAPPED *overlapped) const |
| Send bytes via Win32 WriteFile using overlapped I/O. | |
| ssize_t | recv (void *buf, size_t n, ACE_OVERLAPPED *overlapped) const |
| Recv bytes via Win32 ReadFile using overlapped I/O. | |
| ssize_t | sendv (const iovec iov[], int n) const |
| Send an of size to the file. | |
| ssize_t | sendv_n (const iovec iov[], int n) const |
| ssize_t | recvv_n (iovec iov[], int n) const |
| Receive an of size to the file. | |
Private Attributes | |
| ACE_HANDLE | handles_ [2] |
This class is designed to work with select()-based demuxers, such as the ACE_Select_Reactor, which is why it uses sockets on Windows rather than Win32 pipes (which aren't select()'able).
Definition at line 44 of file Pipe.h.
|
|
Default constructor (does nothing...).
Definition at line 206 of file Pipe.cpp. References ACE_TRACE.
|
|
|
Open the pipe and initialize the handles.
Definition at line 214 of file Pipe.cpp. References ACE_ERROR, ACE_LIB_TEXT, ACE_TRACE, LM_ERROR, and open().
|
|
||||||||||||
|
Initialize the ACE_Pipe from the read and write handles.
Definition at line 223 of file Pipe.cpp. References ACE_TRACE.
|
|
|
Default dtor. It doesn't close the handles for you.
Definition at line 11 of file Pipe.inl. References ACE_TRACE.
00012 {
00013 ACE_TRACE ("ACE_Pipe::~ACE_Pipe");
00014 // Notice that the destructor doesn't close the handles for you.
00015 }
|
|
|
Close down the pipe HANDLEs;.
Definition at line 232 of file Pipe.cpp. References ACE_TRACE, and ACE_OS::closesocket(). Referenced by ACE_Select_Reactor_Notify::close(), ACE_Dev_Poll_Reactor_Notify::close(), and open().
00233 {
00234 ACE_TRACE ("ACE_Pipe::close");
00235
00236 int result = 0;
00237
00238 // Note that the following will work even if we aren't closing down
00239 // sockets because <ACE_OS::closesocket> will just call <::close> in
00240 // that case!
00241
00242 if (this->handles_[0] != ACE_INVALID_HANDLE)
00243 result = ACE_OS::closesocket (this->handles_[0]);
00244 this->handles_[0] = ACE_INVALID_HANDLE;
00245
00246 if (this->handles_[1] != ACE_INVALID_HANDLE)
00247 result |= ACE_OS::closesocket (this->handles_[1]);
00248 this->handles_[1] = ACE_INVALID_HANDLE;
00249
00250 return result;
00251 }
|
|
|
Dump the state of the object.
Definition at line 25 of file Pipe.cpp. References ACE_BEGIN_DUMP, ACE_DEBUG, ACE_END_DUMP, ACE_LIB_TEXT, ACE_TRACE, and LM_DEBUG. Referenced by ACE_Select_Reactor_Notify::dump(), and ACE_Dev_Poll_Reactor_Notify::dump().
00026 {
00027 #if defined (ACE_HAS_DUMP)
00028 ACE_TRACE ("ACE_Pipe::dump");
00029 ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00030 ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("handles_[0] = %d"), this->handles_[0]));
00031 ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nhandles_[1] = %d"), this->handles_[1]));
00032 ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\n")));
00033 ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00034 #endif /* ACE_HAS_DUMP */
00035 }
|
|
|
Open the pipe, setting the buffer size to the maximum.
Definition at line 38 of file Pipe.cpp. References ACE_SOCK_Acceptor::accept(), ACE_ERROR_RETURN, ACE_IPPROTO_TCP, ACE_LIB_TEXT, ACE_LOCALHOST, ACE_TRACE, close(), ACE_SOCK_Acceptor::close(), ACE_SOCK_Stream::close(), ACE_SOCK_Connector::connect(), ENOTSUP, ACE_IPC_SAP::get_handle(), ACE_SOCK::get_local_addr(), ACE_INET_Addr::get_port_number(), ACE_OS::ioctl(), LM_ERROR, ACE_SOCK_Acceptor::open(), ACE_OS::pipe(), ACE_SOCK::set_option(), ACE_OS::setsockopt(), and ACE_OS::socketpair().
00039 {
00040 ACE_TRACE ("ACE_Pipe::open");
00041
00042 #if defined (ACE_LACKS_SOCKETPAIR) || defined (__Lynx__)
00043 ACE_INET_Addr my_addr;
00044 ACE_SOCK_Acceptor acceptor;
00045 ACE_SOCK_Connector connector;
00046 ACE_SOCK_Stream reader;
00047 ACE_SOCK_Stream writer;
00048 int result = 0;
00049 # if defined (ACE_WIN32)
00050 ACE_INET_Addr local_any (static_cast<u_short> (0), ACE_LOCALHOST);
00051 # else
00052 ACE_Addr local_any = ACE_Addr::sap_any;
00053 # endif /* ACE_WIN32 */
00054
00055 // Bind listener to any port and then find out what the port was.
00056 if (acceptor.open (local_any) == -1
00057 || acceptor.get_local_addr (my_addr) == -1)
00058 result = -1;
00059 else
00060 {
00061 ACE_INET_Addr sv_addr (my_addr.get_port_number (),
00062 ACE_LOCALHOST);
00063
00064 // Establish a connection within the same process.
00065 if (connector.connect (writer, sv_addr) == -1)
00066 result = -1;
00067 else if (acceptor.accept (reader) == -1)
00068 {
00069 writer.close ();
00070 result = -1;
00071 }
00072 }
00073
00074 // Close down the acceptor endpoint since we don't need it anymore.
00075 acceptor.close ();
00076 if (result == -1)
00077 return -1;
00078
00079 this->handles_[0] = reader.get_handle ();
00080 this->handles_[1] = writer.get_handle ();
00081
00082 # if !defined (ACE_LACKS_TCP_NODELAY)
00083 int one = 1;
00084
00085 // Make sure that the TCP stack doesn't try to buffer small writes.
00086 // Since this communication is purely local to the host it doesn't
00087 // affect network performance.
00088
00089 if (writer.set_option (ACE_IPPROTO_TCP,
00090 TCP_NODELAY,
00091 &one,
00092 sizeof one) == -1)
00093 {
00094 this->close ();
00095 return -1;
00096 }
00097 # endif /* ! ACE_LACKS_TCP_NODELAY */
00098
00099 # if defined (ACE_LACKS_SOCKET_BUFSIZ)
00100 ACE_UNUSED_ARG (buffer_size);
00101 # else /* ! ACE_LACKS_SOCKET_BUFSIZ */
00102 if (reader.set_option (SOL_SOCKET,
00103 SO_RCVBUF,
00104 reinterpret_cast <void *> (&buffer_size),
00105 sizeof (buffer_size)) == -1
00106 && errno != ENOTSUP)
00107 {
00108 this->close ();
00109 return -1;
00110 }
00111 else if (writer.set_option (SOL_SOCKET,
00112 SO_SNDBUF,
00113 reinterpret_cast <void *> (&buffer_size),
00114 sizeof (buffer_size)) == -1
00115 && errno != ENOTSUP)
00116 {
00117 this->close ();
00118 return -1;
00119 }
00120 # endif /* ! ACE_LACKS_SOCKET_BUFSIZ */
00121
00122 #elif defined (ACE_HAS_STREAM_PIPES) || defined (__QNX__)
00123 ACE_UNUSED_ARG (buffer_size);
00124 if (ACE_OS::pipe (this->handles_) == -1)
00125 ACE_ERROR_RETURN ((LM_ERROR,
00126 ACE_LIB_TEXT ("%p\n"),
00127 ACE_LIB_TEXT ("pipe")),
00128 -1);
00129
00130 #if !defined(__QNX__)
00131 int arg = RMSGN;
00132
00133 // Enable "msg no discard" mode, which ensures that record
00134 // boundaries are maintained when messages are sent and received.
00135 if (ACE_OS::ioctl (this->handles_[0],
00136 I_SRDOPT,
00137 (void *) arg) == -1
00138 || ACE_OS::ioctl (this->handles_[1],
00139 I_SRDOPT,
00140 (void *) arg) == -1)
00141 {
00142 this->close ();
00143 ACE_ERROR_RETURN ((LM_ERROR,
00144 ACE_LIB_TEXT ("%p\n"),
00145 ACE_LIB_TEXT ("ioctl")), -1);
00146 }
00147 #endif /* __QNX__ */
00148
00149 #else /* ! ACE_LACKS_SOCKETPAIR && ! ACE_HAS_STREAM_PIPES */
00150 if (ACE_OS::socketpair (AF_UNIX,
00151 SOCK_STREAM,
00152 0,
00153 this->handles_) == -1)
00154 ACE_ERROR_RETURN ((LM_ERROR,
00155 ACE_LIB_TEXT ("%p\n"),
00156 ACE_LIB_TEXT ("socketpair")),
00157 -1);
00158 # if defined (ACE_LACKS_SOCKET_BUFSIZ)
00159 ACE_UNUSED_ARG (buffer_size);
00160 # else /* ! ACE_LACKS_SOCKET_BUFSIZ */
00161 if (ACE_OS::setsockopt (this->handles_[0],
00162 SOL_SOCKET,
00163 SO_RCVBUF,
00164 reinterpret_cast <const char *> (&buffer_size),
00165 sizeof (buffer_size)) == -1
00166 && errno != ENOTSUP)
00167 {
00168 this->close ();
00169 return -1;
00170 }
00171 if (ACE_OS::setsockopt (this->handles_[1],
00172 SOL_SOCKET,
00173 SO_SNDBUF,
00174 reinterpret_cast <const char *> (&buffer_size),
00175 sizeof (buffer_size)) == -1
00176 && errno != ENOTSUP)
00177 {
00178 this->close ();
00179 return -1;
00180 }
00181 # endif /* ! ACE_LACKS_SOCKET_BUFSIZ */
00182 #endif /* ! ACE_LACKS_SOCKETPAIR && ! ACE_HAS_STREAM_PIPES */
00183 // Point both the read and write HANDLES to the appropriate socket
00184 // HANDLEs.
00185
00186 return 0;
00187 }
|
|
|
Open the pipe and initialize the handles.
Definition at line 190 of file Pipe.cpp. References ACE_TRACE. Referenced by ACE_AIOCB_Notify_Pipe_Manager::ACE_AIOCB_Notify_Pipe_Manager(), ACE_Pipe(), ACE_Select_Reactor_Notify::open(), and ACE_Dev_Poll_Reactor_Notify::open().
|
|
|
This is the "read" side of the pipe. Note, however, that processes can also write to this handle as well since pipes are bi-directional. Definition at line 18 of file Pipe.inl. References ACE_TRACE. Referenced by ACE_AIOCB_Notify_Pipe_Manager::ACE_AIOCB_Notify_Pipe_Manager(), ACE_Select_Reactor_Notify::dispatch_notifications(), ACE_Dev_Poll_Reactor_Notify::dispatch_notifications(), ACE_Select_Reactor_Notify::notify_handle(), ACE_Dev_Poll_Reactor_Notify::notify_handle(), ACE_Select_Reactor_Notify::open(), and ACE_AIOCB_Notify_Pipe_Manager::~ACE_AIOCB_Notify_Pipe_Manager().
|
|
||||||||||||||||
|
Recv bytes via Win32 ReadFile using overlapped I/O.
Definition at line 180 of file Pipe.inl. References ACE_OVERLAPPED, ACE_TRACE, and ACE_OS::read().
00182 {
00183 ACE_TRACE ("ACE_Pipe::recv");
00184 return ACE_OS::read (this->read_handle (), static_cast <char *> (buf), n,
00185 overlapped);
00186 }
|
|
||||||||||||
|
This is an interface to ::readv, that doesn't use the struct iovec explicitly. The ... can be passed as an arbitrary number of (char *ptr, int len) tuples. However, the count N is the *total* number of trailing arguments, *not* a couple of the number of tuple pairs! Definition at line 305 of file Pipe.cpp. References ACE_NEW_RETURN, ACE_TRACE, iovec::iov_base, iovec::iov_len, ACE_OS::readv(), ACE::recvv(), and ssize_t.
00306 {
00307 ACE_TRACE ("ACE_Pipe::recv");
00308 va_list argp;
00309 size_t total_tuples = n / 2;
00310 iovec *iovp;
00311 #if defined (ACE_HAS_ALLOCA)
00312 iovp = (iovec *) alloca (total_tuples * sizeof (iovec));
00313 #else
00314 ACE_NEW_RETURN (iovp,
00315 iovec[total_tuples],
00316 -1);
00317 #endif /* !defined (ACE_HAS_ALLOCA) */
00318
00319 va_start (argp, n);
00320
00321 for (size_t i = 0; i < total_tuples; i++)
00322 {
00323 iovp[i].iov_base = va_arg (argp, char *);
00324 iovp[i].iov_len = va_arg (argp, int);
00325 }
00326
00327 #if defined (ACE_WIN32)
00328 ssize_t result = ACE::recvv (this->read_handle (),
00329 iovp,
00330 total_tuples);
00331 #else
00332 ssize_t result = ACE_OS::readv (this->read_handle (),
00333 iovp,
00334 total_tuples);
00335 #endif /* ACE_WIN32 */
00336
00337 #if !defined (ACE_HAS_ALLOCA)
00338 delete [] iovp;
00339 #endif /* !defined (ACE_HAS_ALLOCA) */
00340 va_end (argp);
00341 return result;
00342 }
|
|
||||||||||||
|
Recv iovecs via <::readv>.
Definition at line 159 of file Pipe.inl. References ACE_TRACE, ACE_OS::readv(), and ACE_OS::recvv().
00160 {
00161 ACE_TRACE ("ACE_Pipe::recv");
00162 #if defined (ACE_WIN32)
00163 return ACE_OS::recvv (this->read_handle (), iov, n);
00164 #else
00165 return ACE_OS::readv (this->read_handle (), iov, n);
00166 #endif /* ACE_WIN32 */
00167 }
|
|
||||||||||||
|
Recv upto bytes in .
Definition at line 137 of file Pipe.inl. References ACE_TRACE, ACE_OS::read(), and ACE_OS::recv().
00138 {
00139 ACE_TRACE ("ACE_Pipe::recv");
00140 #if defined (ACE_WIN32)
00141 return ACE_OS::recv (this->read_handle (), static_cast <char *> (buf), n);
00142 #else
00143 return ACE_OS::read (this->read_handle (), static_cast <char *> (buf), n);
00144 #endif /* ACE_WIN32 */
00145 }
|
|
||||||||||||
|
Recv n bytes, keep trying until n are received.
Definition at line 115 of file Pipe.inl. References ACE_TRACE, ACE::read_n(), and ACE::recv_n().
00116 {
00117 ACE_TRACE ("ACE_Pipe::recv_n");
00118 #if defined (ACE_WIN32)
00119 return ACE::recv_n (this->read_handle (), buf, n);
00120 #else
00121 return ACE::read_n (this->read_handle (), buf, n);
00122 #endif /* ACE_WIN32 */
00123 }
|
|
||||||||||||
|
Receive an of size to the file.
Definition at line 68 of file Pipe.inl. References ACE_TRACE, ACE_OS::readv(), and ACE_OS::sendv().
00069 {
00070 ACE_TRACE ("ACE_Pipe::recvv_n");
00071 // @@ Carlos, can you please update this to call the
00072 // new ACE::recvv_n() method that you write?
00073 #if defined (ACE_WIN32)
00074 return ACE_OS::sendv (this->read_handle (),
00075 iov,
00076 n);
00077 #else
00078 return ACE_OS::readv (this->read_handle (),
00079 iov,
00080 n);
00081 #endif /* ACE_WIN32 */
00082 }
|
|
||||||||||||||||
|
Send bytes via Win32 WriteFile using overlapped I/O.
Definition at line 170 of file Pipe.inl. References ACE_OVERLAPPED, ACE_TRACE, and ACE_OS::write().
00172 {
00173 ACE_TRACE ("ACE_Pipe::send");
00174 return ACE_OS::write (this->write_handle (),
00175 static_cast <const char *> (buf), n,
00176 overlapped);
00177 }
|
|
||||||||||||
|
Send N char *ptrs and int lengths. Note that the char *'s precede the ints (basically, an varargs version of writev). The count N is the *total* number of trailing arguments, *not* a couple of the number of tuple pairs! Definition at line 259 of file Pipe.cpp. References ACE_NEW_RETURN, ACE_TRACE, iovec::iov_base, iovec::iov_len, ACE::sendv(), ssize_t, and ACE_OS::writev().
00260 {
00261 ACE_TRACE ("ACE_Pipe::send");
00262 va_list argp;
00263 size_t total_tuples = n / 2;
00264 iovec *iovp;
00265 #if defined (ACE_HAS_ALLOCA)
00266 iovp = (iovec *) alloca (total_tuples * sizeof (iovec));
00267 #else
00268 ACE_NEW_RETURN (iovp,
00269 iovec[total_tuples],
00270 -1);
00271 #endif /* !defined (ACE_HAS_ALLOCA) */
00272
00273 va_start (argp, n);
00274
00275 for (size_t i = 0; i < total_tuples; i++)
00276 {
00277 iovp[i].iov_base = va_arg (argp, char *);
00278 iovp[i].iov_len = va_arg (argp, int);
00279 }
00280
00281 #if defined (ACE_WIN32)
00282 ssize_t result = ACE::sendv (this->write_handle (),
00283 iovp,
00284 total_tuples);
00285 #else
00286 ssize_t result = ACE_OS::writev (this->write_handle (),
00287 iovp,
00288 total_tuples);
00289 #endif /* ACE_WIN32 */
00290
00291 #if !defined (ACE_HAS_ALLOCA)
00292 delete [] iovp;
00293 #endif /* !defined (ACE_HAS_ALLOCA) */
00294 va_end (argp);
00295 return result;
00296 }
|
|
||||||||||||
|
Send iovecs via <::writev>.
Definition at line 148 of file Pipe.inl. References ACE_TRACE, ACE_OS::sendv(), and ACE_OS::writev().
00149 {
00150 ACE_TRACE ("ACE_Pipe::send");
00151 #if defined (ACE_WIN32)
00152 return ACE_OS::sendv (this->write_handle (), iov, n);
00153 #else
00154 return ACE_OS::writev (this->write_handle (), iov, n);
00155 #endif /* ACE_WIN32 */
00156 }
|
|
||||||||||||
|
send upto bytes in .
Definition at line 126 of file Pipe.inl. References ACE_TRACE, ACE_OS::send(), and ACE_OS::write().
00127 {
00128 ACE_TRACE ("ACE_Pipe::send");
00129 #if defined (ACE_WIN32)
00130 return ACE_OS::send (this->write_handle (), static_cast <const char *> (buf), n);
00131 #else
00132 return ACE_OS::write (this->write_handle (), static_cast <const char *> (buf), n);
00133 #endif /* ACE_WIN32 */
00134 }
|
|
||||||||||||||||
|
Send all the s chained through their and pointers. This call uses the underlying OS gather-write operation to reduce the domain-crossing penalty. Definition at line 47 of file Pipe.inl. References ACE_TRACE, ACE::send_n(), and ACE::write_n().
00050 {
00051 ACE_TRACE ("ACE_Pipe::send_n");
00052 #if defined (ACE_WIN32)
00053 return ACE::send_n (this->write_handle (),
00054 message_block,
00055 timeout,
00056 bytes_transferred);
00057 #else
00058 ACE_UNUSED_ARG (timeout);
00059 return ACE::write_n (this->write_handle (),
00060 message_block,
00061 bytes_transferred);
00062 #endif /* ACE_WIN32 */
00063 }
|
|
||||||||||||
|
Send n bytes, keep trying until n are sent.
Definition at line 101 of file Pipe.inl. References ACE_TRACE, ACE::send_n(), and ACE::write_n().
00102 {
00103 ACE_TRACE ("ACE_Pipe::send_n");
00104 #if defined (ACE_WIN32)
00105 return ACE::send_n (this->write_handle (), buf, n);
00106 #else
00107 return ACE::write_n (this->write_handle (), buf, n);
00108 #endif /* ACE_WIN32 */
00109 }
|
|
||||||||||||
|
Send an of size to the file.
Definition at line 87 of file Pipe.inl. References ACE_TRACE, ACE_OS::sendv(), and ACE_OS::writev().
00088 {
00089 ACE_TRACE ("ACE_Pipe::sendv");
00090 #if defined (ACE_WIN32)
00091 return ACE_OS::sendv (this->write_handle (), iov, n);
00092 #else
00093 return ACE_OS::writev (this->write_handle (), iov, n);
00094 #endif /* ACE_WIN32 */
00095 }
|
|
||||||||||||
|
Send an of size to the file. Will block until all bytes are sent or an error occurs. Definition at line 32 of file Pipe.inl. References ACE_TRACE, ACE::sendv_n(), and ACE::writev_n().
00033 {
00034 ACE_TRACE ("ACE_Pipe::sendv_n");
00035 #if defined (ACE_WIN32)
00036 return ACE::sendv_n (this->write_handle (),
00037 iov,
00038 n);
00039 #else
00040 return ACE::writev_n (this->write_handle (),
00041 iov,
00042 n);
00043 #endif /* ACE_WIN32 */
00044 }
|
|
|
This is the "write" side of the pipe. Note, however, that processes can also read to this handle as well since pipes are bi-directional. Definition at line 25 of file Pipe.inl. References ACE_TRACE. Referenced by ACE_AIOCB_Notify_Pipe_Manager::~ACE_AIOCB_Notify_Pipe_Manager().
|
|
|
|
1.3.6