The shared memory transport uses ACE_SOCK_* class to implement the signaling mechanism so we can easily use the new mechanism with the Reactor pattern (which uses select under the hood.)
ACE_MEM_Acceptor and ACE_MEM_Connector are used to establish connections. When a connection is established, ACE_MEM_Acceptor creates the MMAP file for data exchange and sends the location of the file (complete path name) to ACE_MEM_Connector thru the socket. ACE_MEM_Connector then reads the location of the file off the socket and opens up the same MMAP file. ACE_MEM_Stream at each side then contains a reference to the ACE_Mallo object using the same MMAP file.
When sending information using methods provided in this class, ACE_MEM_IO requests a chunk of memory from the MALLOC_TYPE object, copy the data into the shared memory and send the memory offset (from the start of the ACE_Malloc) across the socket. This action also servers as a signal to the other end. The receiving side then reverses the procedures and copies the information into user buffer.
#include <ace/MEM_IO.h>
class ACE_MEM_IO : public ACE_SOCK, public ACE_MEM_SAP {
public:
ACE_MEM_IO (void);
~ACE_MEM_IO (void);
ssize_t send (const void *buf, size_t n, int flags);
ssize_t recv (void *buf, size_t n, int flags);
ssize_t send (const void *buf, size_t n);
ssize_t recv (void *buf, size_t n);
ssize_t send ( const void *buf, size_t n, int flags, const ACE_Time_Value *timeout );
ssize_t recv ( void *buf, size_t n, int flags, const ACE_Time_Value *timeout );
ssize_t send ( const void *buf, size_t n, const ACE_Time_Value *timeout );
ssize_t recv (void *buf, size_t n, const ACE_Time_Value *timeout);
ssize_t send ( const ACE_Message_Block *message_block, const ACE_Time_Value *timeout );
void dump (void) const;
ACE_ALLOC_HOOK_DECLARE;
/* int get_local_port (u_short &) const;
int get_remote_port (u_short &) const;
protected:
ssize_t fetch_recv_buf ( int flags, const ACE_Time_Value *timeout = 0 );
private:
void *recv_buffer_;
ssize_t buf_size_;
ssize_t cur_offset_;
};
ACE_MEM_IO (void);
~ACE_MEM_IO (void);
ssize_t send (const void *buf, size_t n, int flags);
n
byte buffer to the other process using shm_malloc_
connected thru the socket.
ssize_t recv (void *buf, size_t n, int flags);
n
byte buffer from the shm_malloc_ thru connected socket.
ssize_t send (const void *buf, size_t n);
n
byte buffer to the other process using shm_malloc_
connected thru the socket.
ssize_t recv (void *buf, size_t n);
n
byte buffer from the shm_malloc_ thru connected socket.
ssize_t send (
const void *buf,
size_t n,
int flags,
const ACE_Time_Value *timeout
);
timeout
amount of time to send up to n
bytes into
buf
from handle
(uses the send
call). If send
times out
a -1 is returned with errno == ETIME
. If it succeeds the
number of bytes sent is returned.
ssize_t recv (
void *buf,
size_t n,
int flags,
const ACE_Time_Value *timeout
);
timeout
amount of time to receive up to n
bytes
into buf
from handle
(uses the recv
call). If recv
times
out a -1 is returned with errno == ETIME
. If it succeeds the
number of bytes received is returned.
ssize_t send (
const void *buf,
size_t n,
const ACE_Time_Value *timeout
);
timeout
amount of time to send up to n
bytes into
buf
from handle
(uses the send
call). If send
times out
a -1 is returned with errno == ETIME
. If it succeeds the
number of bytes sent is returned.
ssize_t recv (void *buf, size_t n, const ACE_Time_Value *timeout);
timeout
amount of time to receive up to n
bytes
into buf
from handle
(uses the recv
call). If recv
times
out a -1 is returned with errno == ETIME
. If it succeeds the
number of bytes received is returned.
ssize_t send (
const ACE_Message_Block *message_block,
const ACE_Time_Value *timeout
);
timeout
amount of time to send the message_block
.
If send
times out a -1 is returned with errno == ETIME
. If
it succeeds the number of bytes sent is returned.
void dump (void) const;
ACE_ALLOC_HOOK_DECLARE;
/* int get_local_port (u_short &) const;
int get_remote_port (u_short &) const;
nanbor@cs.wustl.edu